{"openapi":"3.1.0","info":{"title":"Brubru EU Data API","description":"Public paid REST surface for the Brubru Data Provider, organised by EU institution (Parliament, Commission, Council, European Council, Eurogroup) plus legislative, funding, open-data and proprietary collections. Authentication via the X-API-Key header (Professional subscription required). 60 req/min soft rate limit per key.","version":"v2"},"servers":[{"url":"https://brubru-production.up.railway.app","description":"Current host"}],"paths":{"/api/v2/legislative/eur-lex/laws/resolve":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Resolve any identifier to the canonical CELEX + ELI","description":"**What it does**\nAccepts any EU identifier — a CELEX, an ELI URI, an ECLI, a COM/OJ reference, an OEIL procedure reference, or a law nickname (GDPR, DSA, AI Act) — and normalises it to the canonical CELEX + ELI, with the recognised type and the matching Brubru endpoint. The productised join key: one identifier in, every other name out.\n\n**When to use it**\nWhen you hold one identifier and need the others, or before calling any CELEX-keyed endpoint with an input of unknown shape. Pairs with `/laws/{celex}/xref` for the full relationship graph.\n\n**Input**\n- `id` — the identifier or nickname (e.g. `GDPR`, `32016R0679`, `2021/0106(COD)`).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/resolve?id=GDPR\nGET /api/v2/legislative/eur-lex/laws/resolve?id=2021/0106(COD)\n```\n\n**You get back**\nA `ResolveResult` with `input`, `recognised_kind`, `resolved_via` (celex/eli/alias/oeil), `celex`, `eli`, `title`, `in_force`, `canonical_url`, `brubru_url`. HTTP 422 (`reason_code: unresolved_identifier`) when nothing matches.\n\n**Data freshness**\nLive: pattern recognition + alias dictionary + one Cellar lookup for the ELI (cached to law_xref).","operationId":"resolve_identifier_api_v2_legislative_eur_lex_laws_resolve_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Any EU identifier or law nickname","title":"Id"},"description":"Any EU identifier or law nickname","example":"GDPR"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/summaries":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Browse / search the LEGISSUM plain-language summaries of EU legislation","description":"**What it does**\nSearches the LEGISSUM corpus — the Publications Office's plain-language \"Summaries of EU legislation\" that explain a directive or regulation in accessible prose. Returns matching summaries with the underlying CELEX and the EUR-Lex LSU view URL.\n\n**When to use it**\nWhen you want the human-readable summary of a law rather than its legal text — ideal for grounding a chatbot answer or briefing a non-lawyer.\n\n**Input**\n- `q` — free-text search over summary titles (optional).\n- `limit` (1-200, default 50).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/summaries?q=data%20protection\n```\n\n**You get back**\nA `PaginatedResponse[SummaryItem]` (`summary_id` = slug, `celex`, `title`, `lsu_url`). Backed by the harvested LEGISSUM catalogue (`public.legissum_summaries`).\n\n**Data freshness**\nRead from the LEGISSUM catalogue harvested from EUR-Lex (sync via `scripts/sync_legissum.py`). Empty only until the first sync runs.","operationId":"list_summaries_api_v2_legislative_eur_lex_laws_summaries_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over summary titles","title":"Q"},"description":"Free-text search over summary titles"},{"name":"chapter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by chapter code (e.g. 03) or chapter title substring","title":"Chapter"},"description":"Filter by chapter code (e.g. 03) or chapter title substring"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SummaryItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/summaries/{summary_id}":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"One LEGISSUM summary by its identifier","description":"**What it does**\nReturns one plain-language summary record. If the id is a CELEX, builds the EUR-Lex LSU view URL and resolves the title from Cellar; otherwise treats the id as a LEGISSUM reference.\n\n**When to use it**\nAfter `/laws/summaries` (or when you already hold a CELEX) to get the direct LSU link + title.\n\n**Input**\n- `summary_id` (path) — a CELEX (e.g. `32016R0679`) or a LEGISSUM reference.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/summaries/32016R0679\n```\n\n**You get back**\nA `SummaryItem` with `summary_id`, `celex`, `title`, `lsu_url`, `public_url`.\n\n**Data freshness**\nLive: URL construction + an optional Cellar title lookup for CELEX ids.","operationId":"get_summary_api_v2_legislative_eur_lex_laws_summaries__summary_id__get","parameters":[{"name":"summary_id","in":"path","required":true,"schema":{"type":"string","title":"Summary Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Search adopted EU legislation — 8,710 distinct laws across 28,513 OJ publications","description":"**What it does**\nFull-text search over Brubru's mirror of adopted EU legislation (the LEG_2025-11 Publications Office bulk export — 8,710 distinct laws across 28,513 Official Journal publications). Each row carries the CELEX legal identifier, document type, title + subject matter, policy area, publication date, and the EUR-Lex canonical URL.\n\n**When to use it**\nTo find specific acts (\"the AI Act\"), enumerate laws by topic, or feed a partner integration the live adopted-legislation corpus. Pair with `/api/v2/legislative/eur-lex/laws/{celex}/text` for the full body. For procedures still in negotiation, use the Legislative Observatory source at `/api/v2/legislative/oeil/procedures`.\n\n**Input**\n- `q` — full-text search on title + subject matter (PostgreSQL TSVECTOR).\n- `celex` — exact match on the legal identifier.\n- `doc_type` — `regulation` / `directive` / `decision` / `recommendation` / `opinion` / ...\n- `policy_area` — single policy tag.\n- `published_from`, `published_to` — adoption-date bounds (YYYY-MM-DD).\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws?q=AI%20Act&limit=10\nGET /api/v2/legislative/eur-lex/laws?doc_type=regulation&policy_area=environment&published_from=2024-01-01\n```\n\n**You get back**\nA `PaginatedResponse[LawItem]` envelope. Each item carries `celex`, `title`, `doc_type`, `adopted_on`, `oj_reference`, `policy_area`, `legal_basis[]`, `eurlex_url`, `text_url`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) from EUR-Lex RSS feeds + Cellar SPARQL sector-3.","operationId":"list_laws_api_v2_legislative_eur_lex_laws_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Full-text search (title + subject matter)","title":"Q"},"description":"Full-text search (title + subject matter)"},{"name":"celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact CELEX filter","title":"Celex"},"description":"Exact CELEX filter"},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Document type (regulation, directive, decision, ...)","title":"Doc Type"},"description":"Document type (regulation, directive, decision, ...)"},{"name":"policy_area","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Policy area slug","title":"Policy Area"},"description":"Policy area slug"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Adoption date >= value (YYYY-MM-DD)","title":"Published From"},"description":"Adoption date >= value (YYYY-MM-DD)"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Adoption date <= value (YYYY-MM-DD). Preferred name.","title":"Published To"},"description":"Adoption date <= value (YYYY-MM-DD). Preferred name."},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Alias of published_to (GovClipping-compatible). 422 if it conflicts.","title":"Published End"},"description":"Alias of published_to (GovClipping-compatible). 422 if it conflicts."},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync lower bound (updated_at >= value).","title":"Updated From"},"description":"Incremental sync lower bound (updated_at >= value)."},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync upper bound (updated_at <= value).","title":"Updated To"},"description":"Incremental sync upper bound (updated_at <= value)."},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Alias of updated_to (GovClipping-compatible).","title":"Updated End"},"description":"Alias of updated_to (GovClipping-compatible)."},{"name":"include_orphans","in":"query","required":false,"schema":{"type":"boolean","description":"Include rows with no CELEX (orphaned annexes). Default false.","default":false,"title":"Include Orphans"},"description":"Include rows with no CELEX (orphaned annexes). Default false."},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Inline each row's full body (Cellar XHTML). Caps the page to 10 to bound latency. Default false — call /laws/{celex}/text for a single body.","default":false,"title":"Include Body"},"description":"Inline each row's full body (Cellar XHTML). Caps the page to 10 to bound latency. Default false — call /laws/{celex}/text for a single body."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_LawItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Look up one adopted EU law by its legal identifier — metadata only (no body)","description":"**What it does**\nReturns the bibliographic metadata for one adopted EU law identified by its CELEX (the EU's stable legal identifier — e.g. `32024R1689` for the AI Act): title, document type, adoption date, OJ reference, policy area, legal-basis array, EUR-Lex URL, and a relative URL to the text endpoint.\n\n**When to use it**\nWhen you only need bibliographic fields and not the full body — faster than `/{celex}/text` because it doesn't fetch the body. Pair with `/api/v2/legislative/eur-lex/laws/{celex}/text` for the actual legal text.\n\n**Input**\n- `celex` (path) — the EU legal identifier. Case-insensitive; uppercased internally. Format: 5 digits + 1-2 letters + 4 digits (e.g. `32024R1689`, `52026PC0321`).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32024R1689\nGET /api/v2/legislative/eur-lex/laws/32016R0679\n```\n\n**You get back**\nA `LawItem` with `celex`, `title`, `doc_type`, `adopted_on`, `oj_reference`, `policy_area`, `legal_basis[]`, `eurlex_url`, `text_url`, plus the 5 envelope-level datapoints. HTTP 404 with `reason_code: not_found` if the CELEX isn't in our mirror.\n\n**Data freshness**\nSynced every 6 hours (hot tier) from EUR-Lex RSS feeds + Cellar SPARQL sector-3.","operationId":"get_law_detail_api_v2_legislative_eur_lex_laws__celex__get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LawItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/text":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Full text of one adopted EU law — plain text or raw XML","description":"**What it does**\nReturns the full legal text of an adopted EU law identified by its CELEX. Tries the local Formex V4 XML cache first (28,513 files from the LEG_2025-11 bulk export); falls back to a live Cellar fetch (`publications.europa.eu/resource/celex/{celex}`). Returns the body as whitespace-normalised plain text (default) or raw markup.\n\n**When to use it**\nWhen you need the actual legal text — for citation, full-text analysis, or feeding a downstream LLM context. For pre-parsed structured access (recital -> article mapping, definition extraction) use the legal-text endpoints under this same source.\n\n**Input**\n- `celex` (path) — EU legal identifier (case-insensitive).\n- `format` — `plain` (default) or `xml` (raw Formex markup).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32024R1689/text\nGET /api/v2/legislative/eur-lex/laws/32016R0679/text?format=xml\n```\n\n**You get back**\nA `LawTextResponse` with `celex`, `title`, `doc_type`, `adopted_on`, `format`, `content`, `content_length`, `eurlex_url`, plus the 5 envelope-level datapoints (`body_txt` mirrors `content` when format=plain, `body_html` when format=xml).\n\n**Data freshness**\nLive pass-through; the local Formex cache is regenerated quarterly from the LEG_YYYY-MM bulk export. Once an act is published in the OJ its text doesn't change (only consolidations get new CELEX numbers).","operationId":"get_law_text_api_v2_legislative_eur_lex_laws__celex__text_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(plain|xml)$","default":"plain","title":"Format"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LawTextResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/recital-article-map":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Recital-to-article semantic mapping — which recitals explain each article","description":"**What it does**\nFor a given EU law, returns a mapping of each article to its top-3 most semantically related recitals, computed via TF-IDF cosine similarity over the act's preamble + body. Jump from \"article 22\" to the recitals that explain the drafter's intent.\n\n**When to use it**\nWhen interpreting a specific article and you need its explanatory recitals automatically — especially for GDPR / DSA / AI Act, where the preamble runs to hundreds of recitals.\n\n**Input**\n- `celex` (path) — legal identifier.\n- `force_recompute` (query, default false) — local dev only; bypass the cache.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32025R2149/recital-article-map\n```\n\n**You get back**\nA `RecitalArticleMapResponse` with `celex`, `map` (article -> [recital, score] list), `public_url`, `creation_date`. HTTP 404 (`reason_code: not_found`) when the cache hasn't been computed for this CELEX (Formex XML is not deployed to production — use `/laws/{celex}/text`).\n\n**Data freshness**\nCached deterministically; the underlying text doesn't change after adoption.","operationId":"recital_article_map_api_v2_legislative_eur_lex_laws__celex__recital_article_map_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"force_recompute","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Recompute"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecitalArticleMapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/defined-terms":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Legal definitions from one EU act — terms the law itself defines authoritatively","description":"**What it does**\nExtracts the formal definitions article (typically Article 3 or 4) from an EU law — the terms the law defines authoritatively for its own scope — with each term + its definition text parsed from the Formex XML.\n\n**When to use it**\nWhen you need to know exactly how a law defines terms like \"very large online platform\" (DSA), \"AI system\" (AI Act), \"personal data\" (GDPR) without reading the full text. Critical for compliance scope analysis.\n\n**Input**\n- `celex` (path) — legal identifier.\n- `force_recompute` (query, default false) — local dev only.\n- `body_threshold` (default 500) — minimum body chars for `has_body=true`.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32022R2065/defined-terms\n```\n\n**You get back**\nA `DefinedTermsResponse` with `celex`, `terms` (term -> definition), `has_body`, `body_html`, `body_txt`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nCached deterministically (definitions don't change after adoption).","operationId":"defined_terms_api_v2_legislative_eur_lex_laws__celex__defined_terms_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"force_recompute","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Recompute"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DefinedTermsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/resolve-references":{"post":{"tags":["v2-legislative-eur-lex"],"summary":"Resolve inline EU legal citations in free text — extract every embedded reference","description":"**What it does**\nScans a block of free text and extracts every embedded EU legal citation (e.g. \"Article 7 of Regulation (EU) 2024/1234\"), returning a structured list with the matched legal identifier and canonical EUR-Lex URL. Pass `annotate_html=true` to receive the original text with each citation wrapped in an `<a href=...>` link.\n\n**When to use it**\nAuto-link EU citations in briefings, opinion pieces, AI-generated answers, or Word-to-HTML conversion. Idempotent; POST is used only because the request body carries free text.\n\n**Input**\nJSON body: `{ \"text\": \"<free text>\", \"annotate_html\": false }`.\n\n**Try it**\n```\nPOST /api/v2/legislative/eur-lex/resolve-references\n{ \"text\": \"Article 5 of Regulation (EU) 2022/2065 prohibits...\" }\n```\n\n**You get back**\nWith `annotate_html=false`: `{ refs: [{ alias, celex, url, public_url, ... }], + envelope datapoints }`. With `annotate_html=true`: `{ html: \"<text with inserted links>\" }`.\n\n**Data freshness**\nLive pass-through (regex extraction + URL composition; no upstream call).","operationId":"resolve_references_api_v2_legislative_eur_lex_resolve_references_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v1__legal_text__ResolveRefsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/resolve-aliases":{"post":{"tags":["v2-legislative-eur-lex"],"summary":"Resolve human names of EU laws (GDPR, DSA, AI Act, CBAM, ...) to their legal identifiers","description":"**What it does**\nScans free text for known human names of EU laws — GDPR, DSA, AI Act, CBAM, DORA, Solvency II, CRR, MiFID II, and 680+ more aliases — and returns each match with its legal identifier, canonical title, and the character offset where it was matched.\n\n**When to use it**\nWhen your users type \"GDPR\" but you need `32016R0679` to feed into other endpoints. Pairs with `/resolve-references` (which catches the formal \"Regulation (EU) 2016/679\" form).\n\n**Input**\nJSON body: `{ \"text\": \"<free text>\" }`.\n\n**Try it**\n```\nPOST /api/v2/legislative/eur-lex/resolve-aliases\n{ \"text\": \"Comparing GDPR and the AI Act on automated decisions\" }\n```\n\n**You get back**\n`{ aliases: [{ alias, celex, full_title, start, end, public_url, ... }], + envelope datapoints }`.\n\n**Data freshness**\nLive pass-through (regex match against a curated 680+ alias dictionary).","operationId":"resolve_aliases_api_v2_legislative_eur_lex_resolve_aliases_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveAliasesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/identify":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Recognise any single EU identifier — legal IDs, case-law IDs, DOIs, ISBNs, OJ refs","description":"**What it does**\nHand it any EU standard identifier (CELEX, ECLI, ELI, ISBN, ISSN, DOI, OJ reference, catalogue number, authority URI, EuroVoc URI) and get back its recognised type, the canonical EU URL, the matching Brubru endpoint, and a ShowVoc deep-link.\n\n**When to use it**\nWhen you have an identifier of unknown type and want one call that says \"this is an X, here's where to find it\".\n\n**Input**\n- `q` — the identifier string.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/identify?q=32016R0679\nGET /api/v2/legislative/eur-lex/identify?q=ECLI:EU:C:2014:317\n```\n\n**You get back**\nAn `IdentifyResult` with `kind`, `value`, `canonical_url`, `brubru_url`, `showvoc_url`, `parts`. HTTP 422 (`reason_code: unknown_identifier`) if no type matches.\n\n**Data freshness**\nLive pass-through (pure pattern recognition; no upstream call).","operationId":"identify_one_api_v2_legislative_eur_lex_identify_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Identifier string","title":"Q"},"description":"Identifier string","example":"32016R0679"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/identify/scan":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Scan free text and extract every embedded EU identifier — list of recognised matches","description":"**What it does**\nScans any free-text string and returns every embedded EU standard identifier it recognises — CELEX, ECLI, ELI, ISBN, ISSN, DOI, OJ refs, catalogue numbers — each as a fully-resolved match.\n\n**When to use it**\nWhen you have a chunk of free text (an article, an email, a chat message) and want every identifier in it extracted + resolved in one call.\n\n**Input**\n- `text` — the free-text string to scan (min 2 chars).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/identify/scan?text=See%20Regulation%20(EU)%202016/679%20and%20Directive%202002/58/EC.\n```\n\n**You get back**\nA `PaginatedResponse[IdentifyResult]` — each item is one match (same shape as `/identify`).\n\n**Data freshness**\nLive pass-through (pure pattern recognition).","operationId":"identify_scan_api_v2_legislative_eur_lex_identify_scan_get","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Free text to scan","title":"Text"},"description":"Free text to scan","example":"See Regulation (EU) 2016/679 and Directive 2002/58/EC."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IdentifyResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/verify-citation/{ref}":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Verify any EU legal reference — confirm it exists + return its full body and dates","description":"**What it does**\nGiven any EU legal reference, tells you whether it points at a real document on EUR-Lex / OEIL, and returns the canonical URLs plus the document's body and dates. Accepts CELEX (`32024R1689`), COM number (`COM(2021) 206`, auto-converted to CELEX), or OEIL procedure (`2021/0106(COD)`).\n\n**When to use it**\nGround your own AI's citations, validate a regulatory feed, or detect hallucinated legal-identifier numbers before showing them to users.\n\n**Input**\n- `ref` (path) — the reference (URL-encoded if it contains spaces or parentheses).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/verify-citation/32016R0679\n```\n\n**You get back**\nA `VerifyCitationResponse` with `data` (`VerifyCitationItem`): `ref`, `kind`, `status` (ok/broken/unknown), `public_url`, `resolved_url`, `http_status`, `body_txt`, `body_html`, `creation_date`, `document_date`.\n\n**Data freshness**\nCached 30 days on success, 24h on broken refs, 1h on transient errors; body fetched from Cellar XHTML on first call.","operationId":"verify_citation_api_v2_legislative_eur_lex_verify_citation__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","description":"The reference to verify (URL-encoded if it contains spaces or parentheses)","title":"Ref"},"description":"The reference to verify (URL-encoded if it contains spaces or parentheses)"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/recent":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Recently published EU acts (live from the Publications Office Cellar)","description":"**What it does**\nLive discovery of EU acts published in a date range, queried directly against the Publications Office Cellar SPARQL endpoint — covers the full corpus (incl. case law + proposals not in the local `eu_laws` mirror). Metadata-only by default; pass `include_body=true` for a concurrent body fetch (limit capped at 10).\n\n**When to use it**\nDaily polling of newly-published acts, sector-scoped discovery, or \"what landed on EUR-Lex since date X\".\n\n**Input**\n- `published_from` (required), `published_to` (defaults today).\n- `sectors` — comma-separated CELEX sector codes (e.g. `3,5`).\n- `language` — ISO-3 (default ENG).\n- `limit` (1-200, default 50; forced <=10 with include_body), `page`, `include_body`.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/recent?published_from=2026-05-01&sectors=3&limit=20\n```\n\n**You get back**\nPaginated `CellarRecentItem` rows; each `public_url` deep-links to EUR-Lex.\n\n**Data freshness**\nLive SPARQL pass-through; Cellar publishes throughout the day.","operationId":"recent_api_v2_legislative_eur_lex_recent_get","parameters":[{"name":"published_from","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Lower bound (YYYY-MM-DD)","title":"Published From"},"description":"Lower bound (YYYY-MM-DD)","example":"2026-05-01"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Upper bound (YYYY-MM-DD); defaults to today","title":"Published To"},"description":"Upper bound (YYYY-MM-DD); defaults to today"},{"name":"sectors","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated CELEX sector codes (e.g. '3,5')","title":"Sectors"},"description":"Comma-separated CELEX sector codes (e.g. '3,5')"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"ISO-3 language code (uppercase) for titles","default":"ENG","title":"Language"},"description":"ISO-3 language code (uppercase) for titles"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"If true, fetch each row's Cellar XHTML body (limit capped at 10).","default":false,"title":"Include Body"},"description":"If true, fetch each row's Cellar XHTML body (limit capped at 10)."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CellarRecentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/cellar":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Live Publications Office metadata for one act — title, ELI, in-force, languages, EuroVoc","description":"**What it does**\nLive fetch of full metadata for any EU act by CELEX from the Publications Office Cellar SPARQL graph — title, ELI URI, resource type, in-force status, validity dates, available languages, and EuroVoc subject concepts. Wider coverage than the `eu_laws`-backed `/laws/{celex}` (spans the full corpus incl. case law).\n\n**When to use it**\nWhen `/laws/{celex}` returns 404 (the act is outside Brubru's local mirror) or you need the live in-force flag + language list. Higher latency than the local cache (~2-3s vs ~50ms).\n\n**Input**\n- `celex` (path) — legal identifier.\n- `language` (query, default ENG) — ISO-3 for the returned title.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/cellar\n```\n\n**You get back**\nA `CellarMetadata` object with `celex`, `work_uri`, `title`, `document_date`, `eli`, `resource_type_label`, `in_force`, validity dates, `available_languages[]`, `eurovoc_concepts[]`, plus envelope datapoints.\n\n**Data freshness**\nLive pass-through (no cache; hits Cellar SPARQL on every request).","operationId":"cellar_metadata_api_v2_legislative_eur_lex_laws__celex__cellar_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","description":"CELEX number, e.g. 32016R0679","title":"Celex"},"description":"CELEX number, e.g. 32016R0679"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"ISO-3 language code (uppercase) for titles","default":"ENG","title":"Language"},"description":"ISO-3 language code (uppercase) for titles"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellarMetadata"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/relationships":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Acts that amend, repeal, or are amended by an act — the legal-relationship graph","description":"**What it does**\nReturns the directed legal-relationship graph around one CELEX: outgoing edges (this act amends / repeals / is based on …) and incoming edges (other acts that amend / repeal / cite this one). The envelope also carries the parent act's body so you don't need a second round-trip.\n\n**When to use it**\nRender an amendment tree, find every act that cites or supersedes a law, or drive an \"is this still in force, or amended by X?\" check.\n\n**Input**\n- `celex` (path).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32025R2158/relationships\n```\n\n**You get back**\nA paginated envelope of `CellarRelation` edges (`relation`, `related_celex`, `direction`) + the parent act's body in the envelope-level fields.\n\n**Data freshness**\nLive SPARQL pass-through.","operationId":"relationships_api_v2_legislative_eur_lex_laws__celex__relationships_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CellarRelation_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/languages":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Every language version + download format of an EU act — direct download URLs","description":"**What it does**\nReturns every `(language, format, URL)` tuple for one EU act from the Cellar metadata graph — up to 24 EU languages x multiple formats (FMX4 structured XML, XHTML, PDF/A, DOCX).\n\n**When to use it**\nWhen you need a specific-language or specific-format version of an act for a downstream parser or translation memory.\n\n**Input**\n- `celex` (path).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/languages\n```\n\n**You get back**\nA JSON object with `languages[]`, `manifestations[]` (each `language`, `format`, `url`), plus envelope datapoints.\n\n**Data freshness**\nLive SPARQL pass-through.","operationId":"languages_api_v2_legislative_eur_lex_laws__celex__languages_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Languages Api V2 Legislative Eur Lex Laws  Celex  Languages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/xref":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"All the other names and links for one EU law","description":"**What it does**\nGiven one EU law's CELEX, returns every identifier and relationship the Publications Office holds for it: its ELI permalink, its Official Journal reference, the legislative procedure that produced it, its EuroVoc topics, its legal basis, whether it's still in force, and counts of the acts it repeals / amends / is cited by. The productised join key — the same data that backfills Brubru's law_xref table.\n\n**When to use it**\nWhen you have one identifier and need the others, or to join a law across EUR-Lex, OEIL and your own records. The backbone for citation, deduplication, and \"show me the full context of this act\". For the full edge list (not counts), call `/laws/{celex}/relationships`.\n\n**Input**\n- `celex` (path) — the real CELEX (call `/laws/resolve` first if you hold a different identifier).\n- `refresh` (query, default false) — bypass the cache and recompute.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/xref\n```\n\n**You get back**\nAn `XrefResult` with `celex`, `eli`, `oj_reference`, `procedure_ref`, `resource_type`, `in_force`, `document_date`, `eurovoc[]`, `legal_basis[]`, `relation_counts{}`, `relation_total`, `eurlex_url`, `cached`, `computed_at`. HTTP 404 (`reason_code: not_found`) if the CELEX is in neither Cellar nor the local mirror.\n\n**Data freshness**\nCache-first: served from law_xref when present, else aggregated live from Cellar (metadata + relationships + EuroVoc) and written through to the cache.","operationId":"law_xref_api_v2_legislative_eur_lex_laws__celex__xref_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","description":"CELEX number, e.g. 32016R0679","title":"Celex"},"description":"CELEX number, e.g. 32016R0679"},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Bypass the cache and recompute.","default":false,"title":"Refresh"},"description":"Bypass the cache and recompute."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/XrefResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/views":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Deterministic permanent-link set for one act — TXT / ALL / HIS / NIM / LSU + XML notice","description":"**What it does**\nBuilds the full set of EUR-Lex permanent-link views for one CELEX — TXT (text), ALL (all formats), HIS (procedure history), NIM (national transposition), LSU (legislative summary), PDF — plus the Cellar XML notice and resource URIs. Pure construction; no upstream fetch.\n\n**When to use it**\nWhen you want every canonical link for an act in one call, to render a \"view this law on EUR-Lex\" link set without composing URLs yourself.\n\n**Input**\n- `celex` (path) — legal identifier.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/views\n```\n\n**You get back**\nA `ViewsResult` with `celex`, `eli` (from cache when present), `views{}` (the link set), `xml_notice`, `cellar_resource`, `public_url`.\n\n**Data freshness**\nLive: deterministic URL construction (ELI is read from the law_xref cache when available).","operationId":"law_views_api_v2_legislative_eur_lex_laws__celex__views_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewsResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/lifecycle":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"In-force status + entry-into-force / end-of-validity dates for one act","description":"**What it does**\nReturns the temporal lifecycle of one act from the Cellar legal-status graph: whether it is in force, its entry-into-force date, its end-of-validity date (when set), the document date, and a derived repealed/expired flag.\n\n**When to use it**\nFor an \"is this law still in force?\" check, or to drive a compliance timeline.\n\n**Input**\n- `celex` (path) — legal identifier.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/lifecycle\n```\n\n**You get back**\nA `LifecycleResult` with `celex`, `in_force`, `date_in_force`, `date_end_validity`, `document_date`, `repealed_or_expired`, `public_url`. HTTP 404 if the CELEX is in neither Cellar nor the local mirror.\n\n**Data freshness**\nLive SPARQL pass-through against the Cellar legal-status graph.","operationId":"law_lifecycle_api_v2_legislative_eur_lex_laws__celex__lifecycle_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LifecycleResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/laws/{celex}/consolidated":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Consolidated versions of one act — every dated consolidation, newest first","description":"**What it does**\nReturns every consolidated version of a base act (each consolidation folds in subsequent amendments and gets its own CELEX), newest first, with the latest highlighted.\n\n**When to use it**\nWhen you need the current consolidated text rather than the original as-adopted version — the consolidated CELEX is what you then feed to `/laws/{celex}/text`.\n\n**Input**\n- `celex` (path) — the base act's legal identifier.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/laws/32016R0679/consolidated\n```\n\n**You get back**\nA `ConsolidatedResult` with `base_celex`, `count`, `latest` ({celex, date, uri}), `versions[]`, `public_url`. Empty `versions` when the act has no consolidations.\n\n**Data freshness**\nLive SPARQL pass-through against the Cellar consolidation graph.","operationId":"law_consolidated_api_v2_legislative_eur_lex_laws__celex__consolidated_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidatedResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/oj/daily":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Acts published in the Official Journal on a given date","description":"**What it does**\nLists the EU acts whose document date falls on a given day — the daily Official Journal view. Backed by the Cellar SPARQL date-range discovery constrained to a single date. `series=L` narrows to legislation (CELEX sector 3); `series=C` returns the rest.\n\n**When to use it**\nDaily monitoring of what was published in the OJ on a specific date.\n\n**Input**\n- `date` — the publication date (YYYY-MM-DD).\n- `series` — `L` (legislation, default) or `C` (information & notices).\n- `limit` (1-200, default 50), `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/oj/daily?date=2026-05-01&series=L\n```\n\n**You get back**\nA `PaginatedResponse[CellarRecentItem]`; each row's `public_url` deep-links to EUR-Lex. Note: the OJ numbering switched to an act-by-act scheme on 1 Oct 2023; this endpoint keys on document date, which is stable across that change.\n\n**Data freshness**\nLive SPARQL pass-through.","operationId":"oj_daily_api_v2_legislative_eur_lex_oj_daily_get","parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Publication date (YYYY-MM-DD)","title":"Date"},"description":"Publication date (YYYY-MM-DD)","example":"2026-05-01"},{"name":"series","in":"query","required":false,"schema":{"type":"string","pattern":"^[LC]$","description":"OJ series: L (legislation) or C (information)","default":"L","title":"Series"},"description":"OJ series: L (legislation) or C (information)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Inline each act's full body (Cellar XHTML). Caps the page to 10. Default false.","default":false,"title":"Include Body"},"description":"Inline each act's full body (Cellar XHTML). Caps the page to 10. Default false."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CellarRecentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/oj/{series}/{year}/{number}":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Look up acts by an Official Journal reference (series / year / number)","description":"**What it does**\nResolves an Official Journal reference to the act(s) carrying it, from Brubru's `eu_laws` mirror. Handles both the pre-2023 issue-based form (`L 187/41`) and the post-1-Oct-2023 act-by-act form (`L 2024/1689`).\n\n**When to use it**\nWhen you hold an OJ citation (from a footnote or a press release) and need the act's CELEX + metadata.\n\n**Input**\n- `series` (path) — `L` or `C`.\n- `year` (path) — 4-digit year.\n- `number` (path) — the issue number (pre-2023) or act number (post-2023).\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/oj/L/2024/1689\nGET /api/v2/legislative/eur-lex/oj/L/2016/119\n```\n\n**You get back**\nA `PaginatedResponse[LawItem]` of acts whose `oj_reference` matches. Empty when no local row carries that reference.\n\n**Data freshness**\nSynced every 6 hours (hot tier) from EUR-Lex + Cellar.","operationId":"oj_by_reference_api_v2_legislative_eur_lex_oj__series___year___number__get","parameters":[{"name":"series","in":"path","required":true,"schema":{"type":"string","title":"Series"}},{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"number","in":"path","required":true,"schema":{"type":"string","title":"Number"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_LawItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eur-lex/xref":{"get":{"tags":["v2-legislative-eur-lex"],"summary":"Browse the whole cross-reference index — every law whose links have been computed","description":"**What it does**\nLists the complete cross-reference index — every CELEX whose ELI / OJ ref / procedure / EuroVoc / relationship graph has been computed and cached in `law_xref`. The browse-all sibling of `/laws/{celex}/xref`: where the single-act endpoint resolves one law, this one shows everything the index holds.\n\n**When to use it**\nTo enumerate the cross-reference corpus, sync it into your own store, or sample what Brubru has joined across EUR-Lex / OEIL / EuroVoc. Each `/laws/{celex}/xref` call adds to this index, and a backfill populates it in bulk.\n\n**Input**\n- `q` — optional CELEX prefix filter (e.g. `32024`).\n- `limit` (1-200, default 50), `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/eur-lex/xref?limit=50\nGET /api/v2/legislative/eur-lex/xref?q=32024\n```\n\n**You get back**\nA `PaginatedResponse[XrefResult]`, newest-computed first — each item is the same shape as the single-act `/xref` (celex, eli, oj_reference, procedure_ref, eurovoc[], relation_counts{}, ...).\n\n**Data freshness**\nReads the `law_xref` cache, which grows as `/laws/{celex}/xref` is called and via bulk backfill.","operationId":"list_xref_api_v2_legislative_eur_lex_xref_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by CELEX prefix (e.g. 32024)","title":"Q"},"description":"Filter by CELEX prefix (e.g. 32024)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_XrefResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/oeil/procedures":{"get":{"tags":["v2-legislative-oeil"],"summary":"Search EU legislative procedures in negotiation — proposed but not yet adopted","description":"**What it does**\nReturns EU legislative files currently in the institutional pipeline (Commission proposal, EP committee, Council negotiation, trilogue, or recently adopted but not yet published). 1,200+ files tracked from OEIL — the EP's authoritative procedure-file register. Each row carries the procedure reference (e.g. `2025/0726(COD)`), title, procedure type, lead committee, rapporteur, current status, dates, and policy-area tags.\n\n**When to use it**\nThe companion to `/api/v2/legislative/eur-lex/laws` (adopted legislation). Use this for \"what's coming next\" advocacy work — tracking a file from proposal to adoption, monitoring rapporteur appointments, finding blocked procedures.\n\n**Input**\n- `q` — substring match on title.\n- `reference` — exact OEIL procedure reference (e.g. `2025/0726(COD)`).\n- `committee` — lead committee code (e.g. `LIBE`, `ENVI`).\n- `rapporteur_mep_id` — filter to a specific MEP's files.\n- `status` — procedure status enum.\n- `updated_from`, `updated_to` (+ `updated_end` alias) — incremental sync.\n- `limit`, `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/oeil/procedures?committee=ENVI&status=in_trilogue\nGET /api/v2/legislative/oeil/procedures?reference=2024/0079(COD)\n```\n\n**You get back**\nA `PaginatedResponse[ProcedureItem]` envelope; each item carries the procedure metadata + the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) from OEIL XML feeds.","operationId":"list_procedures_api_v2_legislative_oeil_procedures_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title","title":"Q"},"description":"Substring match on title"},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OEIL procedure reference (e.g. 2025/0726(COD))","title":"Reference"},"description":"OEIL procedure reference (e.g. 2025/0726(COD))"},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lead committee code (e.g. LIBE, ENVI)","title":"Committee"},"description":"Lead committee code (e.g. LIBE, ENVI)"},{"name":"rapporteur_mep_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Carriage status","title":"Status"},"description":"Carriage status"},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Alias of updated_to (GovClipping-compatible)","title":"Updated End"},"description":"Alias of updated_to (GovClipping-compatible)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProcedureItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/oeil/procedures/latest":{"get":{"tags":["v2-legislative-oeil"],"summary":"Most recently updated legislative procedures","description":"**What it does**\nReturns the procedures whose status changed most recently — the \"what just moved\" feed. Backed by the same carriage mirror as `/procedures`, filtered to files updated within the last N days and ordered newest-first.\n\n**When to use it**\nFor a daily \"what advanced in the EU pipeline\" digest, or to poll for stage transitions without scanning the whole register.\n\n**Input**\n- `days` (1-90, default 7) — look-back window on the last-updated date.\n- `limit` (1-100, default 50).\n\n**Try it**\n```\nGET /api/v2/legislative/oeil/procedures/latest?days=7\n```\n\n**You get back**\nA `PaginatedResponse[ProcedureItem]` ordered by last-updated descending.\n\n**Data freshness**\nSynced every 6 hours (hot tier) from OEIL XML feeds.","operationId":"latest_procedures_api_v2_legislative_oeil_procedures_latest_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Look-back window in days","default":7,"title":"Days"},"description":"Look-back window in days"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProcedureItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/oeil/procedures/{reference}":{"get":{"tags":["v2-legislative-oeil"],"summary":"Look up one legislative procedure by its reference — full timeline + rapporteurs + briefings","description":"**What it does**\nReturns the complete legislative carriage for one procedure — the full OEIL timeline (every event from Commission proposal to adoption with dates + actors), rapporteurs by committee, committee assignments, EPRS-matched briefings, EUR-Lex linked documents, and AI-enriched summary.\n\n**When to use it**\nWhen you need the complete picture of a legislative file in one call — for an advocacy briefing, a chat answer about \"where is the AI Act now\", or a tracker deep-link.\n\n**Input**\n- `reference` (path) — OEIL procedure ref (e.g. `2021/0106(COD)`) or Brubru file_id. The `:path` matcher accepts slashes + parentheses verbatim; no URL-encoding needed.\n\n**Try it**\n```\nGET /api/v2/legislative/oeil/procedures/2024/0079(COD)\n```\n\n**You get back**\nA `ProcedureDetail` with `oeil_procedure_ref`, `title`, `current_status`, `lead_committee`, full timeline + key events, rapporteurs, EPRS briefings, EUR-Lex documents, AI summary, plus the 5 envelope-level datapoints. HTTP 404 (`reason_code: not_found`) if no procedure matches.\n\n**Data freshness**\nSynced every 6 hours (hot tier) from OEIL XML feeds.","operationId":"get_procedure_detail_api_v2_legislative_oeil_procedures__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcedureDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/legislative-train/carriages":{"get":{"tags":["v2-legislative-train"],"summary":"Legislative Train carriages — files by von der Leyen II priority / committee / status","description":"**What it does**\nLists the legislative files tracked on the EP Legislative Train Schedule, filterable by Commission priority, lead committee, and current status. Each carriage carries its priority tags, lead committee, current status, and expected completion.\n\n**When to use it**\nTo monitor a Commission priority's pipeline (\"everything under the Clean Industrial Deal\"), or a committee's active files, train-style.\n\n**Input**\n- `priority` — Commission priority tag (matched against `ec_priority_ids`).\n- `committee` — lead committee code (e.g. `ENVI`).\n- `status` — current carriage status.\n- `limit` (1-100, default 50), `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/legislative-train/carriages?committee=ENVI\n```\n\n**You get back**\nA `PaginatedResponse[TrainCarriage]` (id, title, oeil_procedure_ref, current_status, lead_committee, ec_priority_ids, expected_completion, law_tracker_url).\n\n**Data freshness**\nSynced every 6 hours (hot tier) from OEIL; priority mapping refreshed with the Legislative Train schedule.","operationId":"list_carriages_api_v2_legislative_legislative_train_carriages_get","parameters":[{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Commission priority tag (matched against ec_priority_ids)","title":"Priority"},"description":"Commission priority tag (matched against ec_priority_ids)"},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lead committee code (e.g. ENVI)","title":"Committee"},"description":"Lead committee code (e.g. ENVI)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Current carriage status","title":"Status"},"description":"Current carriage status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TrainCarriage_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/legislative-train/carriages/{carriage_id}":{"get":{"tags":["v2-legislative-train"],"summary":"One Legislative Train carriage + its monthly status timeline","description":"**What it does**\nReturns one carriage with its full status history / timeline — the train view of a single legislative file.\n\n**When to use it**\nTo show a file's journey across the Legislative Train (status changes over time) in one call.\n\n**Input**\n- `carriage_id` (path) — Brubru's internal carriage id (from the list endpoint) or the OEIL procedure reference.\n\n**Try it**\n```\nGET /api/v2/legislative/legislative-train/carriages/123\n```\n\n**You get back**\nA `TrainCarriage` including `status_history[]` and `oeil_key_events[]`. HTTP 404 (`reason_code: not_found`) if no carriage matches.\n\n**Data freshness**\nSynced every 6 hours (hot tier) from OEIL.","operationId":"get_carriage_api_v2_legislative_legislative_train_carriages__carriage_id__get","parameters":[{"name":"carriage_id","in":"path","required":true,"schema":{"type":"string","description":"Internal carriage id or OEIL procedure reference","title":"Carriage Id"},"description":"Internal carriage id or OEIL procedure reference"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainCarriage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/concepts/search":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"Search the EU subject thesaurus (EuroVoc) — find concept IDs to enumerate acts by topic","description":"**What it does**\nFree-text search against the EuroVoc thesaurus — the EU's official multilingual subject vocabulary. Returns matching concepts with `concept_uri`, human-readable `label`, and a ShowVoc deep-link.\n\n**When to use it**\nDiscover the `concept_id` to feed `/eurovoc/concepts/{concept_id}/acts` (the id is the trailing digits of `concept_uri`, e.g. `http://eurovoc.europa.eu/3030` -> `3030`). Or translate a plain-English topic into the EU's canonical subject tag.\n\n**Input**\n- `q` — search term (min 2 chars; multilingual).\n- `language` — ISO-2 (default `en`).\n- `limit` (1-100, default 20).\n\n**Try it**\n```\nGET /api/v2/legislative/eurovoc/concepts/search?q=artificial%20intelligence\n```\n\n**You get back**\nA `PaginatedResponse[EuroVocConcept]`. The trailing digits of each `concept_uri` are the IDs for the `/acts` route.\n\n**Data freshness**\nLive SPARQL pass-through.","operationId":"search_concepts_api_v2_legislative_eurovoc_concepts_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Free-text search term","title":"Q"},"description":"Free-text search term","example":"artificial intelligence"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"ISO-2 language code for labels","default":"en","title":"Language"},"description":"ISO-2 language code for labels"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EuroVocConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/concepts/{concept_id}/acts":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EU acts tagged with one EuroVoc concept (e.g. AI, data protection, climate)","description":"**What it does**\nReturns every EU legal act in the Cellar metadata graph tagged with the given EuroVoc subject concept (driven by `cdm:work_is_about_concept_eurovoc`). Optional date floor + language.\n\n**When to use it**\nTo enumerate \"every EU act about X\" where X is a curated EuroVoc subject — more precise than free-text search because EuroVoc is the EU's authoritative subject thesaurus.\n\n**How to obtain a concept_id**\nCall `/eurovoc/concepts/search?q=<topic>`; the trailing digits of each `concept_uri` are the IDs. Both `3030` and `http://eurovoc.europa.eu/3030` are accepted. Examples: `3030` AI, `5181` data protection, `5482` climate change, `754` renewable energy.\n\n**Input**\n- `concept_id` (path) — digits or full EuroVoc URI.\n- `published_from` (optional) — lower bound on document date.\n- `language` (default ENG) — ISO-3 for the title.\n- `limit` (1-200, default 50).\n\n**Try it**\n```\nGET /api/v2/legislative/eurovoc/concepts/3030/acts?limit=5\n```\n\n**You get back**\nA `PaginatedResponse[CellarRecentItem]`; each row's `public_url` deep-links to EUR-Lex.\n\n**Data freshness**\nLive SPARQL pass-through.","operationId":"acts_by_concept_api_v2_legislative_eurovoc_concepts__concept_id__acts_get","parameters":[{"name":"concept_id","in":"path","required":true,"schema":{"type":"string","description":"EuroVoc concept ID (digits, e.g. 3030) or full URI","title":"Concept Id"},"description":"EuroVoc concept ID (digits, e.g. 3030) or full URI"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Lower bound on document date","title":"Published From"},"description":"Lower bound on document date"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"ISO-3 language code for titles","default":"ENG","title":"Language"},"description":"ISO-3 language code for titles"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Inline each act's full body (Cellar XHTML). Caps the page to 10. Default false.","default":false,"title":"Include Body"},"description":"Inline each act's full body (Cellar XHTML). Caps the page to 10. Default false."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CellarRecentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/authority/{table}":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EU authority tables (NALs) — corporate bodies, procedure types, directories, modification types","description":"**What it does**\nLanguage-aware lookups against the EU's Named Authority Lists (NALs). One endpoint, four tables selected by the `table` path segment:\n- `corporate-bodies` — EU institutions, agencies, DGs, joint undertakings (~1,958 concepts).\n- `procedures` — inter-institutional procedure types (COD / CNS / APP / CONS / INI ...).\n- `directories` — the subject-matter directory tree of EU legal acts (~475 concepts). This also serves the \"directory of legal acts\" subject classification.\n- `modification-types` — amends / repeals / corrects / consolidates / replaces.\n\n**When to use it**\nResolve an acronym (`EP`, `EMA`) to its canonical multilingual name, translate a 3-letter procedure code, build a subject navigator, or render relationship labels — all in the user's language (en/fr/es/ca/it/nl).\n\n**Input**\n- `table` (path) — one of `corporate-bodies` / `procedures` / `directories` / `modification-types`.\n- `q` — substring on `pref_label` + exact match on `alt_labels` (acronym-friendly).\n- `lang` — Brubru language (default `en`).\n- `limit` (1-200, default 50), `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/eurovoc/authority/corporate-bodies?q=Parliament&lang=en\nGET /api/v2/legislative/eurovoc/authority/directories?q=environment\n```\n\n**You get back**\nA `PaginatedResponse[VocabularyConcept]`; each carries the canonical `uri` (== `public_url`), `pref_label`, `alt_labels[]`, `lang`, plus the 5 envelope datapoints. HTTP 404 (`reason_code: not_found`) for an unknown table.\n\n**Data freshness**\nRefreshed nightly from the Cellar SPARQL endpoint into the local authority-label cache.","operationId":"authority_table_api_v2_legislative_eurovoc_authority__table__get","parameters":[{"name":"table","in":"path","required":true,"schema":{"type":"string","description":"corporate-bodies | procedures | directories | modification-types","title":"Table"},"description":"corporate-bodies | procedures | directories | modification-types"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search term (matches pref_label substring + alt_labels)","title":"Q"},"description":"Search term (matches pref_label substring + alt_labels)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Brubru language code (en|fr|es|ca|it|nl)","default":"en","title":"Lang"},"description":"Brubru language code (en|fr|es|ca|it|nl)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_VocabularyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/directories/legal-acts":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"Directory of EU legal acts — the 20-chapter subject classification tree","description":"**What it does**\nReturns the Publications Office subject classification of EU legislation — the directory codes (e.g. \"13.30.99 Environment / Air pollution\") every EUR-Lex act is tagged with. A convenience alias of `/authority/directories`.\n\n**When to use it**\nTo build a subject-tag navigator across the acquis or translate a directory code into its localised label.\n\n**Input**\n- `q` — substring search on the chapter label.\n- `lang` — Brubru language (default `en`).\n- `limit` (1-200, default 50), `page`.\n\n**Try it**\n```\nGET /api/v2/legislative/eurovoc/directories/legal-acts?q=environment\n```\n\n**You get back**\nA `PaginatedResponse[VocabularyConcept]`; each carries the directory-code `uri` (== `public_url`), `pref_label`, `alt_labels[]`, `lang`, plus the 5 envelope datapoints.\n\n**Data freshness**\nRefreshed nightly from the Cellar SPARQL endpoint into the local authority-label cache.","operationId":"directories_legal_acts_api_v2_legislative_eurovoc_directories_legal_acts_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search on the chapter label","title":"Q"},"description":"Substring search on the chapter label"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Brubru language code (en|fr|es|ca|it|nl)","default":"en","title":"Lang"},"description":"Brubru language code (en|fr|es|ca|it|nl)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_VocabularyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/taxonomy/domains":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EuroVoc top level — the 21 subject domains (Politics, Law, Environment, ...)","description":"**What it does**\nWalks the EuroVoc thesaurus tree top-down: the 21 top domains. Labels in en/es/fr/it/nl (ca once the Catalan taxonomy is loaded).\n\n**When to use it**\nBuild a subject navigator over the acquis, or export the taxonomy to translate/re-use as an official classification.\n\n**Input**\n`lang` (en|es|fr|it|nl|ca, default en) selects which label to surface in `body_txt`; `labels` always carries every language. Pagination via `page`/`limit`.\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/taxonomy/domains`\n\n**You get back**\nA `PaginatedResponse[EuroVocTaxonomyConcept]`: each concept's stable `uri` (== `public_url`), `notation`, `concept_type`, the multilingual `labels`, and its `domain_uri`/`microthesaurus_uri`/`broader_uri` for walking the hierarchy.","operationId":"taxonomy_domains_api_v2_legislative_eurovoc_taxonomy_domains_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Label language (en|es|fr|it|nl|ca)","default":"en","title":"Lang"},"description":"Label language (en|es|fr|it|nl|ca)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EuroVocTaxonomyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/taxonomy/microthesauri":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EuroVoc mid level — the 127 microthesauri (optionally within one domain)","description":"**What it does**\nWalks the EuroVoc thesaurus tree top-down: the 127 microthesauri, optionally filtered to one domain. Labels in en/es/fr/it/nl (ca once the Catalan taxonomy is loaded).\n\n**When to use it**\nBuild a subject navigator over the acquis, or export the taxonomy to translate/re-use as an official classification.\n\n**Input**\n`domain` — a domain notation like `28` to list only that domain's microthesauri. `lang` (en|es|fr|it|nl|ca, default en) selects which label to surface in `body_txt`; `labels` always carries every language. Pagination via `page`/`limit`.\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/taxonomy/microthesauri?domain=28`\n\n**You get back**\nA `PaginatedResponse[EuroVocTaxonomyConcept]`: each concept's stable `uri` (== `public_url`), `notation`, `concept_type`, the multilingual `labels`, and its `domain_uri`/`microthesaurus_uri`/`broader_uri` for walking the hierarchy.","operationId":"taxonomy_microthesauri_api_v2_legislative_eurovoc_taxonomy_microthesauri_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Domain notation (e.g. 28) to filter","title":"Domain"},"description":"Domain notation (e.g. 28) to filter"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":200,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EuroVocTaxonomyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/taxonomy/descriptors":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EuroVoc descriptors — the ~7,500 subject terms (by microthesaurus or free-text)","description":"**What it does**\nWalks the EuroVoc thesaurus tree top-down: the descriptors, filtered by microthesaurus and/or a label search. Labels in en/es/fr/it/nl (ca once the Catalan taxonomy is loaded).\n\n**When to use it**\nBuild a subject navigator over the acquis, or export the taxonomy to translate/re-use as an official classification.\n\n**Input**\n`microthesaurus` — a microthesaurus notation (e.g. 2826); `q` — substring match on the label in `lang`. `lang` (en|es|fr|it|nl|ca, default en) selects which label to surface in `body_txt`; `labels` always carries every language. Pagination via `page`/`limit`.\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/taxonomy/descriptors?microthesaurus=2826`\n\n**You get back**\nA `PaginatedResponse[EuroVocTaxonomyConcept]`: each concept's stable `uri` (== `public_url`), `notation`, `concept_type`, the multilingual `labels`, and its `domain_uri`/`microthesaurus_uri`/`broader_uri` for walking the hierarchy.","operationId":"taxonomy_descriptors_api_v2_legislative_eurovoc_taxonomy_descriptors_get","parameters":[{"name":"microthesaurus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Microthesaurus notation (e.g. 2826)","title":"Microthesaurus"},"description":"Microthesaurus notation (e.g. 2826)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label substring search (in `lang`)","title":"Q"},"description":"Label substring search (in `lang`)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EuroVocTaxonomyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/taxonomy/concept/{notation}":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"One EuroVoc concept by notation, with its full hierarchy path","description":"**What it does**\nReturns one EuroVoc concept (domain, microthesaurus or descriptor) by its `notation`, plus its ancestors (domain > microthesaurus > broader-terms) so you have the full path in one call.\n\n**When to use it**\nResolve a EuroVoc code to its multilingual labels and place in the tree.\n\n**Input**\n`notation` — the EuroVoc code (descriptor id like `1764`, microthesaurus `2826`, or domain `28`). `lang` selects `body_txt`.\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/taxonomy/concept/1764`\n\n**You get back**\nA `PaginatedResponse[EuroVocTaxonomyConcept]` whose `data` is the concept followed by its ancestors, root-last.","operationId":"taxonomy_concept_api_v2_legislative_eurovoc_taxonomy_concept__notation__get","parameters":[{"name":"notation","in":"path","required":true,"schema":{"type":"string","description":"EuroVoc notation (e.g. 1764, 2826, 28)","title":"Notation"},"description":"EuroVoc notation (e.g. 1764, 2826, 28)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EuroVocTaxonomyConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/catalan/law/{celex}/concepts":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"EuroVocCat subjects for one Catalan-translated act (what the law is about, in Catalan)","description":"**What it does**\nReturns the EuroVoc subject concepts attached to one act of the Catalan legislation library (brubru.beresol.eu/legislacio-ue-catala), with their Catalan (EuroVocCat) labels.\n\n**When to use it**\nTo render subject tags on a translated act page, so a Catalan reader sees what topics the law covers.\n\n**Input**\n`celex` — the act's CELEX (e.g. `32016R0679`). Annex acts return their parent act's subjects (`relation='inherited'`).\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/catalan/law/32016R0679/concepts`\n\n**You get back**\nA `PaginatedResponse[CatalanActConcept]`: each subject's `notation`, `concept_uri` (stable, links back to EUR-Lex EuroVoc), Catalan `label_ca`, `label_en`, and `relation`.","operationId":"catalan_law_concepts_api_v2_legislative_eurovoc_catalan_law__celex__concepts_get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","description":"Act CELEX, e.g. 32016R0679","title":"Celex"},"description":"Act CELEX, e.g. 32016R0679"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalanActConcept_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/eurovoc/catalan/concept/{notation}/acts":{"get":{"tags":["v2-legislative-eurovoc"],"summary":"Catalan-translated acts under one EuroVocCat subject (find laws by topic)","description":"**What it does**\nLists the acts in the Catalan legislation library classified under a EuroVoc subject. Accepts a descriptor, a microthesaurus (rolls up its descriptors) or a domain (rolls up the whole branch).\n\n**When to use it**\nPower a subject navigator over the Catalan acquis: pick a EuroVocCat topic, get the translated laws about it.\n\n**Input**\n`notation` — a EuroVoc notation (descriptor `1764`, microthesaurus `2826`, or domain `28`). Pagination via `page`/`limit`.\n\n**Try it**\n`GET /api/v2/legislative/eurovoc/catalan/concept/2826/acts`\n\n**You get back**\nA `PaginatedResponse[CatalanLinkedAct]`: each act's `celex`, Catalan title `title_ca`, `url` (live page), `category`, and `relation`.","operationId":"catalan_concept_acts_api_v2_legislative_eurovoc_catalan_concept__notation__acts_get","parameters":[{"name":"notation","in":"path","required":true,"schema":{"type":"string","description":"EuroVoc notation (descriptor/MT/domain), e.g. 2826","title":"Notation"},"description":"EuroVoc notation (descriptor/MT/domain), e.g. 2826"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalanLinkedAct_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/delegated-acts":{"get":{"tags":["v2-legislative-delegated-acts"],"summary":"Commission delegated acts — secondary legislation under Article 290 TFEU","description":"**What it does**\nReturns Commission delegated acts — secondary legislation adopted by the Commission under powers delegated by a basic legislative act (Article 290 TFEU). Each row carries the act reference (e.g. `C(2026)1234`), the parent CELEX (the basic act granting the delegation), the parent procedure reference, the status, the proposing DG, the publication date, the EP/Council objection deadline (typically 2-3 months), the EP scrutiny status, the Council scrutiny status, the CELEX if adopted, plus body text + the 5 envelope-level datapoints.\n\n**When to use it**\nTo monitor secondary legislation flowing from a flagship regulation (e.g. all delegated acts under the AI Act), track the EP/Council objection window for delegated acts you might want to scrutinise, or audit which DGs are most active in delegated-act production. The `parent_celex` filter scopes to a specific parent act.\n\n**Input**\n- `parent_celex` — CELEX of the parent (basic) act granting the delegation (e.g. `32024R1689` for AI Act).\n- `proposing_dg` — DG code.\n- `status` — `proposed` / `scrutiny` / `adopted` / `objected` / `withdrawn` (status enum).\n- `q` — substring search on title + description.\n- `published_from`, `published_to` — date filter on `publication_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/legislative/delegated-acts?parent_celex=32024R1689&limit=20\nGET /api/v2/legislative/delegated-acts?proposing_dg=CNECT&status=scrutiny\n```\n\n**You get back**\nA `PaginatedResponse[SecondaryActItem]` envelope. Each item carries `reference`, `title`, `description`, `parent_celex`, `parent_procedure_ref`, `status`, `proposing_dg`, `publication_date`, `objection_deadline`, `ep_scrutiny` (dict with EP rapporteur / motion status), `council_scrutiny` (dict), `celex` (if adopted), `source_url`, `pdf_url`, `policy_areas`, body fields, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from the RegDel register + EUR-Lex C-series. New delegated acts appear on a steady drumbeat; daily sync catches them. Backed by `backend/scripts/backfill_eu_comitology.py`.","operationId":"list_delegated_acts_api_v2_legislative_delegated_acts_get","parameters":[{"name":"parent_celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Celex"}},{"name":"proposing_dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposing Dg"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SecondaryActItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/delegated-acts/{reference}":{"get":{"tags":["v2-legislative-delegated-acts"],"summary":"Look up one delegated act by its Commission reference (e.g. C(2026)1234)","description":"**What it does**\nFetches a single delegated act by its Commission reference. Returns the same shape as the list endpoint, with body text composed from the publication PDF when ingested.\n\n**When to use it**\nAfter locating a delegated act via the list endpoint, use this to fetch the full record (including body text + scrutiny details) in a deeper-link context.\n\n**Input**\n- `reference` (path) — the Commission reference, format `C(YYYY)NNNN`. The `:path` matcher means the parentheses are accepted verbatim — no URL-encoding needed.\n\n**Try it**\n```\nGET /api/v2/legislative/delegated-acts/C(2026)1234\n```\n\n**You get back**\nA single `SecondaryActItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from the RegDel register + EUR-Lex C-series.","operationId":"get_delegated_detail_api_v2_legislative_delegated_acts__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecondaryActItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/implementing-acts":{"get":{"tags":["v2-legislative-implementing-acts"],"summary":"Commission implementing acts — uniform implementation of EU law (Article 291 TFEU)","description":"**What it does**\nReturns Commission implementing acts — secondary legislation adopted by the Commission under Article 291 TFEU to ensure uniform conditions for implementation of EU law (typically with a comitology committee opinion). Each row carries the act reference (e.g. `C(2026)0234`), the parent CELEX, the parent procedure reference, the status, the proposing DG, the publication date, the comitology examination/advisory procedure outcome, the CELEX if adopted, plus body text + the 5 envelope-level datapoints.\n\n**When to use it**\nTo monitor secondary legislation flowing from a flagship regulation (e.g. all implementing acts under MDR, REACH, CRR), track comitology committee outcomes (e.g. SCoPAFF votes on pesticides), or audit which DGs are most active in implementing-act production. The `parent_celex` filter scopes to a specific parent act.\n\n**Input**\n- `parent_celex` — CELEX of the parent (basic) act (e.g. `32016R0679` for GDPR).\n- `proposing_dg` — DG code.\n- `status` — implementing-act status enum.\n- `q` — substring search on title + description.\n- `published_from`, `published_to` — date filter on `publication_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/legislative/implementing-acts?proposing_dg=SANTE&q=glyphosate\nGET /api/v2/legislative/implementing-acts?parent_celex=32016R0679&limit=20\n```\n\n**You get back**\nA `PaginatedResponse[SecondaryActItem]` envelope. Each item carries `reference`, `title`, `description`, `parent_celex`, `parent_procedure_ref`, `status`, `proposing_dg`, `publication_date`, `ep_scrutiny`, `council_scrutiny`, `celex`, `source_url`, `pdf_url`, `policy_areas`, body fields, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from the Comitology Register + EUR-Lex C-series.","operationId":"list_implementing_acts_api_v2_legislative_implementing_acts_get","parameters":[{"name":"parent_celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Celex"}},{"name":"proposing_dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposing Dg"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SecondaryActItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/legislative/implementing-acts/{reference}":{"get":{"tags":["v2-legislative-implementing-acts"],"summary":"Look up one implementing act by its Commission reference (e.g. C(2026)0234)","description":"**What it does**\nFetches a single Commission implementing act by its reference. Implementing acts (Article 291 TFEU) lay down uniform conditions for the implementation of EU legislation across Member States. Returns the same shape as the list endpoint, with body text composed from the publication PDF when ingested.\n\n**When to use it**\nAfter locating an implementing act via the list endpoint, use this to fetch the full record in a deeper-link context. Note: the difference between delegated acts (Art. 290, modify or supplement the basic act) and implementing acts (Art. 291, uniform implementation) is constitutionally significant for legal-affairs work.\n\n**Input**\n- `reference` (path) — the Commission reference, format `C(YYYY)NNNN`. Path-matching accepts parentheses verbatim.\n\n**Try it**\n```\nGET /api/v2/legislative/implementing-acts/C(2026)0234\n```\n\n**You get back**\nA single `SecondaryActItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from the Comitology Register + EUR-Lex C-series.","operationId":"get_implementing_detail_api_v2_legislative_implementing_acts__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecondaryActItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/meps":{"get":{"tags":["v2-parliament-meps"],"summary":"Members of the European Parliament — list / search by country, group, name, term","description":"**What it does**\nLive list of MEPs from the European Parliament's Open Data REST API v2. Each MEP carries the EP-internal id, full name, party of origin + EU political group, country, parliamentary term, photo, bio URL, committee assignments, and (when hydrated) email + social media handles. Both current and historical MEPs are searchable via `term`.\n\n**When to use it**\nDrive an MEP picker UI, find all MEPs from a country (`country=ES`), filter to one political group (`group=EPP`), or look up an MEP by name (`name=Sarri`). For historical research, set `term=9` for the 2019-2024 parliament. Per-MEP profile hydration (country / group / role) runs concurrently when the cache is warm — first cold call may take ~3-5s.\n\n**Input**\n- `country` — ISO-3166-1 alpha-2 (exact 2 chars).\n- `group` — political group code (`EPP`, `S-D`, `RENEW`, `VERTS-ALE`, `ECR`, `PFE`, `ESN`, `GUE-NGL`, `NI`). Note: the EP API uses hyphens (S-D) but our `/political-groups` returns slugs (sd) — both are accepted.\n- `name` — substring on full name.\n- `term` — parliamentary term (default 10 = current, valid range 1-10).\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/meps?country=ES&group=RENEW\nGET /api/v2/parliament/meps?name=Sarri\n```\n\n**You get back**\nA `PaginatedResponse[MEPItem]` envelope. Each item carries `mep_id`, `full_name`, `country`, `political_group`, `party_national`, `term`, `photo_url`, `bio_url`, `committee_assignments[]`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nLive pass-through to data.europarl.europa.eu (the EP's Open Data REST API v2), with a 6-hour in-process cache. MEP changes are rare (election cycles + occasional resignations); the 6h cache balances freshness against EP API rate limits.","operationId":"list_meps_api_v2_parliament_meps_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":2},{"type":"null"}],"title":"Country"}},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"term","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Parliamentary term (default 10 — current). Pass term=9 for previous, etc.","default":10,"title":"Term"},"description":"Parliamentary term (default 10 — current). Pass term=9 for previous, etc."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_MEPItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/meps/{mep_id}":{"get":{"tags":["v2-parliament-meps"],"summary":"Look up one MEP by their EP-internal id — full profile + body composition","description":"**What it does**\nFetches a single MEP by their EP-internal id (a 5-7 digit numeric identifier visible on europarl.europa.eu URLs like `/meps/en/197488/...`). Returns the full profile including biographical info, committee assignments, declared meetings (when available), and the composed body (name + group + country + roles + contact details as a readable contact card).\n\n**When to use it**\nAfter locating an MEP via the list endpoint, use this for the full record — particularly when embedding an MEP card in a chat answer or building an MEP profile page. The body composition gives you a ready-to-render HTML/text card.\n\n**Input**\n- `mep_id` (path) — EP-internal MEP id (e.g. `197488`).\n\n**Try it**\n```\nGET /api/v2/parliament/meps/197488\n```\n\n**You get back**\nA single `MEPItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nLive pass-through to data.europarl.europa.eu with a 6-hour in-process cache.","operationId":"get_mep_api_v2_parliament_meps__mep_id__get","parameters":[{"name":"mep_id","in":"path","required":true,"schema":{"type":"string","title":"Mep Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MEPItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/amendments":{"get":{"tags":["v2-parliament-amendments"],"summary":"EP committee amendments — what MEPs propose to change in a draft regulation","description":"**What it does**\nReturns the individual amendments tabled by MEPs in EP committee meetings — the building blocks of co-decision negotiation. Each amendment carries the procedure reference, the committee, the document PE reference, the amendment number, the author MEPs + political group context, the element being amended (recital/article/paragraph), and crucially the side-by-side text: `original_text` (what's currently proposed) + `proposed_text` (the MEPs' alternative) + `justification`.\n\n**When to use it**\nThis is the canonical surface for amendment-tracking advocacy. Common patterns: filter by `procedure_reference` to see all amendments on the AI Act, by `political_group` + `procedure_reference` to see what the Greens want to change, or by `committee` to follow ENVI's amendment activity. The `amendment_type` filter (`modification` / `suppression` / `addition`) lets you isolate where MEPs want to delete text vs add new provisions.\n\n**Input**\n- `procedure_reference` — OEIL reference (e.g. `2025/0419(COD)`).\n- `committee` — 4-letter committee code (e.g. `ENVI`).\n- `political_group` — code (e.g. `EPP`, `S&D`).\n- `pe_reference` — EP document PE reference.\n- `amendment_type` — `modification` / `suppression` / `addition`.\n- `element_type` — `recital` / `article` / `paragraph` / `subparagraph`.\n- `q` — substring search on element_reference + proposed_text.\n- `published_from`, `published_to` — date filter on `document_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/amendments?procedure_reference=2025/0419(COD)&committee=ENVI&limit=50\nGET /api/v2/parliament/amendments?political_group=S%26D&q=CBAM\n```\n\n**You get back**\nA `PaginatedResponse[AmendmentItem]` envelope. Each item carries `procedure_reference`, `committee_code`, `pe_reference`, `amendment_number`, `author_names`, `political_group`, `on_behalf_of_group`, `element_type`, `element_number`, `element_reference`, `amendment_type`, `original_text`, `proposed_text`, `justification`, `source_url`, `document_date`.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) from EP doceo committee meeting documents. Amendments appear on doceo within hours of committee tabling deadlines; 12h sync catches them inside the half-day window.","operationId":"list_amendments_api_v2_parliament_amendments_get","parameters":[{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"}},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"political_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group"}},{"name":"pe_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pe Reference"}},{"name":"amendment_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"modification | suppression | addition","title":"Amendment Type"},"description":"modification | suppression | addition"},{"name":"element_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on element_reference + proposed_text","title":"Q"},"description":"Substring on element_reference + proposed_text"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"document_date >= value","title":"Published From"},"description":"document_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AmendmentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/amendments/{amendment_id}":{"get":{"tags":["v2-parliament-amendments"],"summary":"Look up one EP committee amendment by its internal UUID","description":"**What it does**\nFetches a single EP committee amendment by its Brubru-internal UUID. Returns the original text being amended, the proposed text, the justification, the author MEPs, the political group context (or whether tabled on behalf of a group), and the doceo URL.\n\n**When to use it**\nAfter locating an amendment via the list endpoint, use this to fetch the full record (with original + proposed text for diff rendering) — particularly useful for embedding in a comparison view in Amendator or in an advocacy briefing.\n\n**Input**\n- `amendment_id` (path) — Brubru UUID (returned in `id` from the list endpoint).\n\n**Try it**\n```\nGET /api/v2/parliament/amendments/<uuid>\n```\n\n**You get back**\nA single `AmendmentItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced every 12 hours (02:00 / 14:00 UTC, warm tier) from EP doceo committee meeting documents.","operationId":"get_amendment_detail_api_v2_parliament_amendments__amendment_id__get","parameters":[{"name":"amendment_id","in":"path","required":true,"schema":{"type":"string","title":"Amendment Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmendmentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/votes":{"get":{"tags":["v2-parliament-votes"],"summary":"EP roll-call votes — plenary results with tallies (HowTheyVote)","description":"**What it does**\nRoll-call vote results from European Parliament plenary sittings, sourced from HowTheyVote.eu (the open-source civic-tech mirror of the EP's official register of votes). Each row carries the vote title, procedure reference, EP committee report number, FOR/AGAINST/ABSTENTION/DID-NOT-VOTE tallies, ADOPTED/REJECTED result, and the timestamp.\n\nFilterable by procedure, vote reference, main-vote-only, result, full-text search, and incremental sync.\n\n**When to use it**\n- Track how a specific legislative file was voted in plenary.\n- Aggregate vote tallies by procedure or rapporteur.\n- Build dashboards of EP plenary activity.\n- Link to per-MEP voting positions via `/api/v2/parliament/votes/{vote_id}/records`.\n\n**Input**\n- `procedure_reference` — e.g. `2024/0123(COD)`.\n- `reference` — e.g. `A10-0142/2026` (the EP committee report being voted on).\n- `is_main` — true to exclude amendment-level votes.\n- `result` — `ADOPTED | REJECTED | UNKNOWN`.\n- `q` — substring on `display_title`.\n- `published_from` / `published_to` — timestamp range.\n- `updated_from` — incremental-sync upper-bound.\n- `limit` (1–100, default 50), `page` (default 1).\n\n**Try it**\n```\nGET /api/v2/parliament/votes?procedure_reference=2024%2F0106(COD)\nGET /api/v2/parliament/votes?is_main=true&result=ADOPTED&limit=20\n```\n\n**You get back**\nPaginated `VoteItem` envelope. `public_url` points to the specific HowTheyVote vote page (`https://howtheyvote.eu/votes/{htv_id}`). All 5 mandatory v1 datapoints present per row.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC) from HowTheyVote.eu (howtheyvote.eu) + EP plenary votes. HowTheyVote importer blocked on ep_political_groups.short_label collision — see CLAUDE.md.","operationId":"list_votes_api_v2_parliament_votes_get","parameters":[{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"}},{"name":"reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Vote reference (e.g. A10-XXXX/2026)","title":"Reference"},"description":"Vote reference (e.g. A10-XXXX/2026)"},{"name":"is_main","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Main"}},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ADOPTED | REJECTED | UNKNOWN","title":"Result"},"description":"ADOPTED | REJECTED | UNKNOWN"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"timestamp >= value","title":"Published From"},"description":"timestamp >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_VoteItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/votes/{vote_id}":{"get":{"tags":["v2-parliament-votes"],"summary":"Look up one EP roll-call vote by its internal ID — full tallies + HowTheyVote link","description":"**What it does**\nReturns full metadata for one EP roll-call vote, including title, procedure, committee report, tallies, result, and the citizen-facing HowTheyVote URL.\n\n**When to use it**\nAfter locating a vote via the list endpoint, use this to fetch the full record (with all tallies + ADOPTED/REJECTED result) for embedding in an analysis or a chat answer. To get the per-MEP breakdown of the same vote, follow up with `/api/v2/parliament/votes/{vote_id}/records`.\n\n**Input**\n- `vote_id` (path) — `ep_votes.id` (UUID).\n\n**Try it**\n```\nGET /api/v2/parliament/votes/{vote_id}\n```\n\n**You get back**\nA `VoteItem` with all 5 mandatory v1 datapoints. `public_url` resolves to `https://howtheyvote.eu/votes/{htv_id}` — the public vote page with per-MEP breakdown, country chart, and group cohesion.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC) from HowTheyVote.eu (howtheyvote.eu) + EP plenary votes. HowTheyVote importer blocked on ep_political_groups.short_label collision — see CLAUDE.md.","operationId":"get_vote_detail_api_v2_parliament_votes__vote_id__get","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"string","title":"Vote Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/votes/{vote_id}/records":{"get":{"tags":["v2-parliament-votes"],"summary":"Per-MEP voting records for a single roll-call vote","description":"**What it does**\nPer-MEP vote positions (FOR / AGAINST / ABSTENTION / DID_NOT_VOTE) for one specific roll-call vote. Joins `ep_member_votes` to `ep_votes` so callers can see exactly how each named MEP voted, with their country and political-group code at the moment of the vote.\n\n**When to use it**\n- Build a \"how did my MEP vote?\" widget for any specific roll-call.\n- Aggregate per-group or per-country breakdowns.\n- Feed group-cohesion analysis or position-prediction models.\n\n**Input**\n- `vote_id` (path) — `ep_votes.id` (UUID).\n- `group` — EP group code (e.g. `EPP`, `S&D`, `Renew`).\n- `country` — ISO-2 (e.g. `DE`, `FR`).\n- `position` — `FOR | AGAINST | ABSTENTION | DID_NOT_VOTE`.\n- `limit` (1–500, default 100), `page` (default 1).\n\n**Try it**\n```\nGET /api/v2/parliament/votes/{vote_id}/records?group=EPP\nGET /api/v2/parliament/votes/{vote_id}/records?country=DE&position=AGAINST\n```\n\n**You get back**\nPaginated `MemberVoteItem` envelope. `public_url` on each row points to the parent vote's HowTheyVote page. All 5 mandatory v1 datapoints present per row.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC) from HowTheyVote.eu (howtheyvote.eu) + EP plenary votes. HowTheyVote importer blocked on ep_political_groups.short_label collision — see CLAUDE.md.","operationId":"list_member_votes_api_v2_parliament_votes__vote_id__records_get","parameters":[{"name":"vote_id","in":"path","required":true,"schema":{"type":"string","title":"Vote Id"}},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"position","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"FOR | AGAINST | ABSTENTION | DID_NOT_VOTE","title":"Position"},"description":"FOR | AGAINST | ABSTENTION | DID_NOT_VOTE"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_MemberVoteItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/ep-documents":{"get":{"tags":["v2-parliament-ep-documents"],"summary":"Unified view of all EP committee output — work items + amendments + adopted texts","description":"**What it does**\nReturns a unified, cross-committee view that merges three separate document streams into one envelope: (1) `committee_work` items (high-level work programme entries with stage + rapporteur), (2) `amendment_documents` (PR=draft report, AM=amendments, RD=draft recommendation, AD=opinion, PA=draft opinion), and (3) `texts_adopted` (the formal plenary outputs). Each row carries a `source` field telling you which stream it came from and a `document_type` normalised across the three.\n\n**When to use it**\nWhen you want \"everything that happened on file X across all stages\" without making three separate queries. Useful for assembling a procedure timeline, building a committee activity dashboard, or answering \"what is the LIBE committee working on this week?\".\n\n**Input**\n- `committee` — 4-letter code (e.g. `LIBE`).\n- `procedure_reference` — OEIL reference.\n- `document_type` — normalised: `draft_report` / `report` / `amendments` / `opinion` / `minutes` / `resolution`.\n- `q` — substring search across titles.\n- `published_from`, `published_to` — date filter.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/ep-documents?committee=LIBE&document_type=draft_report\nGET /api/v2/parliament/ep-documents?procedure_reference=2025/0419(COD)\n```\n\n**You get back**\nA `PaginatedResponse[EPDocumentItem]` envelope. Each item carries `id`, `source` (which stream this row came from), `document_type`, `committee_code`, `procedure_reference`, `pe_reference`, `title` (enriched with the procedure's plain-language alias when available via `_enrich_doc_title`), `rapporteur_name`, `document_date`, `document_url`, `total_amendments` (for amendment docs), `public_url`, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) via the committee_work sync. Underlying tables (`committee_work_items`, `amendment_documents`, `texts_adopted`) are updated by separate syncs on hot/warm cadences.","operationId":"list_ep_documents_api_v2_parliament_ep_documents_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"}},{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"draft_report | report | amendments | opinion | minutes | resolution","title":"Document Type"},"description":"draft_report | report | amendments | opinion | minutes | resolution"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EPDocumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/reports":{"get":{"tags":["v2-parliament-reports"],"summary":"EP committee reports — draft reports + draft recommendations","description":"**What it does**\nReturns EP committee reports — both `draft_report` (document type PR) and `draft_recommendation` (RD). These are the rapporteur's first written articulation of the EP's position on a legislative file, before amendments are tabled. Each row carries the procedure reference, the lead committee, the PE document reference, the rapporteur's name, the document date, and the doceo URL.\n\n**When to use it**\nReports are the most quoted EP documents in advocacy work — they set the framing for the committee's negotiation. Use this endpoint to find \"the latest report on the AI Act\", \"all draft reports by rapporteur X\", or \"all ENVI reports this year\". The title is enriched with the procedure's plain-language alias (e.g. \"draft_report for 2024/0079(COD) (ENVI)\" becomes \"draft_report for CBAM Downstream Extension (ENVI)\").\n\n**Input**\n- `committee` — 4-letter committee code.\n- `procedure_reference` — OEIL reference.\n- `published_from`, `published_to` — date filter on `document_date`.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/reports?committee=ENVI&published_from=2026-01-01\nGET /api/v2/parliament/reports?procedure_reference=2025/0419(COD)\n```\n\n**You get back**\nA `PaginatedResponse[EPDocumentItem]` envelope, semantic-aliased subset of `/api/v2/parliament/ep-documents` filtered to `document_type ∈ {PR, RD}`. Each item carries `source=\"amendment_document\"`, `document_type` (`draft_report` or `draft_recommendation`), `committee_code`, `procedure_reference`, `pe_reference`, enriched `title`, `rapporteur_name`, `document_date`, `document_url`, `total_amendments`, `last_updated`.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) via the committee_work + amendment_documents syncs from EP doceo.","operationId":"list_reports_api_v2_parliament_reports_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EPDocumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/opinions":{"get":{"tags":["v2-parliament-opinions"],"summary":"EP associated-committee opinions — what other committees say about a lead committee's file","description":"**What it does**\nReturns EP committee opinions — both `opinion` (document type AD, the formal adopted opinion) and `draft_opinion` (PA, the rapporteur for opinion's first draft). An opinion is what an associated committee says to the lead committee on a legislative file: e.g. ITRE's opinion to ENVI on the CBAM file. They are non-binding but influence the lead committee's report.\n\n**When to use it**\nTo find which side-committees are weighing in on a file (e.g. all opinions on the AI Act → CULT, IMCO, JURI, LIBE), to track a specific committee's opinion-rapporteur output, or to assemble a procedure's full inter-committee picture. The `procedure_reference` filter scopes to one file.\n\n**Input**\n- `committee` — 4-letter committee code (the OPINIONING committee, not the lead).\n- `procedure_reference` — OEIL reference.\n- `published_from`, `published_to` — date filter on `document_date`.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/opinions?procedure_reference=2024/0079(COD)\nGET /api/v2/parliament/opinions?committee=ITRE&published_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[EPDocumentItem]` envelope, semantic-aliased subset of `/api/v2/parliament/ep-documents` filtered to `document_type ∈ {AD, PA}`. Same shape as `/api/v2/parliament/reports`.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) via the committee_work + amendment_documents syncs from EP doceo.","operationId":"list_opinions_api_v2_parliament_opinions_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EPDocumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committees/{code}/work-items":{"get":{"tags":["v2-parliament-committees"],"summary":"Legislative files an EP committee is currently working on — with stage + status","description":"**What it does**\nReturns every legislative file an EP committee is currently working on, with the file's title, rapporteur, current stage (e.g. `awaiting_committee_vote`, `in_trilogue`), status, and any CELEX numbers cross-referenced from the underlying `legislative_carriages` table. Each row enriches the committee_work_items scrape with canonical legislation data via an outer join.\n\n**When to use it**\nThe fastest way to answer \"what is committee X working on?\" Use to drive a committee dashboard, build a rapporteur-tracking UI, or feed a chatbot answer about a specific committee's caseload.\n\n**Input**\n- `code` (path) — EP committee 4-letter code (e.g. `LIBE`, `ENVI`).\n- `q` — substring on title.\n- `status` — work-item status.\n- `stage` — work-item stage.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/committees/LIBE/work-items\nGET /api/v2/parliament/committees/ENVI/work-items?stage=in_trilogue\n```\n\n**You get back**\nA `CommitteeWorkEnvelope` with paginated work items. Each row carries the procedure ref, title (enriched), rapporteur, stage, status, dates, source URL, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) from europarl.europa.eu/committees/<code>/work. Committee work items move on EP committee meeting cadences; 12h sync catches stage transitions.","operationId":"list_committee_work_api_v2_parliament_committees__code__work_items_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title","title":"Q"},"description":"Substring on title"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeWorkEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committees/{code}/minutes":{"get":{"tags":["v2-parliament-committees"],"summary":"EP committee meeting minutes — votes, decisions, attendance, decisions taken","description":"**What it does**\nReturns minutes of a specific EP committee's meetings. Each row carries the meeting date, agenda items, votes (with for/against/abstention tallies), decisions taken, MEPs present, and the doceo URL for the official minutes document.\n\n**When to use it**\nTo audit what actually happened at a committee meeting — particularly useful for understanding why a file's status changed (e.g. a vote was postponed, an amendment was withdrawn, a rapporteur was reappointed). The official minutes are the authoritative record.\n\n**Input**\n- `code` (path) — EP committee 4-letter code (e.g. `LIBE`, `ENVI`).\n- `published_from`, `published_to` (aliased as `date_from`, `date_to`) — meeting_date filter.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/committees/LIBE/minutes?date_from=2026-01-01\nGET /api/v2/parliament/committees/ENVI/minutes\n```\n\n**You get back**\nA `CommitteeMinutesEnvelope` with paginated minutes rows. Each row carries the meeting date, agenda items, votes, decisions, attendance, and the doceo URL.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) via `backend/scripts/sync_committee_minutes.py`. Committee minutes are typically published on doceo within a few days of the meeting; 12h sync catches them as soon as they appear.","operationId":"list_committee_minutes_api_v2_parliament_committees__code__minutes_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeMinutesEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/texts-adopted":{"get":{"tags":["v2-parliament-texts-adopted"],"summary":"EP plenary texts that have been adopted — resolutions, legislative resolutions, decisions","description":"**What it does**\nReturns every text adopted by the European Parliament in plenary session — legislative resolutions (the EP's formal positions on legislation), non-legislative resolutions (own-initiative + topical), decisions, recommendations. Each row carries the TA reference (e.g. `P10_TA(2025)0042`), the title, text type, procedure ref + parliamentary term, lead committee, rapporteur, adoption date, vote tallies, and the full-text URL.\n\n**When to use it**\nThe authoritative record of what the EP has decided in plenary. Use to track positions on co-decision files (legislative_resolution), trace the EP's stance on a topic (resolution), or build a plenary outcomes dashboard. Pair with `/api/v2/parliament/texts-submitted` to see the pipeline from tabled → adopted.\n\n**Input**\n- `q` — substring on title + description.\n- `text_type` — `resolution` / `legislative_resolution` / `decision` / `recommendation` / `other`.\n- `procedure_ref` — OEIL reference.\n- `parliamentary_term` — EP term (e.g. 10 for current, 9 for 2019-2024).\n- `committee` — lead committee code.\n- `rapporteur_mep_id` — filter to one rapporteur's adopted texts.\n- `published_from`, `published_to` (and `published_end` alias) — adoption_date filter.\n- `updated_from`, `updated_to` (and `updated_end` alias) — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/texts-adopted?text_type=legislative_resolution&committee=ENVI\nGET /api/v2/parliament/texts-adopted?procedure_ref=2024/0079(COD)\n```\n\n**You get back**\nA `PaginatedResponse[TextItem]` envelope. Each item carries `ta_reference`, `title`, `text_type`, `procedure_ref`, `parliamentary_term`, `committees`, `rapporteur_mep_id`, `rapporteur_name`, `adoption_date`, vote tallies, `full_text_url`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) via RSS from europarl.europa.eu/plenary/en/texts-adopted.html. Texts appear within hours of plenary adoption.","operationId":"list_texts_adopted_api_v2_parliament_texts_adopted_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title + description","title":"Q"},"description":"Substring on title + description"},{"name":"text_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resolution | legislative_resolution | decision | recommendation | other","title":"Text Type"},"description":"resolution | legislative_resolution | decision | recommendation | other"},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"parliamentary_term","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"EP term, e.g. 9, 10","title":"Parliamentary Term"},"description":"EP term, e.g. 9, 10"},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"rapporteur_mep_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"adoption_date >= value","title":"Published From"},"description":"adoption_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TextItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/texts-adopted/{ta_reference}":{"get":{"tags":["v2-parliament-texts-adopted"],"summary":"Look up one EP plenary-adopted text by its TA reference (e.g. P10_TA(2025)0042)","description":"**What it does**\nFetches a single EP plenary-adopted text by its TA reference. Returns the same shape as the list endpoint, including the full-text URL and body composition.\n\n**When to use it**\nAfter locating a text via the list endpoint, use this for the deep-link. Common pattern in chat answers when a user references a specific P10_TA number.\n\n**Input**\n- `ta_reference` (path) — the TA reference (format: `P<TERM>_TA(<YEAR>)<NUMBER>`, e.g. `P10_TA(2025)0042`). The `:path` matcher accepts parentheses verbatim.\n\n**Try it**\n```\nGET /api/v2/parliament/texts-adopted/P10_TA(2025)0042\n```\n\n**You get back**\nA single `TextItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced every 6 hours from europarl.europa.eu/plenary/en/texts-adopted.html.","operationId":"get_text_adopted_detail_api_v2_parliament_texts_adopted__ta_reference__get","parameters":[{"name":"ta_reference","in":"path","required":true,"schema":{"type":"string","title":"Ta Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/texts-submitted":{"get":{"tags":["v2-parliament-texts-submitted"],"summary":"EP plenary texts tabled but NOT YET adopted — the upcoming-vote pipeline","description":"**What it does**\nReturns EP plenary texts that have been formally tabled for vote but not yet adopted (no adoption_date). Sibling endpoint to `/texts-adopted` — the same row \"moves\" from submitted to adopted when the plenary vote concludes. Each row carries the procedure ref, title, text type, parliamentary term, lead committee, rapporteur, the tabling date, and the doceo URL.\n\n**When to use it**\nFor advocacy work focused on upcoming plenary votes — see what's coming next week, identify which committees have files in the pipeline, or filter by rapporteur to track an MEP's pending plenary texts. Pair with `/api/v1/calendar?event_type=PLENARY` to know WHEN each text is expected to be voted.\n\n**Input**\nSame shape as `/texts-adopted` — `q`, `text_type`, `procedure_ref`, `parliamentary_term`, `committee`, `rapporteur_mep_id`, date filters, incremental sync, pagination.\n\n**Try it**\n```\nGET /api/v2/parliament/texts-submitted?committee=LIBE&parliamentary_term=10\nGET /api/v2/parliament/texts-submitted?text_type=legislative_resolution\n```\n\n**You get back**\nA `PaginatedResponse[TextItem]` envelope — same shape as `/texts-adopted`'s response, but with `adoption_date` null on every row (texts are pre-adoption).\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) from europarl.europa.eu/plenary/en/texts-submitted.html. New tablings appear on doceo within hours; the 6h sync catches them.","operationId":"list_texts_submitted_api_v2_parliament_texts_submitted_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"text_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Type"}},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"parliamentary_term","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parliamentary Term"}},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TextItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/resolutions":{"get":{"tags":["v2-parliament-resolutions"],"summary":"EP non-legislative resolutions — own-initiative reports, legislative initiatives, topical resolutions","description":"**What it does**\nReturns EP non-legislative outputs — files where the Parliament expresses a position WITHOUT directly amending EU law. Covers: `INL` (legislative initiative reports — EP asks the Commission to propose), `INI` (own-initiative reports — EP positions on horizontal themes), `RSP` (topical resolutions — urgent matters of EU concern, e.g. human rights, foreign policy). Each row carries the procedure ref, title, type, lead committee, rapporteur, adoption date, vote tallies, Commission follow-up status, and full text URL.\n\n**When to use it**\nEP resolutions don't have legal force but signal political direction — useful for advocacy work tracking what the EP demands of the Commission, urgent geopolitical positions, or thematic priorities. Filter by `has_commission_followup=true` to find resolutions where the Commission has actually responded.\n\n**Input**\n- `q` — substring on title + summary.\n- `resolution_type` — `INL` / `INI` / `RSP` / `OTHER`.\n- `lead_committee` — 4-letter committee code.\n- `rapporteur` — name substring.\n- `procedure_ref` — OEIL reference.\n- `has_commission_followup` — boolean.\n- `published_from`, `published_to` (and `published_end` alias) — adoption_date filter.\n- `updated_from`, `updated_to` (and `updated_end` alias) — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/resolutions?resolution_type=INL&lead_committee=ENVI\nGET /api/v2/parliament/resolutions?q=Ukraine&resolution_type=RSP\n```\n\n**You get back**\nA `PaginatedResponse[ResolutionItem]` envelope. Each item carries `procedure_ref`, `title`, `resolution_type`, `lead_committee`, `rapporteur_name`, `adoption_date`, vote tallies, `has_commission_followup`, `full_text_url`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) from OEIL XML feeds. Resolutions are adopted at EP plenary sittings; the post-plenary sync catches them inside hours.","operationId":"list_resolutions_api_v2_parliament_resolutions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title + summary","title":"Q"},"description":"Substring on title + summary"},{"name":"resolution_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"INL | INI | RSP | OTHER","title":"Resolution Type"},"description":"INL | INI | RSP | OTHER"},{"name":"lead_committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"}},{"name":"rapporteur","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur"}},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"has_commission_followup","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Commission Followup"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"adoption_date >= value","title":"Published From"},"description":"adoption_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ResolutionItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/resolutions/{procedure_ref}":{"get":{"tags":["v2-parliament-resolutions"],"summary":"Look up one EP resolution by its procedure reference","description":"**What it does**\nFetches a single EP resolution by its procedure reference. Returns the same shape as the list endpoint, with the full text URL + adoption details + Commission follow-up status.\n\n**When to use it**\nAfter locating a resolution via the list endpoint, use this for the full record — common pattern in chat answers when a user references a specific INI / RSP / INL number.\n\n**Input**\n- `procedure_ref` (path) — procedure reference (e.g. `2025/2125(INI)`, `2025/2887(RSP)`). The `:path` matcher accepts slashes + parentheses verbatim.\n\n**Try it**\n```\nGET /api/v2/parliament/resolutions/2025/2125(INI)\n```\n\n**You get back**\nA single `ResolutionItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced every 6 hours from OEIL XML feeds.","operationId":"get_resolution_detail_api_v2_parliament_resolutions__procedure_ref__get","parameters":[{"name":"procedure_ref","in":"path","required":true,"schema":{"type":"string","title":"Procedure Ref"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolutionItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/eprs":{"get":{"tags":["v2-parliament-eprs"],"summary":"EPRS think-tank publications — Parliament's research service (briefings, studies, in-depth)","description":"**What it does**\nReturns publications from EPRS — the European Parliamentary Research Service, the EP's in-house think-tank. Covers briefings, studies, in-depth analyses, at-a-glance notes, \"EU legislation in progress\" tracker entries, initial appraisals, ex-post evaluations, and historical archives. Each row carries the publication ID + type, authors, summary, policy areas, related procedure refs and legal IDs, HTML + PDF URLs, and (when ingested) word + page counts.\n\n**When to use it**\nEPRS publications are the highest-quality non-partisan policy briefings on EU files — used by MEPs (and their staff) to understand legislation. Filter by `committee` to find what's been written for the LIBE committee, by `procedure_ref` for everything related to one file, or by `q` for free-text search.\n\n**Input**\n- `q` — substring on title + summary.\n- `publication_type` — `BRIEFING` / `STUDY` / `IN_DEPTH_ANALYSIS` / `AT_A_GLANCE` / `EU_LEGISLATION_IN_PROGRESS` / `INITIAL_APPRAISAL` / `EX_POST_EVALUATION` / etc.\n- `committee` — committee code.\n- `procedure_ref` — OEIL reference.\n- `celex` — legal identifier cross-link.\n- `published_from`, `published_to` (and `published_end` alias).\n- `updated_from`, `updated_to` (and `updated_end` alias) — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/eprs?committee=ENVI&publication_type=BRIEFING\nGET /api/v2/parliament/eprs?q=CBAM&published_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[EPRSItem]` envelope. Each item carries `publication_id` (e.g. `EPRS_BRI(2026)762322`), `title`, `publication_type`, `publication_date`, `authors`, `summary`, `policy_areas`, `committees`, `related_celex_numbers`, `related_procedures`, `html_url`, `pdf_url`, `word_count`, `page_count`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) from the EP Think Tank portal RSS (EPRS + ECTI + CASP) + the WordPress blog RSS as secondary source. EPRS publishes throughout the day; 12h sync catches new pieces inside a half-day.","operationId":"list_eprs_api_v2_parliament_eprs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search on title + summary","title":"Q"},"description":"Substring search on title + summary"},{"name":"publication_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"BRIEFING | STUDY | IN_DEPTH_ANALYSIS | AT_A_GLANCE | EU_LEGISLATION_IN_PROGRESS | ...","title":"Publication Type"},"description":"BRIEFING | STUDY | IN_DEPTH_ANALYSIS | AT_A_GLANCE | EU_LEGISLATION_IN_PROGRESS | ..."},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Committee code (LIBE, ENVI, ECON, ...)","title":"Committee"},"description":"Committee code (LIBE, ENVI, ECON, ...)"},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OEIL procedure reference","title":"Procedure Ref"},"description":"OEIL procedure reference"},{"name":"celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Alias of published_to. 422 if both differ.","title":"Published End"},"description":"Alias of published_to. 422 if both differ."},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync — rows last_updated >= value. Returns rows ordered by last_updated desc when set.","title":"Updated From"},"description":"Incremental sync — rows last_updated >= value. Returns rows ordered by last_updated desc when set."},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Alias of updated_to. 422 if both differ.","title":"Updated End"},"description":"Alias of updated_to. 422 if both differ."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EPRSItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/eprs/{publication_id}":{"get":{"tags":["v2-parliament-eprs"],"summary":"Look up one EPRS publication by its publication_id — full metadata + links","description":"**What it does**\nFetches a single EPRS publication by its publication_id. Returns the same shape as the list endpoint, including HTML + PDF URLs for the full text and the related procedures / legal IDs the publication cross-references.\n\n**When to use it**\nAfter locating an EPRS publication via the list endpoint, use this to deep-link into a specific publication. The HTML URL is the canonical EP Think Tank page; the PDF URL is the direct download.\n\n**Input**\n- `publication_id` (path) — EPRS publication ID (e.g. `EPRS_BRI(2026)762322`). The `:path` matcher accepts parentheses verbatim.\n\n**Try it**\n```\nGET /api/v2/parliament/eprs/EPRS_BRI(2026)762322\n```\n\n**You get back**\nA single `EPRSItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced every 12 hours from the EP Think Tank portal.","operationId":"get_eprs_detail_api_v2_parliament_eprs__publication_id__get","parameters":[{"name":"publication_id","in":"path","required":true,"schema":{"type":"string","title":"Publication Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EPRSItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/webstreams":{"get":{"tags":["v2-parliament-webstreams"],"summary":"EP committee webstreams — meeting URLs + transcripts (multimedia.europarl.europa.eu)","description":"**What it does**\nEvery EP committee meeting webstream URL discovered by Brubru's daily scrape of `multimedia.europarl.europa.eu/en/webstreaming`. Each row carries the multimedia landing-page URL (`public_url`), the direct video URL when extracted, the meeting date, the committee code (LIBE, ENVI, ECON, …), and — when Whisper has run — the transcript metadata (duration, speaker count, word count).\n\n**When to use it**\n- Build per-committee streaming dashboards.\n- Track which committee meetings already have a Brubru transcript.\n- Filter to meetings linked to a specific OEIL procedure file.\n- Drive incremental sync with `updated_from`.\n\n**Input**\n- `committee` — EP committee code (LIBE, ENVI, ECON, IMCO, …).\n- `status` — `PENDING | COMPLETED | FAILED | NOT_AVAILABLE` (transcription status, not the meeting itself).\n- `has_transcript` — true to filter to rows with a transcript already extracted.\n- `procedure_ref` — OEIL reference (e.g. `2024/0123(COD)`) to filter to meetings discussing that file.\n- `q` — substring on title.\n- `published_from` / `published_to` — meeting-date range.\n- `updated_from` / `updated_to` — incremental sync.\n- `limit` (1–100, default 50), `page` (default 1).\n\n**Try it**\n```\nGET /api/v2/parliament/webstreams?committee=LIBE&has_transcript=true\nGET /api/v2/parliament/webstreams?procedure_ref=2024%2F0123(COD)\nGET /api/v2/parliament/webstreams?updated_from=2026-05-01\n```\n\n**You get back**\nPaginated `WebstreamItem` envelope. `public_url` is the meeting's `multimedia.europarl.europa.eu` landing page (real, specific). `meeting_start_date` carries the meeting timestamp. All 5 mandatory v1 datapoints present per row.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC) from EP committee + plenary webstreams (europarl.europa.eu/committees/.../webstreaming). Transcription fires on-demand when chatbot query hits transcript intent.","operationId":"list_webstreams_api_v2_parliament_webstreams_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EP committee code (LIBE, ENVI, ECON, ...)","title":"Committee"},"description":"EP committee code (LIBE, ENVI, ECON, ...)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PENDING | COMPLETED | FAILED | NOT_AVAILABLE","title":"Status"},"description":"PENDING | COMPLETED | FAILED | NOT_AVAILABLE"},{"name":"has_transcript","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"If true, only rows with transcript_text","title":"Has Transcript"},"description":"If true, only rows with transcript_text"},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to streams linked to a procedure","title":"Procedure Ref"},"description":"Filter to streams linked to a procedure"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title","title":"Q"},"description":"Substring on title"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"meeting_date >= value","title":"Published From"},"description":"meeting_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WebstreamItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/webstreams/{stream_id}":{"get":{"tags":["v2-parliament-webstreams"],"summary":"Look up one EP committee webstream by its internal id — metadata + transcript status","description":"**What it does**\nReturns full metadata for one committee-meeting webstream, including the multimedia landing page (`public_url`), direct video URL, meeting date, transcript status, and (when COMPLETED) duration / speaker / word counts.\n\n**When to use it**\nAfter locating a webstream via the list endpoint, use this for the full record — particularly to check transcript status before requesting transcription, or to deep-link into a specific committee meeting in an analysis.\n\n**Input**\n- `stream_id` (path) — `committee_meeting_transcripts.id` (UUID).\n\n**Try it**\n```\nGET /api/v2/parliament/webstreams/{stream_id}\n```\n\n**You get back**\nA `WebstreamItem` with all 5 mandatory v1 datapoints. Follow `public_url` to view/replay the meeting on multimedia.europarl.europa.eu.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC) from EP committee + plenary webstreams (europarl.europa.eu/committees/.../webstreaming). Transcription fires on-demand when chatbot query hits transcript intent.","operationId":"get_webstream_detail_api_v2_parliament_webstreams__stream_id__get","parameters":[{"name":"stream_id","in":"path","required":true,"schema":{"type":"string","title":"Stream Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebstreamItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/webstreams/by-procedure/{procedure_ref}/transcript":{"get":{"tags":["v2-parliament-webstreams"],"summary":"Webstreams linked to a specific legislative procedure — every committee debate end-to-end","description":"**What it does**\nReturns every committee-meeting webstream whose `related_procedure_refs` array contains the given procedure reference (OEIL identifier). Useful for tracking every committee debate of a specific legislative file end-to-end.\n\n**When to use it**\nTo assemble a \"complete debate timeline\" for an advocacy brief on a specific file — pull every meeting where the file appeared, sorted by date, with deep-links to the multimedia replays. Combine with `/api/v2/parliament/amendments?procedure_reference=X` for the amendments tabled at each meeting.\n\n**Input**\n- `procedure_ref` (path) — procedure reference, e.g. `2024/0123(COD)`. URL-encode the slash as `%2F` or use the `:path` matcher which accepts it verbatim.\n- `limit` (1–100, default 50), `page` (default 1).\n\n**Try it**\n```\nGET /api/v2/parliament/webstreams/by-procedure/2024%2F0123(COD)/transcript\n```\n\n**You get back**\nPaginated `WebstreamItem` envelope ordered by meeting_date desc. Each row's `public_url` resolves to the specific multimedia.europarl.europa.eu meeting page. All 5 mandatory v1 datapoints present per row.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC) from EP committee + plenary webstreams (europarl.europa.eu/committees/.../webstreaming). Transcription fires on-demand when chatbot query hits transcript intent.","operationId":"get_webstreams_for_procedure_api_v2_parliament_webstreams_by_procedure__procedure_ref__transcript_get","parameters":[{"name":"procedure_ref","in":"path","required":true,"schema":{"type":"string","title":"Procedure Ref"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WebstreamItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/parliamentary-questions":{"get":{"tags":["v2-parliament-parliamentary-questions"],"summary":"European Parliament questions to Commission, Council or ECB — with answers","description":"**What it does**\nReturns parliamentary questions submitted by MEPs to the Commission, Council, or ECB — written questions, oral questions, priority questions, and Question Time. Each row includes the original question text, the answering institution's reply when published, the asking MEPs, the answering commissioner (when applicable), related procedure/CELEX cross-references, and the canonical citizen URL on doceo.\n\n**When to use it**\nTo track what MEPs are asking on a given policy area, find the official Commission position on an emerging topic before formal legislation drops, or build a \"what's been asked about X\" timeline. The `procedure_ref` filter lets you scope to questions related to a specific legislative file.\n\n**Input**\n- `q` — substring search on subject + question text + answer text.\n- `question_type` — `written` / `oral` / `priority` / `question_time`.\n- `parliamentary_term` — integer (current: 10).\n- `asking_mep_id` — filter to questions asked by a specific MEP.\n- `answering_institution` — `COMMISSION` / `COUNCIL` / `ECB`.\n- `procedure_ref` — OEIL reference (e.g. `2026/0419(COD)`).\n- `committee` — 4-letter committee code (e.g. `ENVI`).\n- `published_from`, `published_to` — date filter on `submitted_date`.\n- `updated_from` — incremental sync (rows where `last_updated >= value`).\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/parliamentary-questions?q=AI%20Act&limit=10\nGET /api/v2/parliament/parliamentary-questions?committee=ENVI&published_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[ParliamentaryQuestionItem]` envelope. Each item carries `question_reference` (e.g. `E-001234/2026`), `question_type`, `subject`, `text_question`, `text_answer`, dates, asking-MEP arrays, `procedure_ref`, `related_celex`, `policy_areas`, `source_url`, `answer_url`, `body_txt` + `body_html` (semantic article with Question + Answer sections), plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from europarl.europa.eu/plenary/en/parliamentary-questions.html. New questions appear on doceo within hours of being tabled; answers can take days to weeks (Commission has up to 6 weeks under Rule 138). Scraper queued; endpoint returns empty result until ingestion completes.","operationId":"list_parliamentary_questions_api_v2_parliament_parliamentary_questions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on subject + question text","title":"Q"},"description":"Substring on subject + question text"},{"name":"question_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"written | oral | priority | question_time","title":"Question Type"},"description":"written | oral | priority | question_time"},{"name":"parliamentary_term","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parliamentary Term"}},{"name":"asking_mep_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asking Mep Id"}},{"name":"answering_institution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"COMMISSION | COUNCIL | ECB","title":"Answering Institution"},"description":"COMMISSION | COUNCIL | ECB"},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"submitted_date >= value","title":"Published From"},"description":"submitted_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ParliamentaryQuestionItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/parliamentary-questions/{question_reference}":{"get":{"tags":["v2-parliament-parliamentary-questions"],"summary":"Look up one parliamentary question by its reference (e.g. E-001234/2026)","description":"**What it does**\nFetches a single parliamentary question by its reference. Returns the same shape as the list endpoint, including the original question text, the official answer when published, and the citizen URL on doceo.\n\n**When to use it**\nAfter locating a question via the list endpoint, use this to get the full text + answer in a deeper-link context (e.g. embedding in a chat response). Common pattern: `q` search → pick a reference → fetch detail.\n\n**Input**\n- `question_reference` (path) — e.g. `E-001234/2026` for a written question or `O-000123/2026` for an oral question. Format: `<TYPE>-<NUMBER>/<YEAR>` where TYPE ∈ {E, O, P, QT}.\n\n**Try it**\n```\nGET /api/v2/parliament/parliamentary-questions/E-001234/2026\n```\n\n**You get back**\nA single `ParliamentaryQuestionItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found` if no question with that reference exists in our mirror.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from europarl.europa.eu. If a question exists on doceo but not in our DB, it means it hasn't been picked up by the latest sync yet (max ~24h lag).","operationId":"get_parl_question_detail_api_v2_parliament_parliamentary_questions__question_reference__get","parameters":[{"name":"question_reference","in":"path","required":true,"schema":{"type":"string","title":"Question Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParliamentaryQuestionItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/emeeting":{"get":{"tags":["v2-parliament-emeeting"],"summary":"EP eMeeting — committee meeting agendas and their documents","description":"**What it does**\nReturns European Parliament committee meeting agendas from eMeeting — one item per committee OJ (agenda). Each agenda carries its full item/document tree in `items`: every agenda item with its OEIL procedure reference, rapporteur(s), and the attached documents (draft reports, amendments, voting lists, compromise amendments) — each document with a direct multi-language PDF URL on the europarl meetdocs store.\n\n**When to use it**\nTo pull the actual working documents for a committee file the moment they are tabled — the richest source of draft reports and amendments, keyed by the OEIL procedure reference so it joins straight to a tracked legislative file.\n\n**Input**\n- `committee` — committee code (AFCO, ENVI, IMCO, LIBE, ...).\n- `procedure_ref` — an OEIL procedure reference (e.g. `2026/2013(INI)`); returns agendas whose items touch that file.\n- `q` — substring search over title / body / OJ reference.\n- `published_from`, `published_to` — bound on the meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/emeeting?committee=AFCO\nGET /api/v2/parliament/emeeting?procedure_ref=2026/2013(INI)\n```\n\n**You get back**\nA `PaginatedResponse[EmeetingAgendaItem]` envelope. Each agenda carries `procedure_refs`, `rapporteurs`, `document_count`, `agenda_pdf_url`, the full `items` tree (document PDF URLs live at `items[].document_sets[].documents[].pdf_url`), and the five envelope datapoints (`public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`).\n\n**Data freshness**\nSynced from the eMeeting open JSON API (no scraping). Bodies are composed at ingest time, so the API never calls eMeeting on the request path.","operationId":"list_emeeting_agendas_api_v2_parliament_emeeting_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Committee code, e.g. AFCO.","title":"Committee"},"description":"Committee code, e.g. AFCO."},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OEIL procedure ref, e.g. 2026/2013(INI).","title":"Procedure Ref"},"description":"OEIL procedure ref, e.g. 2026/2013(INI)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EmeetingAgendaItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/emeeting/{item_id}":{"get":{"tags":["v2-parliament-emeeting"],"summary":"One EP eMeeting agenda by id — full item/document tree","description":"**What it does**\nFetches a single EP committee agenda by its Brubru UUID, with the complete item/document tree: every agenda item, its OEIL procedure reference and rapporteur(s), and all attached documents with their multi-language PDF URLs.\n\n**When to use it**\nAfter locating an agenda via the list endpoint, to pull every document URL (draft reports, amendments, voting lists, compromise amendments) for that committee meeting.\n\n**Input**\n- `item_id` (path) — the Brubru-internal UUID from the list endpoint's `id`.\n\n**Try it**\n```\nGET /api/v2/parliament/emeeting/{item_id}\n```\n\n**You get back**\nA single `EmeetingAgendaItem` with the five datapoints filled and the full `items` tree, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSynced from the eMeeting open JSON API.","operationId":"get_emeeting_agenda_api_v2_parliament_emeeting__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmeetingAgendaItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/emeeting-documents":{"get":{"tags":["v2-parliament-emeeting-documents"],"summary":"EP eMeeting documents — every committee document with all-language PDF URLs","description":"**What it does**\nReturns individual European Parliament committee documents from eMeeting — one item per document (draft reports, amendments, voting lists, compromise amendments, reports, opinions, agendas, minutes). Each carries the document type (`gepro_code`), the PE-number, the OEIL procedure reference, the rapporteur(s), and **every language PDF URL** (`pdf_urls` — up to ~24 languages) on the un-walled europarl meetdocs store.\n\n**When to use it**\nThis is the document-level feed (far more rows than the agenda-level `/emeeting`). Use it to pull, say, every draft report (`gepro_code=PR`) or every amendment (`AM`) for a procedure, or all documents for a committee in a date range, with direct PDF links in any EU language.\n\n**Input**\n- `committee` — committee code (AFCO, ENVI, ...).\n- `doc_kind` — the document category most people want: `draft_report`, `amendment`, `voting_list`, `compromise_amendments`, `agenda`, `minutes`, `report`, `opinion`, `adopted_text`, `miscellaneous`. (Voting lists and compromise amendments both come from the raw `DV` code and are split here by the document filename.)\n- `gepro_code` — the raw eMeeting code if you prefer: `PR`, `AM`, `DV`, `RR`, `AD`, `OJ`, `PV`.\n- `procedure_ref` — OEIL procedure reference (e.g. `2026/2013(INI)`).\n- `q` — substring search over title / reference.\n- `published_from`, `published_to` — bound on the meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/emeeting-documents?doc_kind=draft_report&committee=AFCO\nGET /api/v2/parliament/emeeting-documents?doc_kind=voting_list\nGET /api/v2/parliament/emeeting-documents?doc_kind=compromise_amendments\nGET /api/v2/parliament/emeeting-documents?procedure_ref=2026/2013(INI)\n```\n\n**You get back**\nA `PaginatedResponse[EmeetingDocumentItem]`. Each document carries `pdf_urls` (every language → URL), `reference`, `gepro_code`, `procedure_ref`, `rapporteurs`, and the five envelope datapoints (`public_url` = the EN PDF).\n\n**Data freshness**\nSynced from the eMeeting open JSON API. No scraping; bodies composed at ingest.","operationId":"list_emeeting_documents_api_v2_parliament_emeeting_documents_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"}},{"name":"doc_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Normalised kind: draft_report | amendment | voting_list | compromise_amendments | agenda | minutes | report | opinion | adopted_text | miscellaneous.","title":"Doc Kind"},"description":"Normalised kind: draft_report | amendment | voting_list | compromise_amendments | agenda | minutes | report | opinion | adopted_text | miscellaneous."},{"name":"gepro_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw code: PR | AM | DV | RR | AD | OJ | PV","title":"Gepro Code"},"description":"Raw code: PR | AM | DV | RR | AD | OJ | PV"},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EmeetingDocumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/emeeting-documents/{item_id}":{"get":{"tags":["v2-parliament-emeeting-documents"],"summary":"One EP eMeeting document by id — all-language PDF URLs","description":"**What it does**\nFetches a single EP committee document by its Brubru UUID, with every language PDF URL and the full linking metadata (committee, meeting date, OEIL procedure ref, rapporteurs, dossier).\n\n**Input**\n- `item_id` (path) — the Brubru-internal UUID from the list endpoint's `id`.\n\n**Try it**\n```\nGET /api/v2/parliament/emeeting-documents/{item_id}\n```\n\n**You get back**\nA single `EmeetingDocumentItem` with the five datapoints and `pdf_urls` (all languages), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSynced from the eMeeting open JSON API.","operationId":"get_emeeting_document_api_v2_parliament_emeeting_documents__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmeetingDocumentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committee-transcripts":{"get":{"tags":["v2-parliament-committee-transcripts"],"summary":"EP committee meeting transcripts — full AI transcript of committee webstreams","description":"**What it does**\nReturns AI-generated transcripts of European Parliament committee (and subcommittee) meetings, produced from the EP Multimedia Centre webstream recordings. Each row carries the committee, meeting date, title, word count, duration, mapped agenda items, the procedure references discussed, and a link to the official recording. This is the textual companion to `/api/v2/parliament/webstreams` (which gives the stream URL + transcript status); this endpoint gives the transcript content itself.\n\n**When to use it**\nTo read what was actually said in a committee debate — search a committee's deliberations, pull every meeting that discussed a given procedure, or feed a verbatim debate record into your own analysis. For the official summary record instead, use `/api/v2/parliament/committees/{code}/minutes`.\n\n**Input**\n- `committee` — EP committee/subcommittee code (e.g. `LIBE`, `ENVI`, `DROI`).\n- `procedure_reference` — return only meetings that discussed this procedure (e.g. `2024/0079(COD)`); matches the transcript's mapped `related_procedure_refs`.\n- `q` — substring search across the meeting title and the transcript text.\n- `has_transcript` — `true` (default) returns only meetings with a completed transcript; set `false` to also see scheduled/pending/failed rows.\n- `status` — filter on processing status (`completed`, `pending`, `transcribing`, `failed`).\n- `published_from` / `published_to` (aliased `date_from` / `date_to`) — `meeting_date` range.\n- `updated_from` — rows updated at/after this timestamp (incremental sync).\n- `body_threshold` — minimum transcript length (chars) for `has_body=true`. Default 500.\n- `limit` (default 10, max 50 — bodies are always returned and each is large), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/committee-transcripts?committee=LIBE\nGET /api/v2/parliament/committee-transcripts?procedure_reference=2024/0079(COD)\nGET /api/v2/parliament/committee-transcripts?committee=ENVI&limit=3\n```\n\n**You get back**\nA `PaginatedResponse[CommitteeTranscriptOut]`. Each row carries `committee_code`, `title`, `meeting_date`, `word_count`, `duration_seconds`, `speaker_count`, `agenda_items[]`, `related_procedure_refs[]`, plus the 5 envelope datapoints: `public_url` (the recording page), `body_txt` + `body_html` (the full transcript — always populated when a transcript exists), `document_date` (the meeting date), and `creation_date` (when Brubru transcribed it).\n\n**Data freshness**\nTranscribed from EP Multimedia Centre recordings via OpenAI Whisper (`backend/scripts/transcribe_pending_committees.py`). New committee recordings appear on the Multimedia Centre within hours of a meeting; transcription runs as a batch job after the recording is published.","operationId":"list_committee_transcripts_api_v2_parliament_committee_transcripts_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EP committee/subcommittee code (e.g. LIBE).","title":"Committee"},"description":"EP committee/subcommittee code (e.g. LIBE)."},{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Return only meetings that discussed this procedure ref.","title":"Procedure Reference"},"description":"Return only meetings that discussed this procedure ref."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search on title + transcript text.","title":"Q"},"description":"Substring search on title + transcript text."},{"name":"has_transcript","in":"query","required":false,"schema":{"type":"boolean","description":"True (default) = only meetings with a completed transcript.","default":true,"title":"Has Transcript"},"description":"True (default) = only meetings with a completed transcript."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"completed | pending | transcribing | failed","title":"Status"},"description":"completed | pending | transcribing | failed"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Items per page (default 10, max 50 — full body is always returned, each transcript is large).","default":10,"title":"Limit"},"description":"Items per page (default 10, max 50 — full body is always returned, each transcript is large)."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CommitteeTranscriptOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committee-transcripts/{transcript_id}":{"get":{"tags":["v2-parliament-committee-transcripts"],"summary":"One committee meeting transcript by id — full transcript text + HTML","description":"**What it does**\nFetches a single committee meeting transcript by its Brubru-internal UUID, always with the full body: `body_txt` (the verbatim Whisper transcript) and `body_html` (the same text structured one paragraph per segment, with speaker labels when known).\n\n**When to use it**\nAfter locating a meeting via the list endpoint, use this to pull the complete transcript for display or downstream processing.\n\n**Input**\n- `transcript_id` (path) — the Brubru-internal UUID from the list endpoint's `id`.\n\n**Try it**\n```\nGET /api/v2/parliament/committee-transcripts/{transcript_id}\n```\n\n**You get back**\nA single `CommitteeTranscriptOut` (same shape as the list endpoint's `data[i]`), always with `body_txt` + `body_html` populated when a transcript exists, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nTranscribed from EP Multimedia Centre recordings via OpenAI Whisper. Re-transcription updates `creation_date` (transcribed_at).","operationId":"get_committee_transcript_detail_api_v2_parliament_committee_transcripts__transcript_id__get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeTranscriptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committee-agendas":{"get":{"tags":["v2-parliament-committee-agendas"],"summary":"EP committee draft agendas — the order of the day for committee meetings, with full text","description":"**What it does**\nReturns EP committee draft agendas (the official \"order of the day\" for each committee meeting): the committee, the meeting date, the link to the doceo agenda document, the procedure references scheduled for discussion, and the full agenda text (`body_txt` + `body_html`). It tells you what a committee plans to take up before the meeting happens.\n\n**When to use it**\nTo see what is coming up in a committee — which files are tabled for discussion or vote at the next meeting, and the full running order. Pair with `/api/v2/parliament/committees/{code}/minutes` (what happened) and `/api/v2/parliament/committee-transcripts` (what was said).\n\n**Input**\n- `committee` — EP committee/subcommittee code (e.g. `LIBE`, `ENVI`).\n- `procedure_reference` — only agendas that scheduled this procedure (e.g. `2024/0079(COD)`).\n- `q` — substring search on the agenda title.\n- `upcoming` — `true` returns only agendas dated today or later (the planning view); default `false` returns all.\n- `published_from` / `published_to` (aliased `date_from` / `date_to`) — meeting-date range.\n- `updated_from` — rows updated at/after this timestamp (incremental sync).\n- `body_threshold` — minimum agenda-text length (chars) for `has_body=true`. Default 500.\n- `limit` (default 10, max 25 — the agenda document is fetched + cached on first access), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/parliament/committee-agendas?committee=LIBE&upcoming=true\nGET /api/v2/parliament/committee-agendas?procedure_reference=2024/0079(COD)\n```\n\n**You get back**\nA `PaginatedResponse[CommitteeAgendaOut]`. Each row carries `committee_code`, `title`, `meeting_date`, `procedure_refs[]`, plus the 5 envelope datapoints: `public_url` (the agenda document), `body_txt` + `body_html` (the agenda text), `document_date` (the meeting date), and `creation_date`. `has_body` is true once the agenda document has been fetched.\n\n**Data freshness**\nAgenda metadata syncs from the EP committee pages (`backend/services/scrapers/committee_agenda_sync_service.py`); draft agendas appear ~1 week before a meeting. The agenda document body is fetched from doceo on first access and cached.","operationId":"list_committee_agendas_api_v2_parliament_committee_agendas_get","parameters":[{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EP committee/subcommittee code (e.g. LIBE).","title":"Committee"},"description":"EP committee/subcommittee code (e.g. LIBE)."},{"name":"procedure_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only agendas that scheduled this procedure ref.","title":"Procedure Reference"},"description":"Only agendas that scheduled this procedure ref."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search on the agenda title.","title":"Q"},"description":"Substring search on the agenda title."},{"name":"upcoming","in":"query","required":false,"schema":{"type":"boolean","description":"True = only agendas dated today or later.","default":false,"title":"Upcoming"},"description":"True = only agendas dated today or later."},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Items per page (default 10, max 25 — each agenda document is fetched + cached on first access).","default":10,"title":"Limit"},"description":"Items per page (default 10, max 25 — each agenda document is fetched + cached on first access)."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CommitteeAgendaOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/committee-agendas/{event_id}":{"get":{"tags":["v2-parliament-committee-agendas"],"summary":"One committee draft agenda by id — full agenda text + HTML","description":"**What it does**\nFetches a single committee draft agenda by its Brubru-internal calendar-event UUID, with the full agenda document body (`body_txt` + `body_html`).\n\n**When to use it**\nAfter locating an agenda via the list endpoint, use this to pull the complete order of the day.\n\n**Input**\n- `event_id` (path) — the Brubru-internal UUID from the list endpoint's `id`.\n\n**Try it**\n```\nGET /api/v2/parliament/committee-agendas/{event_id}\n```\n\n**You get back**\nA single `CommitteeAgendaOut` (same shape as the list endpoint's `data[i]`), with `body_txt` + `body_html` populated when the agenda document is reachable, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nAgenda body fetched from doceo on first access and cached on the event.","operationId":"get_committee_agenda_detail_api_v2_parliament_committee_agendas__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeAgendaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/mep-declarations":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — MEP declarations of financial interests (newest first)","description":"**What it does**\nLists the European Parliament's MEP declarations of financial interests, newest first. One entry per current Member of the European Parliament with a direct link to that MEP's declaration of financial (private) interests for the current term, plus the MEP's name and country. Filter with q (e.g. an MEP name or a country code such as 'DEU').\n\n**When to use it**\nTrack what the EP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /mep-declarations?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EP Open Data Portal (current Members) plus the per-MEP declarations pages..","operationId":"list_ep_api_v2_parliament_mep_declarations_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/mep-declarations/{item_id}":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — one MEP declarations of financial interest (full body)","description":"**What it does**\nReturns one the European Parliament MEP declarations of financial interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /mep-declarations/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EP Open Data Portal (current Members) plus the per-MEP declarations pages..","operationId":"detail_ep_api_v2_parliament_mep_declarations__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/mep-assistants":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — MEP assistant registers (newest first)","description":"**What it does**\nLists the European Parliament's MEP assistant registers, newest first. One entry per current Member of the European Parliament listing their accredited parliamentary assistants and local assistants, with the MEP's name and country, linking to the assistants page. Filter with q (e.g. an MEP name, an assistant name or a country code).\n\n**When to use it**\nTrack what the EP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /mep-assistants?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from every current MEP's assistants page (accredited and local parliamentary assistants)..","operationId":"list_ep_api_v2_parliament_mep_assistants_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/mep-assistants/{item_id}":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — one MEP assistant register (full body)","description":"**What it does**\nReturns one the European Parliament MEP assistant register in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /mep-assistants/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from every current MEP's assistants page (accredited and local parliamentary assistants)..","operationId":"detail_ep_api_v2_parliament_mep_assistants__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/supporting-analyses":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — committee supporting analyses (newest first)","description":"**What it does**\nLists the European Parliament's committee supporting analyses, newest first. One entry per Policy Department document: title, publication type, the committee it was prepared for (when stated), date and reference, with the abstract, linking to the Think Tank document page. Filter with q (e.g. a committee acronym such as ECON or LIBE, a topic, or a document reference).\n\n**When to use it**\nTrack what the EP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /supporting-analyses?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EP Think Tank — the Parliament's Policy Departments, which produce the in-house expertise (studies, in-depth analyses, briefings, at-a-glance notes) that committees commission to support their legislative work..","operationId":"list_ep_api_v2_parliament_supporting_analyses_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/parliament/supporting-analyses/{item_id}":{"get":{"tags":["v2-parliament"],"summary":"the European Parliament — one committee supporting analyse (full body)","description":"**What it does**\nReturns one the European Parliament committee supporting analyse in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /supporting-analyses/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EP Think Tank — the Parliament's Policy Departments, which produce the in-house expertise (studies, in-depth analyses, briefings, at-a-glance notes) that committees commission to support their legislative work..","operationId":"detail_ep_api_v2_parliament_supporting_analyses__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/commissioners":{"get":{"tags":["v2-commission-commissioners"],"summary":"College of Commissioners with portfolios + meeting-agenda URLs (live)","description":"**What it does**\nReturns all 27 members of the Von der Leyen II College — for each commissioner: a stable slug, full name, portfolio title, country, the bio page on commission.europa.eu, and three working URLs to their meeting agenda: a filtered view of the unified calendar (per-commissioner), the always-working unified-calendar entry point, and a slot for a PDF agenda (most commissioners don't publish one).\n\n**When to use it**\nTo drive a commissioner dropdown in a UI, fetch a specific commissioner's meeting calendar, or label which commissioner owns a given policy file. The slugs are reused as the `commissioner_slug` filter on `/api/v1/publications`, `/api/v1/calendar`, and `/api/v2/commission/commissioners/{slug}/agenda`.\n\n**Input**\nNo parameters. Requires an `X-API-Key` header.\n\n**Try it**\n```\nGET /api/v2/commission/commissioners\n```\n\n**You get back**\nA `_GenericListResponse` with `total: 27` and `data` (alphabetical by name) — each item has `slug`, `name`, `portfolio`, `country` (ISO-2 lowercase), `bio_url`, `agenda_url` (filtered unified-calendar URL when leader_id known), `agenda_pdf_url`, `unified_calendar_url`. The 5 envelope-level datapoints are null because this is a reference enumeration.\n\n**Data freshness**\nReads from `backend/data/commissioners.json` (hand-curated) + on-demand bio-page hydration to resolve each commissioner's `leader_id` for the filtered-calendar URL (24h cached client-side). Reshuffles or portfolio changes apply on Brubru redeploy after manual JSON update. Typically refreshed weekly via the Friday sweep.","operationId":"list_commissioners_api_v2_commission_commissioners_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_GenericListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/commissioners/{slug}":{"get":{"tags":["v2-commission-commissioners"],"summary":"Look up one Commissioner profile by slug — bio + portfolio + agenda URLs","description":"**What it does**\nProfile-only view of one Commission College member. Returns the same shape as a row from `GET /commissioners` — name, portfolio, country, bio URL, plus three working URLs to their meeting agenda (filtered unified-calendar URL, agenda PDF, unified-calendar entry point). Does NOT return the agenda items themselves — for that, call `GET /commissioners/{slug}/agenda`.\n\n**When to use it**\nAfter locating a commissioner via the list endpoint, use this for the profile-only view (no agenda fetch overhead). Useful when embedding a commissioner card without needing the full meeting list.\n\n**Input**\n- `slug` (path) — commissioner slug (stable kebab-case form of their name).\n\n**Try it**\n```\nGET /api/v2/commission/commissioners/von-der-leyen\nGET /api/v2/commission/commissioners/ribera\n```\n\n**You get back**\nA single `CommissionerProfileOut` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nReads from `backend/data/commissioners.json` (hand-curated) + on-demand bio-page hydration (24h client cache). Refreshed on Brubru redeploy after manual JSON updates.","operationId":"get_profile_api_v2_commission_commissioners__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissionerProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/commissioners/{name}/agenda":{"get":{"tags":["v2-commission-commissioners"],"summary":"Calendar events for one Commissioner — meetings, speeches, College sessions","description":"**What it does**\nReturns the live calendar of meeting events for one Commission College member — meetings with lobbyists / industry / NGOs, public speeches, College sessions, summit attendance. Name resolution is accent-insensitive and accepts the full name, the slug, or known nicknames (e.g. `ribera` → Teresa Ribera).\n\n**When to use it**\nFor lobbying-transparency work: \"who did Ribera meet last month?\", \"what speeches did the President give in May?\", or \"show me Hoekstra's upcoming public events\". Combined with `/api/v2/commission/meetings`, gives you a full picture of a Commissioner's engagement.\n\n**Input**\n- `name` (path) — full name, slug, or nickname (accent-insensitive).\n- `date_from`, `date_to` — date filter on agenda items.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/commissioners/ribera/agenda?date_from=2026-05-01\nGET /api/v2/commission/commissioners/Von der Leyen/agenda\n```\n\n**You get back**\nA `PaginatedResponse[AgendaItemOut]` envelope. Each item carries the meeting date/time, title, location, type (meeting / speech / college session), and participants where available.\n\n**Data freshness**\nLive pull from the Commission's calendar items page (commission.europa.eu/about/organisation/college-commissioners/calendar-items-president-and-commissioners_en), with a 24h client cache per commissioner. Commissioners' agendas are updated by their Cabinet within hours of confirmation.","operationId":"get_agenda_api_v2_commission_commissioners__name__agenda_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AgendaItemOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/commission-register-documents":{"get":{"tags":["v2-commission-commission-register"],"summary":"Commission Transparency Register — College agendas, minutes, COM proposals, SWD, impact assessments","description":"**What it does**\nReturns documents from the Commission Transparency Register — College of Commissioners agendas (tentative + final), College minutes (PV), Commission proposals (COM), staff working documents (SWD), inter-service consultations (SEC), joint proposals (JOIN), and Regulatory Scrutiny Board opinions on impact assessments. Each row exposes the direct PDF URL where available, falling back to the Cellar resolver for adopted acts with a CELEX (returns the canonical EN PDF).\n\n**When to use it**\nThe single most useful surface for College-of-Commissioners tracking. Filter by `document_register_category=TENTAT_AGENDA_COM_MEETING` to see the upcoming tentative College agendas (which signal what's about to be adopted); by `PV` to see the post-meeting minutes (which confirm what WAS adopted); by `OPIN_IMPACT_ASSESS` to see RSB scrutiny on the file before it lands.\n\n**Input**\n- `q` — substring on title + reference.\n- `doc_type` — `COM` / `SWD` / `SEC` / `C` / `JOIN` / `OJ` / `PV`.\n- `document_register_category` — `AGENDA_COM_MEETING` / `TENTAT_AGENDA_COM_MEETING` / `PV` / `OPIN_IMPACT_ASSESS` / `IMPACT_ASSESS` / `OJ`.\n- `dg_responsible` — DG code.\n- `procedure_ref` — OEIL reference for cross-linked documents.\n- `celex` — legal identifier cross-link.\n- `has_pdf` — boolean; restrict to rows with a PDF URL.\n- `published_from`, `published_to` (and `published_end` alias).\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/commission-register?document_register_category=TENTAT_AGENDA_COM_MEETING\nGET /api/v2/commission/commission-register?q=AI%20Act&doc_type=COM\n```\n\n**You get back**\nA `PaginatedResponse[CommissionRegisterItem]` envelope. Each item carries reference, title, doc_type, register category, DG, procedure_ref, celex, pdf_url, source_url, dates, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 6 hours (00:00 / 06:00 / 12:00 / 18:00 UTC, hot tier) from ec.europa.eu/transparency/documents-register/. Critical for College tracking — Secretariat-General updates the tentative agenda continuously, and PV minutes appear within days of each College meeting.","operationId":"list_commission_register_documents_api_v2_commission_commission_register_documents_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title + reference","title":"Q"},"description":"Substring on title + reference"},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"COM | SWD | SEC | C | JOIN | OJ | PV","title":"Doc Type"},"description":"COM | SWD | SEC | C | JOIN | OJ | PV"},{"name":"document_register_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AGENDA_COM_MEETING | TENTAT_AGENDA_COM_MEETING | PV | OPIN_IMPACT_ASSESS | IMPACT_ASSESS | OJ","title":"Document Register Category"},"description":"AGENDA_COM_MEETING | TENTAT_AGENDA_COM_MEETING | PV | OPIN_IMPACT_ASSESS | IMPACT_ASSESS | OJ"},{"name":"dg_responsible","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"}},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"}},{"name":"has_pdf","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"If true, only rows with a PDF URL","title":"Has Pdf"},"description":"If true, only rows with a PDF URL"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CommissionRegisterItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/commission-register-documents/{reference}":{"get":{"tags":["v2-commission-commission-register"],"summary":"Look up one Commission Register document by its reference (e.g. COM(2025) 87)","description":"**What it does**\nFetches a single document from the Commission Transparency Register by its reference (COM, SWD, SEC, JOIN, OJ, or PV number). Returns the same shape as the list endpoint, including the direct PDF URL when available.\n\n**When to use it**\nAfter locating a document via the list endpoint, use this for the deep-link. Common pattern: chat user asks about \"COM(2025)87\", you call this, get back the PDF URL + body, and embed it in the answer.\n\n**Input**\n- `reference` (path) — Commission document reference (e.g. `COM(2025) 87`, `SWD(2024) 123`, `SEC(2026) 2564`, `OJ(2026) 2565`, `PV(2026) 2562`). The `:path` matcher accepts parentheses + spaces verbatim — no URL-encoding needed.\n\n**Try it**\n```\nGET /api/v2/commission/commission-register/COM(2025) 87\nGET /api/v2/commission/commission-register/SEC(2026) 2564\n```\n\n**You get back**\nA single `CommissionRegisterItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced every 6 hours from ec.europa.eu/transparency/documents-register/.","operationId":"get_commission_register_detail_api_v2_commission_commission_register_documents__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissionRegisterItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/meetings":{"get":{"tags":["v2-commission-meetings"],"summary":"Commission officials' meetings with interest representatives (Transparency Initiative)","description":"**What it does**\nReturns the meetings between Commission officials (Commissioners, Heads of Cabinet, Directors-General) and external interest representatives — lobbyists, NGOs, trade bodies, member-state representatives — as published under the Transparency Initiative. Each row carries the host (UUID + name + role + DG/cabinet), the meeting date + location + subject, the organisation met, its Transparency Register ID, the participating representatives, and policy-area + related-CELEX tags.\n\n**When to use it**\nTo audit who lobbied which Commissioner on a given topic, build a \"meetings on Topic X\" view for an advocacy campaign, or cross-reference a known lobbyist against the meetings register. Combined with `/api/v1/specialised/transparency-register`, it lets you trace lobbying activity end-to-end (who is registered → who they met → what was discussed).\n\n**Input**\n- `host_uuid` — filter to a specific Commissioner/Cabinet host (UUID from commission.europa.eu).\n- `host_dg` — filter to a specific DG (e.g. `COMP`, `CLIMA`).\n- `organisation_met` — substring match on the organisation name (e.g. `Microsoft`).\n- `transparency_register_id` — filter to a specific registered entity.\n- `q` — substring search on the meeting subject.\n- `published_from`, `published_to` — date filter on `meeting_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/meetings?host_dg=COMP&q=AI\nGET /api/v2/commission/meetings?organisation_met=BusinessEurope&limit=20\n```\n\n**You get back**\nA `PaginatedResponse[TransparencyMeetingItem]` envelope. Each item carries `host_uuid`, `host_name`, `host_role`, `host_dg`, `host_cabinet`, `meeting_date`, `location`, `subject`, `organisation_met`, `transparency_register_id`, `organisation_type`, `representatives` (array of names), `source_url`, `policy_areas`, `related_celex`, plus a composed `body_txt`/`body_html` (subject + participants + organisation) and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/transparencyinitiative/meetings/. Cabinet officials are required to publish meetings within ~2 weeks; daily sync catches them inside that window. Seed host UUIDs: ca175ad3... (President), a2c7c963... (Ribera), 9fd4662a... (Hoekstra).","operationId":"list_meetings_api_v2_commission_meetings_get","parameters":[{"name":"host_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Uuid"}},{"name":"host_dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Dg"}},{"name":"organisation_met","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match","title":"Organisation Met"},"description":"Substring match"},{"name":"transparency_register_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transparency Register Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on subject","title":"Q"},"description":"Substring on subject"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"meeting_date >= value","title":"Published From"},"description":"meeting_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TransparencyMeetingItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/meetings/{meeting_id}":{"get":{"tags":["v2-commission-meetings"],"summary":"Look up one Transparency Initiative meeting by its internal UUID","description":"**What it does**\nFetches a single Transparency Initiative meeting record by its Brubru-internal UUID. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating a meeting via the list endpoint, use this to deep-link into a specific record (e.g. embedded in an advocacy report or a chat answer).\n\n**Input**\n- `meeting_id` (path) — Brubru UUID of the meeting (returned in `id` from the list endpoint).\n\n**Try it**\n```\nGET /api/v2/commission/meetings/<uuid>\n```\n\n**You get back**\nA single `TransparencyMeetingItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found` if no meeting with that UUID exists.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from ec.europa.eu/transparencyinitiative/meetings/.","operationId":"get_meeting_detail_api_v2_commission_meetings__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransparencyMeetingItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/rsb-opinions":{"get":{"tags":["v2-commission-rsb-opinions"],"summary":"Regulatory Scrutiny Board opinions on Commission impact assessments + evaluations","description":"**What it does**\nReturns opinions of the Regulatory Scrutiny Board — the independent body within the Commission that scrutinises impact assessments, evaluations, and fitness checks before they're submitted to the College. Each opinion carries the target initiative (the proposed regulation being assessed), the target DG, the procedure reference, the opinion type (`impact_assessment` / `evaluation` / `fitness_check`), and the verdict (`positive` / `positive_with_reservations` / `negative`).\n\n**When to use it**\nA negative RSB opinion is a red flag that a forthcoming proposal has methodological gaps — often a leading indicator that the College will delay adoption, send the file back for re-work, or amend the impact assessment. Use this endpoint to monitor RSB output on the policy files you care about, or to filter for \"all negative opinions on environment files in 2026\" as a quality signal.\n\n**Input**\n- `target_dg` — DG code (e.g. `CLIMA`, `ENVI`).\n- `procedure_ref` — OEIL reference.\n- `verdict` — `positive` / `positive_with_reservations` / `negative` / `unknown`.\n- `opinion_type` — `impact_assessment` / `evaluation` / `fitness_check`.\n- `q` — substring search on title + summary.\n- `published_from`, `published_to` — date filter on `opinion_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/rsb-opinions?verdict=negative&target_dg=CLIMA\nGET /api/v2/commission/rsb-opinions?q=AI%20Act\n```\n\n**You get back**\nA `PaginatedResponse[RSBOpinionItem]` envelope. Each item carries `opinion_reference`, `title`, `target_initiative`, `target_dg`, `procedure_ref`, `opinion_type`, `verdict`, `opinion_date`, `summary`, `pdf_url`, `source_url`, `policy_areas`, `last_updated`.\n\n**Data freshness**\nSynced once per week (Sunday 05:00 UTC, weekly tier) from commission.europa.eu/law/law-making-process/regulatory-scrutiny-board/. RSB publishes a handful of opinions per month; weekly sync is appropriate. Scraper queued; endpoint returns empty until ingestion completes.","operationId":"list_rsb_opinions_api_v2_commission_rsb_opinions_get","parameters":[{"name":"target_dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Dg"}},{"name":"procedure_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"}},{"name":"verdict","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"positive | positive_with_reservations | negative | unknown","title":"Verdict"},"description":"positive | positive_with_reservations | negative | unknown"},{"name":"opinion_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"impact_assessment | evaluation | fitness_check","title":"Opinion Type"},"description":"impact_assessment | evaluation | fitness_check"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_RSBOpinionItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/rsb-opinions/{opinion_reference}":{"get":{"tags":["v2-commission-rsb-opinions"],"summary":"Look up one Regulatory Scrutiny Board opinion by its reference","description":"**What it does**\nFetches a single RSB opinion by its reference. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating an RSB opinion via the list endpoint, use this to deep-link into a specific record. Common pattern: list with `verdict=negative` to surface red-flag opinions, then drill into each one.\n\n**Input**\n- `opinion_reference` (path) — the RSB opinion reference (format varies; check the list endpoint for examples in the current data).\n\n**Try it**\n```\nGET /api/v2/commission/rsb-opinions/<reference>\n```\n\n**You get back**\nA single `RSBOpinionItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — weekly Sunday 05:00 UTC sync from commission.europa.eu/law/law-making-process/regulatory-scrutiny-board/.","operationId":"get_rsb_detail_api_v2_commission_rsb_opinions__opinion_reference__get","parameters":[{"name":"opinion_reference","in":"path","required":true,"schema":{"type":"string","title":"Opinion Reference"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSBOpinionItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/infringements":{"get":{"tags":["v2-commission-infringements"],"summary":"Commission infringement decisions — Member State legal proceedings (LFN, reasoned opinion, CJEU referral, closure)","description":"**What it does**\nReturns the infringement decisions adopted by the College of Commissioners in the monthly infringement packages — letters of formal notice (LFN, the first warning), reasoned opinions (the second warning), referrals to the Court of Justice (CJEU litigation), and closures (Member State complied). Each row carries the INF reference, the Member State, the procedure stage, the sector, dates, and the decision summary.\n\n**When to use it**\nFor compliance + risk-monitoring work: which Member States have open infringements on a topic, what stages of proceedings the Commission has reached, and what risks of CJEU litigation exist. Filter by `member_state` for one country, by `sector` for a topic.\n\n**Input**\n- `member_state` — ISO-2 (exact 2 chars).\n- `procedure_stage` — substring on stage name (e.g. `formal notice`, `reasoned opinion`).\n- `sector` — substring on sector.\n- `q` — substring on title + summary.\n- `decision_from`, `decision_to` — decision_date filter.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/infringements?member_state=PL&procedure_stage=reasoned%20opinion\nGET /api/v2/commission/infringements?sector=environment&decision_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[InfringementItem]` envelope. Each item carries `inf_reference`, `title`, `summary`, `member_state`, `procedure_stage`, `sector`, `decision_date`, `source_url`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/commission/presscorner. The Commission adopts infringement packages monthly + ad-hoc; daily sync catches them within 24h of adoption. is_test=True fixture rows are filtered out at query time.","operationId":"list_infringements_api_v2_commission_infringements_get","parameters":[{"name":"member_state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":2},{"type":"null"}],"title":"Member State"}},{"name":"procedure_stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Stage"}},{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title/summary","title":"Q"},"description":"Substring match on title/summary"},{"name":"decision_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Decision From"}},{"name":"decision_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Decision To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_InfringementItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/infringements/{inf_reference}":{"get":{"tags":["v2-commission-infringements"],"summary":"Look up one infringement decision by its INF reference","description":"**What it does**\nFetches a single infringement decision by its INF reference. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating an infringement via the list endpoint, use this for the full record + body composition.\n\n**Input**\n- `inf_reference` (path) — INF reference (e.g. `INF(2026)123`). The `:path` matcher accepts parentheses verbatim.\n\n**Try it**\n```\nGET /api/v2/commission/infringements/INF(2026)123\n```\n\n**You get back**\nA single `InfringementItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from ec.europa.eu/commission/presscorner.","operationId":"get_infringement_api_v2_commission_infringements__inf_reference__get","parameters":[{"name":"inf_reference","in":"path","required":true,"schema":{"type":"string","title":"Inf Reference"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfringementItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/consultations":{"get":{"tags":["v2-commission-consultations"],"summary":"EC HaveYourSay consultations + calls for evidence — open, upcoming, closed, outcome-published","description":"**What it does**\nReturns the EC's public consultations from HaveYourSay (ec.europa.eu/info/law/better-regulation/have-your-say) — public consultations, calls for evidence, feedback periods, roadmaps, and inception initiatives. Each row carries the initiative_id, title, status, consultation type, the policy area, the responsible DG, the open + close dates, and the URLs to the consultation page + feedback summary.\n\n**When to use it**\nFor advocacy planning — find open consultations to submit feedback on, track upcoming ones for your sector, or audit which DGs are most consultation-heavy. For per-consultation stakeholder feedback (who responded and what they said), follow up with `/by-initiative/{id}/feedback`.\n\n**Input**\n- `q` — substring on title + description.\n- `status` — `open` / `upcoming` / `closed` / `outcome_published` / `withdrawn`.\n- `consultation_type` — `public_consultation` / `call_for_evidence` / `feedback` / `roadmap` / `initiative`.\n- Date + DG filters as standard.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/consultations?status=open&consultation_type=public_consultation\nGET /api/v2/commission/consultations?q=AI%20Act\n```\n\n**You get back**\nA `PaginatedResponse[ConsultationItem]` envelope. Each item carries `initiative_id` (numeric), `title`, `status`, `consultation_type`, `responsible_dg`, `policy_area`, `open_date`, `close_date`, `feedback_count`, `outcome_summary`, plus the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/info/law/better-regulation/have-your-say. Consultations open and close on known schedules; daily sync is sufficient.","operationId":"list_consultations_api_v2_commission_consultations_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title + description","title":"Q"},"description":"Substring match on title + description"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"open | upcoming | closed | outcome_published | withdrawn","title":"Status"},"description":"open | upcoming | closed | outcome_published | withdrawn"},{"name":"consultation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"public_consultation | call_for_evidence | feedback | roadmap | initiative","title":"Consultation Type"},"description":"public_consultation | call_for_evidence | feedback | roadmap | initiative"},{"name":"dg_responsible","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DG code, e.g. CNECT, JUST","title":"Dg Responsible"},"description":"DG code, e.g. CNECT, JUST"},{"name":"policy_area","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single policy area tag","title":"Policy Area"},"description":"Single policy area tag"},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"start_date >= value","title":"Published From"},"description":"start_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Alias of published_to. 422 if both differ.","title":"Published End"},"description":"Alias of published_to. 422 if both differ."},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"last_updated >= value. Returns rows ordered by last_updated desc when set.","title":"Updated From"},"description":"last_updated >= value. Returns rows ordered by last_updated desc when set."},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Alias of updated_to. 422 if both differ.","title":"Updated End"},"description":"Alias of updated_to. 422 if both differ."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v1___envelope__PaginatedResponse_ConsultationItem___1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/consultations/{initiative_id}":{"get":{"tags":["v2-commission-consultations"],"summary":"Look up one HaveYourSay consultation by its initiative_id — full description + dates","description":"**What it does**\nReturns a single HaveYourSay consultation / call for evidence by its initiative_id. Includes the full description (objectives, scope, target group, outcome summary), dates, responsible DG, status, plus the composed body for embedding.\n\n**When to use it**\nAfter locating a consultation via the list endpoint, use this for the full record — particularly when drafting a feedback submission and you need the consultation's stated objectives + scope in front of you.\n\n**Input**\n- `initiative_id` (path) — numeric initiative ID (e.g. `13693`). Always numeric — the underlying table has a CHECK constraint that forbids non-numeric values.\n\n**Try it**\n```\nGET /api/v2/commission/consultations/13693\nGET /api/v2/commission/consultations/13687\n```\n\n**You get back**\nA single `ConsultationItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — synced once per day at 04:00 UTC.","operationId":"get_consultation_detail_api_v2_commission_consultations__initiative_id__get","parameters":[{"name":"initiative_id","in":"path","required":true,"schema":{"type":"string","title":"Initiative Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v1__consultations__ConsultationItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/consultations/by-initiative/{initiative_id}/feedback":{"get":{"tags":["v2-commission-consultations"],"summary":"Stakeholder feedback on a HaveYourSay consultation — live, paginated, with aggregates","description":"**What it does**\nReturns the stakeholder feedback submitted to the EC HaveYourSay portal for one initiative, plus summary aggregates (totals per country, per stakeholder type) in the same payload — so you get analytics + detail in a single round-trip.\n\n**When to use it**\nFor consultation-tracking work: \"who submitted feedback on the housing-crisis call?\", \"what's the country breakdown of responses to the AI Act?\", or \"which industry associations have weighed in?\". The aggregates give you the macro view; the paginated feedback array gives you per-response detail.\n\n**Input**\n- `initiative_id` (path) — numeric initiative ID. Slug-style call-for-evidence IDs return 422 — only initiatives that accept feedback have numeric IDs.\n- Pagination + filter params for the feedback list.\n\n**Try it**\n```\nGET /api/v2/commission/consultations/by-initiative/13693/feedback?limit=10\n```\n\n**You get back**\nA `FeedbackEnvelope` extending the standard paginated response, with an additional `aggregates` field carrying totals_by_country, totals_by_stakeholder_type, and overall counts. Each feedback row carries the submitter org/individual, country, stakeholder type, position summary, attachment URLs, and submission date.\n\n**Data freshness**\nLive pass-through to the EC HaveYourSay portal, with a 6-hour in-process cache. Feedback closes when the consultation window ends; once closed, the dataset is stable (cache TTL is purely about reducing upstream load).","operationId":"get_feedback_by_initiative_api_v2_commission_consultations_by_initiative__initiative_id__feedback_get","parameters":[{"name":"initiative_id","in":"path","required":true,"schema":{"type":"integer","title":"Initiative Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":3},{"type":"null"}],"title":"Country"}},{"name":"user_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Type"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/competition-cases":{"get":{"tags":["v2-commission"],"summary":"DG COMP competition cases (state aid, antitrust, merger) — live pass-through","description":"**What it does**\nSearches the European Commission's competition case register live — state aid (`SA.*`), antitrust (`AT.*`) and merger (`M.*`) cases handled by DG Competition.\n\n**When to use it**\nTo monitor competition enforcement across all three instruments in one query. For the curated state-aid feed see `/api/v2/commission/state-aid`; for Digital Markets Act cases see `/api/v2/commission/dma-cases`.\n\n**Input**\n- `q` — Lucene query (default `*` = all).\n- `case_instrument` — `SA` | `M` | `AT`.\n- `limit` (max 200), `page`.\n\n**Try it**\n```\nGET /api/v2/commission/competition-cases?case_instrument=SA&q=energy\nGET /api/v2/commission/competition-cases?q=*&limit=20\n```\n\n**You get back**\nA paginated envelope; each case carries the case number, title, instrument, parties, decision date and links, plus the 5 datapoints (`public_url` = the case page).\n\n**Data freshness**\nLive pass-through — queried against the Commission case search at request time.","operationId":"list_competition_cases_api_v2_commission_competition_cases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Lucene query, default '*' = all.","default":"*","title":"Q"},"description":"Lucene query, default '*' = all."},{"name":"case_instrument","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(SA|M|AT)$"},{"type":"null"}],"title":"Case Instrument"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CompetitionCaseItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/competition-cases/{case_number}":{"get":{"tags":["v2-commission"],"summary":"Look up one DG COMP competition case by its case number (e.g. SA.105841)","description":"**What it does**\nFetches one competition case in full by its case number.\n\n**Input**\n`case_number` — e.g. `SA.105841` or `M.10999`.\n\n**Try it**\n```\nGET /api/v2/commission/competition-cases/SA.105841\n```\n\n**You get back**\nA single `CompetitionCaseItem` with the full record + the 5 datapoints, or HTTP 404.\n\n**Data freshness**\nLive pass-through.","operationId":"get_competition_case_api_v2_commission_competition_cases__case_number__get","parameters":[{"name":"case_number","in":"path","required":true,"schema":{"type":"string","description":"Case number, e.g. SA.105841 or M.10999.","title":"Case Number"},"description":"Case number, e.g. SA.105841 or M.10999."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionCaseItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/access2markets/countries":{"get":{"tags":["v2-commission"],"summary":"Access2Markets countries (EU Member States + trade partners)","description":"**What it does**\nReturns the countries Access2Markets covers — EU Member States and trade partners — with ISO codes and an EU-MS flag.\n\n**When to use it**\nTo resolve a country to its Access2Markets identifier before looking up tariffs / product rules.\n\n**Input**\n`eu_ms_only` (default false), `limit` (max 500), `page`.\n\n**Try it**\n```\nGET /api/v2/commission/access2markets/countries?eu_ms_only=true\n```\n\n**You get back**\nA paginated list of countries with ISO codes and the EU-MS flag.\n\n**Data freshness**\nLive pass-through from the Access2Markets API.","operationId":"list_a2m_countries_api_v2_commission_access2markets_countries_get","parameters":[{"name":"eu_ms_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Eu Ms Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":250,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CountryItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/access2markets/products":{"get":{"tags":["v2-commission"],"summary":"Access2Markets Combined Nomenclature (CN) products","description":"**What it does**\nReturns the Combined Nomenclature (CN) product tree used by Access2Markets — the goods classification underpinning EU tariffs and trade rules.\n\n**When to use it**\nTo find the CN code for a product before querying tariffs / rules of origin. Filter by `q` (description substring) and `level` (CN tree depth).\n\n**Input**\n`q`, `level` (2-10), `limit` (max 500), `page`.\n\n**Try it**\n```\nGET /api/v2/commission/access2markets/products?q=wine&level=4\n```\n\n**You get back**\nA paginated list of CN nodes with code, description, level and parent code.\n\n**Data freshness**\nLive pass-through from the Access2Markets nomenclature API.","operationId":"list_a2m_products_api_v2_commission_access2markets_products_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10,"minimum":2},{"type":"null"}],"title":"Level"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProductItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/access2markets/last-update":{"get":{"tags":["v2-commission"],"summary":"Access2Markets data freshness — timestamp of the last upstream refresh","description":"**What it does**\nReturns the timestamp of the last upstream refresh of the Access2Markets data.\n\n**When to use it**\nA cheap freshness probe before relying on the country / product data.\n\n**Try it**\n```\nGET /api/v2/commission/access2markets/last-update\n```\n\n**You get back**\nA `FreshnessInfo` with the last-update timestamp.\n\n**Data freshness**\nLive pass-through.","operationId":"a2m_last_update_api_v2_commission_access2markets_last_update_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreshnessInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/tris-notifications":{"get":{"tags":["v2-commission-tris-notifications"],"summary":"Member State notifications of national technical regulations (TRIS, Directive 2015/1535)","description":"**What it does**\nReturns notifications submitted by EU Member States under Directive 2015/1535 — the obligation to notify the Commission of draft national technical regulations that could create barriers to the Single Market (in goods and information-society services). Each row carries the notification reference (e.g. `2026/0123/FR`), the notifying country, the sector, the title + short summary + main content, the standstill period, and the Commission's reaction (detailed opinion / comment / no-reaction).\n\n**When to use it**\nCritical for anyone tracking single-market barriers — a French draft law on packaging waste, a German tax on plastic bags, a Polish ban on a specific chemical — all surface here BEFORE they become national law. The 3-month standstill window gives industry and other Member States time to flag incompatibilities. Trade associations, single-market advocates, and product-compliance teams should monitor this continuously.\n\n**Input**\n- `notifying_country` — ISO-3166-1 alpha-2 (e.g. `FR`, `DE`).\n- `sector` — TRIS sector code (substring).\n- `q` — substring search on title + short summary + main content.\n- `published_from`, `published_to` — date filter on `notification_date`.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/commission/tris-notifications?notifying_country=FR&q=packaging\nGET /api/v2/commission/tris-notifications?sector=N40&published_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[TRISNotificationItem]` envelope. Each item carries `notification_number`, `notifying_country`, `sector`, `title`, `short_summary`, `main_content`, `notification_date`, `standstill_period`, `commission_reaction`, `source_url`, `pdf_url`, `policy_areas`, `related_celex`, body fields, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from technical-regulation-information-system.ec.europa.eu/. Member States submit notifications throughout the day; daily sync catches them. Backed by `services/scrapers/dg_grow/dg_grow_sync_service.py::sync_tris()`.","operationId":"list_tris_notifications_api_v2_commission_tris_notifications_get","parameters":[{"name":"notifying_country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-3166-1 alpha-2, e.g. FR","title":"Notifying Country"},"description":"ISO-3166-1 alpha-2, e.g. FR"},{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TRISNotificationItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/tris-notifications/{notification_number}":{"get":{"tags":["v2-commission-tris-notifications"],"summary":"Look up one TRIS notification by its number (e.g. 2026/0123/FR)","description":"**What it does**\nFetches a single TRIS notification by its reference. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating a TRIS notification via the list endpoint, use this to fetch the full record (including the main content of the draft national regulation) in a deeper-link context — useful for compliance teams analysing whether a specific national draft impacts their product.\n\n**Input**\n- `notification_number` (path) — the TRIS reference, format `YYYY/NNNN/CC` where CC is the ISO country code (e.g. `2026/0123/FR`).\n\n**Try it**\n```\nGET /api/v2/commission/tris-notifications/2026/0123/FR\n```\n\n**You get back**\nA single `TRISNotificationItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from TRIS.","operationId":"get_tris_detail_api_v2_commission_tris_notifications__notification_number__get","parameters":[{"name":"notification_number","in":"path","required":true,"schema":{"type":"string","title":"Notification Number"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TRISNotificationItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/financial-sanctions":{"get":{"tags":["v2-commission"],"summary":"the EU Consolidated Financial Sanctions List — financial sanctions (newest first)","description":"**What it does**\nLists the EU Consolidated Financial Sanctions List's financial sanctions, newest first. Every person, entity and group subject to EU financial sanctions — name and aliases, subject type, sanctions programme, the legal act, citizenship, date/place of birth, identification documents and EU reference number. Filter with q (e.g. a name, country or programme).\n\n**When to use it**\nTrack what the EU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /financial-sanctions?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Consolidated Financial Sanctions List (DG FISMA / FPI), the public FSD full-list export..","operationId":"list_ep_api_v2_commission_financial_sanctions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/financial-sanctions/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the EU Consolidated Financial Sanctions List — one financial sanction (full body)","description":"**What it does**\nReturns one the EU Consolidated Financial Sanctions List financial sanction in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /financial-sanctions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Consolidated Financial Sanctions List (DG FISMA / FPI), the public FSD full-list export..","operationId":"detail_ep_api_v2_commission_financial_sanctions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/research-projects":{"get":{"tags":["v2-commission"],"summary":"CORDIS (the EU research-projects service) — research projects (newest first)","description":"**What it does**\nLists CORDIS (the EU research-projects service)'s research projects, newest first. EU-funded research projects under Horizon Europe — acronym, title, objective, EC contribution, total cost, funding scheme, topic, call, status, start/end dates, grant DOI and keywords, each linking to its CORDIS project page. Filter with q (e.g. an acronym, topic or keyword).\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /research-projects?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from CORDIS — the EU research-projects bulk dataset for Horizon Europe (2021-2027)..","operationId":"list_ep_api_v2_commission_research_projects_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/research-projects/{item_id}":{"get":{"tags":["v2-commission"],"summary":"CORDIS (the EU research-projects service) — one research project (full body)","description":"**What it does**\nReturns one CORDIS (the EU research-projects service) research project in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /research-projects/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from CORDIS — the EU research-projects bulk dataset for Horizon Europe (2021-2027)..","operationId":"detail_ep_api_v2_commission_research_projects__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/tariff-rulings":{"get":{"tags":["v2-commission"],"summary":"EBTI (European Binding Tariff Information) — binding tariff rulings (newest first)","description":"**What it does**\nLists EBTI (European Binding Tariff Information)'s binding tariff rulings, newest first. Binding customs-classification rulings issued by Member State customs authorities — the goods description, assigned CN/TARIC nomenclature code, issuing country, validity dates, status, classification justification and English keywords. Filter with q (e.g. a product, keyword or nomenclature code).\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /tariff-rulings?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EBTI — the European Binding Tariff Information bulk extract (DDS2), most recent two years..","operationId":"list_ep_api_v2_commission_tariff_rulings_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/tariff-rulings/{item_id}":{"get":{"tags":["v2-commission"],"summary":"EBTI (European Binding Tariff Information) — one binding tariff ruling (full body)","description":"**What it does**\nReturns one EBTI (European Binding Tariff Information) binding tariff ruling in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /tariff-rulings/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EBTI — the European Binding Tariff Information bulk extract (DDS2), most recent two years..","operationId":"detail_ep_api_v2_commission_tariff_rulings__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/taric-tariffs":{"get":{"tags":["v2-commission"],"summary":"the Combined Nomenclature (CN), the EU customs tariff — customs goods-classification codes (newest first)","description":"**What it does**\nLists the Combined Nomenclature (CN), the EU customs tariff's customs goods-classification codes, newest first. The classification of goods used across the EU for customs duties and external-trade statistics: the CN code, its classification level (chapter, heading, HS subheading, CN subheading), the English description and the full descriptive definition. Each result links to the live TARIC measures lookup, where the applicable duty rates for that code are shown. Filter with q (e.g. a product such as 'footwear' or 'lithium', or a code such as '8703').\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /taric-tariffs?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from The EU Combined Nomenclature annual table (Eurostat / EU Vocabularies, SKOS), chapters down to 8-digit CN subheadings..","operationId":"list_ep_api_v2_commission_taric_tariffs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/taric-tariffs/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the Combined Nomenclature (CN), the EU customs tariff — one customs goods-classification code (full body)","description":"**What it does**\nReturns one the Combined Nomenclature (CN), the EU customs tariff customs goods-classification code in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /taric-tariffs/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from The EU Combined Nomenclature annual table (Eurostat / EU Vocabularies, SKOS), chapters down to 8-digit CN subheadings..","operationId":"detail_ep_api_v2_commission_taric_tariffs__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/agridata":{"get":{"tags":["v2-commission"],"summary":"the DG AGRI Agri-food data portal — agri-food data series (newest first)","description":"**What it does**\nLists the DG AGRI Agri-food data portal's agri-food data series, newest first. A catalogue of the EU agricultural market-data series — prices, production, trade and CMEF/PMEF indicators across beef, pigmeat, poultry, dairy, cereals, rice, oilseeds, sugar, olive oil, wine, fruit & vegetables, fertiliser, organic and TAXUD customs data. Each result gives the series title, sector, the filter parameters it accepts and a ready-to-run link to the live agri-food API that returns the actual figures. Filter with q (e.g. a sector or 'prices', 'production', 'trade').\n\n**When to use it**\nTrack what DG AGRI is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /agridata?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the DG AGRI Agri-food data portal REST API (the full series catalogue, ~19 sectors)..","operationId":"list_ep_api_v2_commission_agridata_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/agridata/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the DG AGRI Agri-food data portal — one agri-food data serie (full body)","description":"**What it does**\nReturns one the DG AGRI Agri-food data portal agri-food data serie in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /agridata/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the DG AGRI Agri-food data portal REST API (the full series catalogue, ~19 sectors)..","operationId":"detail_ep_api_v2_commission_agridata__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/cap-beneficiaries":{"get":{"tags":["v2-commission"],"summary":"the CAP beneficiaries directory (DG AGRI) — CAP beneficiary portals (newest first)","description":"**What it does**\nLists the CAP beneficiaries directory (DG AGRI)'s CAP beneficiary portals, newest first. Under EU transparency rules the names of Common Agricultural Policy beneficiaries (EAGF direct payments and EAFRD rural-development support) are published by each Member State on its own national portal, not in a single EU dataset. This directory gives one entry per Member State with a direct link to the national portal where the actual beneficiary records can be searched. Filter with q (e.g. a country such as 'Spain' or 'Ireland').\n\n**When to use it**\nTrack what DG AGRI is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /cap-beneficiaries?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the DG AGRI index of national CAP-beneficiary transparency portals (one per Member State)..","operationId":"list_ep_api_v2_commission_cap_beneficiaries_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/cap-beneficiaries/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the CAP beneficiaries directory (DG AGRI) — one CAP beneficiary portal (full body)","description":"**What it does**\nReturns one the CAP beneficiaries directory (DG AGRI) CAP beneficiary portal in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /cap-beneficiaries/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the DG AGRI index of national CAP-beneficiary transparency portals (one per Member State)..","operationId":"detail_ep_api_v2_commission_cap_beneficiaries__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/trade-defence":{"get":{"tags":["v2-commission"],"summary":"the EU trade-defence case database (DG TRADE / TRON) — trade-defence cases (newest first)","description":"**What it does**\nLists the EU trade-defence case database (DG TRADE / TRON)'s trade-defence cases, newest first. The EU's trade-defence cases — anti-dumping, anti-subsidy (countervailing) and safeguard investigations and the measures in force: the product, the proceeding type, the measure status (measures in force, expired, no measure), the countries concerned and the case reference (AD###/AS###), each linking to the case detail page. Filter with q (e.g. a product such as 'steel', a country such as 'China', or a reference such as 'AD734').\n\n**When to use it**\nTrack what DG TRADE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /trade-defence?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission's TRON investigations database (the full EU trade-defence case set)..","operationId":"list_ep_api_v2_commission_trade_defence_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/trade-defence/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the EU trade-defence case database (DG TRADE / TRON) — one trade-defence case (full body)","description":"**What it does**\nReturns one the EU trade-defence case database (DG TRADE / TRON) trade-defence case in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /trade-defence/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission's TRON investigations database (the full EU trade-defence case set)..","operationId":"detail_ep_api_v2_commission_trade_defence__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/comitology":{"get":{"tags":["v2-commission"],"summary":"the Comitology register — comitology committees (newest first)","description":"**What it does**\nLists the Comitology register's comitology committees, newest first. The Member-State committees that assist the Commission when it adopts implementing acts: the committee code, title, lead Directorate-General and whether it is active or abolished. ~628 committees. Filter with q (e.g. a topic such as 'food' or a DG such as 'SANTE').\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /comitology?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Comitology register (the full list of comitology committees)..","operationId":"list_ep_api_v2_commission_comitology_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/comitology/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the Comitology register — one comitology committee (full body)","description":"**What it does**\nReturns one the Comitology register comitology committee in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /comitology/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Comitology register (the full list of comitology committees)..","operationId":"detail_ep_api_v2_commission_comitology__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/expert-groups":{"get":{"tags":["v2-commission"],"summary":"the Register of Commission Expert Groups — expert groups (newest first)","description":"**What it does**\nLists the Register of Commission Expert Groups's expert groups, newest first. The expert groups and sub-groups that advise the Commission in preparing legislation and policy: the group code, name, lead Directorate-General and type (formal, informal, sub-group). ~2,047 entries. Filter with q (e.g. a topic such as 'AI' or a DG name).\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /expert-groups?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Register of Commission Expert Groups (all groups and sub-groups)..","operationId":"list_ep_api_v2_commission_expert_groups_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/expert-groups/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the Register of Commission Expert Groups — one expert group (full body)","description":"**What it does**\nReturns one the Register of Commission Expert Groups expert group in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /expert-groups/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Register of Commission Expert Groups (all groups and sub-groups)..","operationId":"detail_ep_api_v2_commission_expert_groups__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/dma-cases":{"get":{"tags":["v2-commission"],"summary":"the Digital Markets Act case register (DG COMP) — Digital Markets Act cases (newest first)","description":"**What it does**\nLists the Digital Markets Act case register (DG COMP)'s Digital Markets Act cases, newest first. The Commission's Digital Markets Act cases — gatekeeper designations, specification and non-compliance proceedings against the designated gatekeepers (Alphabet, Amazon, Apple, Booking, ByteDance, Meta, Microsoft): the case number, title, type and core platform service concerned, linking to the case page. Filter with q (e.g. 'Apple' or 'app stores').\n\n**When to use it**\nTrack what DG COMP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /dma-cases?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Digital Markets Act cases portal (the full DMA case set)..","operationId":"list_ep_api_v2_commission_dma_cases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/dma-cases/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the Digital Markets Act case register (DG COMP) — one Digital Markets Act case (full body)","description":"**What it does**\nReturns one the Digital Markets Act case register (DG COMP) Digital Markets Act case in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /dma-cases/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Digital Markets Act cases portal (the full DMA case set)..","operationId":"detail_ep_api_v2_commission_dma_cases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/state-aid":{"get":{"tags":["v2-commission"],"summary":"the State aid case register (DG COMP) — State aid cases (newest first)","description":"**What it does**\nLists the State aid case register (DG COMP)'s State aid cases, newest first. The Commission's State aid cases (SA.*): the case number, title, case type, member State, lead Directorate-General, economic sector, aid category and last decision date, linking to the case page. Covers all member states. Filter with q (e.g. a company, a sector such as 'aviation', a member State or a case number such as 'SA.100000').\n\n**When to use it**\nTrack what DG COMP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /state-aid?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU competition case database, State aid cases (the full set, by member state)..","operationId":"list_ep_api_v2_commission_state_aid_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/state-aid/{item_id}":{"get":{"tags":["v2-commission"],"summary":"the State aid case register (DG COMP) — one State aid case (full body)","description":"**What it does**\nReturns one the State aid case register (DG COMP) State aid case in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /state-aid/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU competition case database, State aid cases (the full set, by member state)..","operationId":"detail_ep_api_v2_commission_state_aid__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/rasff":{"get":{"tags":["v2-commission"],"summary":"RASFF (Rapid Alert System for Food and Feed) — RASFF food and feed safety notifications (newest first)","description":"**What it does**\nLists RASFF (Rapid Alert System for Food and Feed)'s RASFF food and feed safety notifications, newest first. Cross-border food, feed and food-contact-material safety notifications between EU/EEA members: the reference, subject, notifying country, product category and type, classification (alert, border rejection, information), risk decision and origin countries. ~31,000 notifications. Filter with q (e.g. a product such as 'fish', a hazard such as 'salmonella' or 'mercury', or a country).\n\n**When to use it**\nTrack what DG SANTE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /rasff?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the RASFF Window consolidated notification search (the full notification set)..","operationId":"list_ep_api_v2_commission_rasff_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/commission/rasff/{item_id}":{"get":{"tags":["v2-commission"],"summary":"RASFF (Rapid Alert System for Food and Feed) — one RASFF food and feed safety notification (full body)","description":"**What it does**\nReturns one RASFF (Rapid Alert System for Food and Feed) RASFF food and feed safety notification in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /rasff/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the RASFF Window consolidated notification search (the full notification set)..","operationId":"detail_ep_api_v2_commission_rasff__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-documents":{"get":{"tags":["v2-council-council-documents"],"summary":"Council of the EU documents — press releases, conclusions, meeting agendas, summits","description":"**What it does**\nReturns a unified feed of Council of the EU + European Council documents and meetings — press releases, Council conclusions, meeting agendas, summit outcomes. Today the surface unions `institutional_publications` (Council-tagged rows) with `eu_calendar_events` for COUNCIL / EUROPEAN_COUNCIL events. A dedicated Council document register scraper (working-party + COREPER docs + Council conclusions full text) is queued.\n\n**When to use it**\nFor tracking Council positions on legislative files (the \"other half\" of EP-Council co-decision), summit conclusions (the political guidance feeding into Commission proposals), and ministerial meetings. The Council moves more slowly than the EP but its political conclusions are the most authoritative signal of where EU policy is heading.\n\n**Input**\n- `q` — substring search.\n- `document_type` — `press_release` / `conclusions` / `meeting_agenda` / etc.\n- `policy_area` — single policy area tag.\n- `published_from`, `published_to` (and `published_end` alias).\n- `updated_from`, `updated_to` (and `updated_end` alias) — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-documents?document_type=conclusions&published_from=2026-01-01\nGET /api/v2/council/council-documents?policy_area=energy\n```\n\n**You get back**\nA `PaginatedResponse[CouncilDocumentItem]` envelope. Each item carries reference, title, document_type, policy_area, dates, source URL, and the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced every 12 hours (02:00 / 14:00 UTC, warm tier) for now — will move to dedicated 6h scraper once the Council document register scraper ships. Meanwhile, this surface unions data from the publications sync (every 6h) and the calendar sync (every 6h).","operationId":"list_council_documents_api_v2_council_council_documents_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"press_release | conclusions | meeting_agenda | ...","title":"Document Type"},"description":"press_release | conclusions | meeting_agenda | ..."},{"name":"policy_area","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"published_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilDocumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-documents/{doc_id}":{"get":{"tags":["v2-council-council-documents"],"summary":"One Council document or meeting by id — full body (text + HTML)","description":"**What it does**\nFetches a single Council of the EU item by its Brubru-internal UUID — either a Council institutional publication (press release, conclusions) or a Council / European Council meeting from the calendar. Returns the same shape as the list endpoint with the 5 datapoints filled: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**When to use it**\nAfter locating an item via the list endpoint, use this to fetch the full record. For publications the body is the stored HTML content (or summary); for meetings the body is composed from the meeting facts (configuration, date, the legislative files on the agenda).\n\n**Input**\n- `doc_id` (path) — the Brubru-internal UUID from the list endpoint's `id`.\n\n**Try it**\n```\nGET /api/v2/council/council-documents/{doc_id}\n```\n\n**You get back**\nA single `CouncilDocumentItem`, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame sources as the list endpoint (publications sync + calendar sync).","operationId":"get_council_document_detail_api_v2_council_council_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilDocumentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-configurations":{"get":{"tags":["v2-council-configurations"],"summary":"Council of the EU configurations — the 10 ministerial formations (+ Eurogroup)","description":"**What it does**\nReturns the ten configurations the Council of the EU meets in (General Affairs, Foreign Affairs, ECOFIN, Justice and Home Affairs, EPSCO, Competitiveness, Transport/Telecommunications/Energy, Agriculture and Fisheries, Environment, Education/Youth/Culture/Sport) plus the informal Eurogroup. For each: the official name, the URL-slug, the consilium public-register entity id, the \"council-meetings-explained\" page, and a deep-link to the calendar filtered to that formation.\n\n**When to use it**\nAs a reference list to drive a configuration picker, to resolve a configuration code to its full name, or to get the canonical consilium URLs for a formation. Pair with `/api/v2/council/council-documents?` (meetings are tagged with `council_configuration`).\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/council/council-configurations\n```\n\n**You get back**\nA `PaginatedResponse[CouncilConfigurationItem]` with one row per configuration: `code`, `name`, `slug`, `register_entity_id`, `consilium_url`, `calendar_filter_url`, `informal`, plus the 5 envelope datapoints (`public_url` = the consilium page, `body_txt`/`body_html` = the description, `document_date` = null, `creation_date` = server time).\n\n**Data freshness**\nStatic reference data — the Council configurations are fixed by the Council's Rules of Procedure.","operationId":"list_council_configurations_api_v2_council_council_configurations_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilConfigurationItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-meetings":{"get":{"tags":["v2-council-meetings"],"summary":"Council of the EU meetings — ministerial meetings with agenda and outcomes","description":"**What it does**\nReturns Council of the EU ministerial meetings (the ten configurations) with their date, configuration, and a body composed from the meeting facts — including the published 'Main results' outcome narrative for recent meetings.\n\n**When to use it**\nTo track what the Council decided in a given configuration (the co-legislator opposite the European Parliament), or to list upcoming and recent ministerial meetings by formation.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-meetings?council_configuration=ECOFIN\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of meetings. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_meetings_api_v2_council_council_meetings_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-meetings/{item_id}":{"get":{"tags":["v2-council-meetings"],"summary":"One Council meeting by id — full body (agenda + outcomes)","description":"Fetch a single Council meeting by its Brubru UUID. Returns the same shape as the list endpoint with the five datapoints filled. 404 with `reason_code: not_found` if absent.","operationId":"get_council_meeting_api_v2_council_council_meetings__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-voting-results":{"get":{"tags":["v2-council-voting-results"],"summary":"Council of the EU voting results — results of public Council votes","description":"**What it does**\nReturns the results of public Council votes from the Council's public document register — the document number (ST/CM), the act being voted, the interinstitutional procedure file, the subject matters, and a link to the full voting-result PDF on the un-walled data.consilium store.\n\n**When to use it**\nTo see how the Council voted on a legislative act (the per-member-state for/against/abstain tally is in the linked PDF), and to join a Council vote to its EP co-decision file via the interinstitutional reference.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-voting-results?interinstitutional_ref=2021/0297(COD)\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of voting-result documents. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_voting_results_api_v2_council_council_voting_results_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-voting-results/{item_id}":{"get":{"tags":["v2-council-voting-results"],"summary":"One Council voting result by id — full body","description":"Fetch a single Council voting-result document by its Brubru UUID. Returns the five datapoints; the per-member-state tally is in the linked PDF. 404 if absent.","operationId":"get_council_voting_result_api_v2_council_council_voting_results__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-register":{"get":{"tags":["v2-council-register"],"summary":"Council of the EU public register — latest documents","description":"**What it does**\nReturns the latest documents from the Council of the EU public document register — working-party notes, meeting documents (CM), Council notes (ST) — each with its document number, date, and a link to the PDF on the un-walled data.consilium store.\n\n**When to use it**\nTo monitor what the Council's working parties and COREPER are circulating in near-real-time — the earliest signal of Council-side legislative activity.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-register?q=working+party\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of register documents. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_register_api_v2_council_council_register_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-register/{item_id}":{"get":{"tags":["v2-council-register"],"summary":"One Council register document by id — full body","description":"Fetch a single Council public-register document by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_council_register_document_api_v2_council_council_register__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-oj-agendas":{"get":{"tags":["v2-council-oj-agendas"],"summary":"Council of the EU OJ agendas — meeting agendas from the OJ of the Council","description":"**What it does**\nReturns the agendas of Council meetings as published in the OJ-of-the-Council section of the public register — one row per configuration meeting, with the agenda document number and a link to the agenda PDF.\n\n**When to use it**\nTo read the formal agenda of a Council meeting (the legal record of what each configuration was convened to decide), ahead of or after the meeting.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-oj-agendas?published_from=2026-01-01\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of meeting-agenda documents. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_oj_agendas_api_v2_council_council_oj_agendas_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-oj-agendas/{item_id}":{"get":{"tags":["v2-council-oj-agendas"],"summary":"One Council OJ agenda by id — full body","description":"Fetch a single Council OJ meeting-agenda document by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_council_oj_agenda_api_v2_council_council_oj_agendas__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-preparatory-bodies":{"get":{"tags":["v2-council-preparatory-bodies"],"summary":"Council of the EU preparatory bodies — COREPER and working-party meetings","description":"**What it does**\nReturns meetings of the Council's preparatory bodies — COREPER I/II and the working parties that do the technical groundwork before ministerial Council meetings.\n\n**When to use it**\nTo track where on the Council ladder a file currently sits (working party -> COREPER -> Council), the most granular view of Council-side progress on a dossier.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-preparatory-bodies?q=land+transport\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of preparatory-body meetings. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_preparatory_bodies_api_v2_council_council_preparatory_bodies_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-preparatory-bodies/{item_id}":{"get":{"tags":["v2-council-preparatory-bodies"],"summary":"One Council preparatory-body meeting by id — full body","description":"Fetch a single Council preparatory-body (COREPER / working party) meeting by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_council_preparatory_body_api_v2_council_council_preparatory_bodies__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-press-releases":{"get":{"tags":["v2-council-press-releases"],"summary":"Council of the EU press releases — press releases and statements","description":"**What it does**\nReturns Council of the EU press releases and statements with their full text body — the official communication of Council decisions, agreements and ministerial remarks.\n\n**When to use it**\nTo read the Council's own account of what it decided, in plain language, the moment it is published — the fastest authoritative narrative of Council outcomes.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-press-releases?q=defence\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of press releases. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_press_releases_api_v2_council_council_press_releases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-press-releases/{item_id}":{"get":{"tags":["v2-council-press-releases"],"summary":"One Council press release by id — full text","description":"Fetch a single Council press release by its Brubru UUID. The body is the full press-release text. Returns the five datapoints. 404 if absent.","operationId":"get_council_press_release_api_v2_council_council_press_releases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-research-papers":{"get":{"tags":["v2-council-research-papers"],"summary":"Council of the EU research papers — ART (Analysis and Research Team) papers","description":"**What it does**\nReturns Council research papers published by the General Secretariat's Analysis and Research Team (ART) — foresight and analytical papers feeding Council strategic discussions. Each row links to the paper PDF.\n\n**When to use it**\nTo mine the Council's in-house strategic analysis — an under-used source of where Council thinking is heading on cross-cutting themes.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-research-papers\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of research papers. `public_url`/`pdf_url` point to the paper PDF. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_research_papers_api_v2_council_council_research_papers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-research-papers/{item_id}":{"get":{"tags":["v2-council-research-papers"],"summary":"One Council research paper by id — full body","description":"Fetch a single Council ART research paper by its Brubru UUID. Returns the five datapoints; `pdf_url` is the paper PDF. 404 if absent.","operationId":"get_council_research_paper_api_v2_council_council_research_papers__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-treaties-agreements":{"get":{"tags":["v2-council-treaties-agreements"],"summary":"Council of the EU treaties & agreements — the Council's treaties database","description":"**What it does**\nReturns a reference entry for the Council of the EU's Treaties and Agreements database (the Council is depositary for many EU international agreements), with the canonical search URL and the database description as the body.\n\n**When to use it**\nAs a pointer to the authoritative Council database of EU treaties and international agreements when you need to look one up by name or party.\n\n**Input**\n- `q` — substring search over title / body / document number.\n- `council_configuration` — GAC / FAC / ECOFIN / JHA / EPSCO / COMPET / TTE / AGRIFISH / ENVI / EYCS (where applicable).\n- `interinstitutional_ref` — exact procedure file (e.g. `2021/0297(COD)`).\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/council/council-treaties-agreements\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` with the treaties-database reference entry. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_council_treaties_agreements_api_v2_council_council_treaties_agreements_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"council_configuration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"}},{"name":"interinstitutional_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/council-treaties-agreements/{item_id}":{"get":{"tags":["v2-council-treaties-agreements"],"summary":"One Council treaties/agreements entry by id — full body","description":"Fetch a single Council treaties-&-agreements entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_council_treaty_agreement_api_v2_council_council_treaties_agreements__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/sanctions-regimes":{"get":{"tags":["v2-council"],"summary":"the Council of the EU — EU sanctions regimes (newest first)","description":"**What it does**\nLists the Council of the EU's EU sanctions regimes, newest first. One entry per sanctions regime: the official specification, target country/theme, the measure types imposed (asset freeze, arms embargo, travel ban, sector bans, etc.), explanatory notes, and the underlying Council Decisions and Regulations with their EUR-Lex links. Filter with q (e.g. a country such as Russia or Belarus, or a measure type).\n\n**When to use it**\nTrack what the Council is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /sanctions-regimes?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Sanctions Map — every EU restrictive-measures regime the Council has decided, with its legal basis, the measures imposed, the target country or theme and explanatory notes..","operationId":"list_ep_api_v2_council_sanctions_regimes_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/council/sanctions-regimes/{item_id}":{"get":{"tags":["v2-council"],"summary":"the Council of the EU — one EU sanctions regime (full body)","description":"**What it does**\nReturns one the Council of the EU EU sanctions regime in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /sanctions-regimes/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Sanctions Map — every EU restrictive-measures regime the Council has decided, with its legal basis, the measures imposed, the target country or theme and explanatory notes..","operationId":"detail_ep_api_v2_council_sanctions_regimes__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-conclusions":{"get":{"tags":["v2-euco-conclusions"],"summary":"European Council conclusions — the conclusions register (2004-present)","description":"**What it does**\nReturns European Council conclusions from the conclusions register — the formal political guidance adopted by the EU heads of state or government at their summits, each with date, document number and a link to the PDF.\n\n**When to use it**\nTo read the most authoritative signal of EU political direction — European Council conclusions set the strategic agenda that Commission proposals and Council decisions follow.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-conclusions?published_from=2025-01-01\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of conclusions documents. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_conclusions_api_v2_european_council_euco_conclusions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-conclusions/{item_id}":{"get":{"tags":["v2-euco-conclusions"],"summary":"One European Council conclusions document by id — full body","description":"Fetch a single European Council conclusions document by its Brubru UUID. Returns the five datapoints. 404 with `reason_code: not_found` if absent.","operationId":"get_euco_conclusion_api_v2_european_council_euco_conclusions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-meetings":{"get":{"tags":["v2-euco-meetings"],"summary":"European Council meetings — summit meetings of EU leaders","description":"**What it does**\nReturns European Council summit meetings (the gatherings of EU heads of state or government), with date and a body composed from the meeting facts plus the published outcomes where available.\n\n**When to use it**\nTo track the European Council summit calendar and outcomes — the apex political meetings of the EU.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-meetings\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of summit meetings. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_meetings_api_v2_european_council_euco_meetings_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-meetings/{item_id}":{"get":{"tags":["v2-euco-meetings"],"summary":"One European Council meeting by id — full body","description":"Fetch a single European Council meeting by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_euco_meeting_api_v2_european_council_euco_meetings__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-euro-summit":{"get":{"tags":["v2-euco-euro-summit"],"summary":"Euro Summit — heads of state or government of the euro area","description":"**What it does**\nReturns the Euro Summit reference — the meeting format that brings together the heads of state or government of the euro-area countries to discuss euro-area governance (distinct from the Eurogroup, which is finance ministers).\n\n**When to use it**\nTo understand the Euro Summit's role and find its meeting calendar — the leaders'-level forum for the euro area.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-euro-summit\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` with the Euro Summit entry. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_euro_summit_api_v2_european_council_euco_euro_summit_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-euro-summit/{item_id}":{"get":{"tags":["v2-euco-euro-summit"],"summary":"One Euro Summit entry by id — full body","description":"Fetch a single Euro Summit entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_euco_euro_summit_api_v2_european_council_euco_euro_summit__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-strategic-agenda":{"get":{"tags":["v2-euco-strategic-agenda"],"summary":"European Council Strategic Agenda 2024-2029","description":"**What it does**\nReturns the European Council's Strategic Agenda 2024-2029 — the five-year political priorities agreed by EU leaders that frame the whole institutional cycle — with the agenda text and a link to the full PDF.\n\n**When to use it**\nTo ground any analysis in the EU's top-level political priorities for the 2024-2029 cycle.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-strategic-agenda\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` with the Strategic Agenda entry. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_strategic_agenda_api_v2_european_council_euco_strategic_agenda_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-strategic-agenda/{item_id}":{"get":{"tags":["v2-euco-strategic-agenda"],"summary":"One Strategic Agenda entry by id — full body","description":"Fetch the Strategic Agenda entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_euco_strategic_agenda_api_v2_european_council_euco_strategic_agenda__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-members":{"get":{"tags":["v2-euco-members"],"summary":"Members of the European Council","description":"**What it does**\nReturns the members of the European Council — the EU heads of state or government, plus the President of the European Council and the President of the European Commission — as a reference entry with the membership listing.\n\n**When to use it**\nAs a reference for who sits on the European Council.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-members\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` with the members entry. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_members_api_v2_european_council_euco_members_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-members/{item_id}":{"get":{"tags":["v2-euco-members"],"summary":"One European Council members entry by id — full body","description":"Fetch the European Council members entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_euco_member_api_v2_european_council_euco_members__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-about":{"get":{"tags":["v2-euco-about"],"summary":"About the European Council — how it works, president, role, history","description":"**What it does**\nReturns institutional reference pages about the European Council — how it works, the President of the European Council, the role/nominations/appointment process, and its history — each with the page text as body.\n\n**When to use it**\nAs background reference on the European Council as an institution.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/european-council/euco-about\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of reference entries. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_euco_about_api_v2_european_council_euco_about_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/european-council/euco-about/{item_id}":{"get":{"tags":["v2-euco-about"],"summary":"One European Council reference page by id — full body","description":"Fetch a single European Council reference page by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_euco_about_api_v2_european_council_euco_about__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-meetings":{"get":{"tags":["v2-eurogroup-meetings"],"summary":"Eurogroup meetings — meetings of euro-area finance ministers","description":"**What it does**\nReturns Eurogroup meetings (the euro-area finance ministers), with date and a body that includes the published 'Main results' outcome narrative for recent meetings — macroeconomic discussions, the digital euro, euro-area competitiveness, and more.\n\n**When to use it**\nTo track what euro-area finance ministers discussed and concluded — the political steer on euro-area economic policy.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/eurogroup/eurogroup-meetings\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of Eurogroup meetings. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_eurogroup_meetings_api_v2_eurogroup_eurogroup_meetings_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-meetings/{item_id}":{"get":{"tags":["v2-eurogroup-meetings"],"summary":"One Eurogroup meeting by id — full body (agenda + outcomes)","description":"Fetch a single Eurogroup meeting by its Brubru UUID. Returns the five datapoints. 404 with `reason_code: not_found` if absent.","operationId":"get_eurogroup_meeting_api_v2_eurogroup_eurogroup_meetings__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-documents":{"get":{"tags":["v2-eurogroup-documents"],"summary":"Eurogroup documents — the Eurogroup document register","description":"**What it does**\nReturns documents from the Eurogroup document register — draft agendas, annotated agendas, summing-up letters, lists of participants, and the President's remarks — each with date and a link to the PDF.\n\n**When to use it**\nTo read the Eurogroup's own meeting documents, especially the summing-up letters that record the outcome of each meeting.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/eurogroup/eurogroup-documents?q=summing-up\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of Eurogroup documents. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_eurogroup_documents_api_v2_eurogroup_eurogroup_documents_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-documents/{item_id}":{"get":{"tags":["v2-eurogroup-documents"],"summary":"One Eurogroup document by id — full body","description":"Fetch a single Eurogroup document by its Brubru UUID. Returns the five datapoints; `pdf_url` is the document PDF. 404 if absent.","operationId":"get_eurogroup_document_api_v2_eurogroup_eurogroup_documents__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-work-programme":{"get":{"tags":["v2-eurogroup-work-programme"],"summary":"Eurogroup work programme","description":"**What it does**\nReturns the Eurogroup work programme — the rolling agenda of priorities the Eurogroup sets itself for the coming period — with the programme text and a link to the PDF.\n\n**When to use it**\nTo see what the Eurogroup plans to work on, the forward calendar of euro-area economic policy themes.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/eurogroup/eurogroup-work-programme\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` with the work-programme entry. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_eurogroup_work_programme_api_v2_eurogroup_eurogroup_work_programme_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-work-programme/{item_id}":{"get":{"tags":["v2-eurogroup-work-programme"],"summary":"One Eurogroup work-programme entry by id — full body","description":"Fetch the Eurogroup work-programme entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_eurogroup_work_programme_api_v2_eurogroup_eurogroup_work_programme__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-members":{"get":{"tags":["v2-eurogroup-members"],"summary":"Members of the Eurogroup","description":"**What it does**\nReturns the members of the Eurogroup — the finance ministers of the euro-area member states, plus the Eurogroup President — including the inclusive-format membership, as a reference entry.\n\n**When to use it**\nAs a reference for who sits in the Eurogroup, in both regular and inclusive formats.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/eurogroup/eurogroup-members\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of members entries. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_eurogroup_members_api_v2_eurogroup_eurogroup_members_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-members/{item_id}":{"get":{"tags":["v2-eurogroup-members"],"summary":"One Eurogroup members entry by id — full body","description":"Fetch a single Eurogroup members entry by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_eurogroup_member_api_v2_eurogroup_eurogroup_members__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-about":{"get":{"tags":["v2-eurogroup-about"],"summary":"About the Eurogroup — how it works, the working group, transparency, history","description":"**What it does**\nReturns institutional reference pages about the Eurogroup — how it works, the Eurogroup Working Group (EWG) that prepares its meetings, its transparency arrangements, and its history — each with the page text as body.\n\n**When to use it**\nAs background reference on the Eurogroup as a body and how it operates.\n\n**Input**\n- `q` — substring search over title / body.\n- `published_from`, `published_to` — bound on the document/meeting date.\n- `updated_from`, `updated_to` — incremental sync on ingest time.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/eurogroup/eurogroup-about\n```\n\n**You get back**\nA `PaginatedResponse[CouncilRegisterItemModel]` of reference entries. Each item carries the five envelope datapoints: `public_url`, `body_txt`, `body_html`, `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from consilium.europa.eu (fresh-context browser fetch) + the un-walled data.consilium PDF store. Bodies are composed/captured at scrape time and stored, so the body is always present and the API never scrapes on the request path.","operationId":"list_eurogroup_about_api_v2_eurogroup_eurogroup_about_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CouncilRegisterItemModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurogroup/eurogroup-about/{item_id}":{"get":{"tags":["v2-eurogroup-about"],"summary":"One Eurogroup reference page by id — full body","description":"Fetch a single Eurogroup reference page by its Brubru UUID. Returns the five datapoints. 404 if absent.","operationId":"get_eurogroup_about_api_v2_eurogroup_eurogroup_about__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilRegisterItemModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/funding-opportunities":{"get":{"tags":["v2-funding-opportunities"],"summary":"EU funding opportunities — open + forthcoming calls across programmes (alternate view)","description":"**What it does**\nReturns EU funding opportunities (calls for proposals) from the Funding & Tenders Portal across Horizon Europe, Digital Europe, CEF, EU4Health, Erasmus+, and other Commission programmes. Each row carries the topic_id, call_id, programme, title, short summary + description, status, type of action, deadlines, budget, source URL, target audience.\n\n**When to use it**\nSame domain as `/api/v1/calls-for-proposals` but a slightly different surface — this one is broader (includes some opportunities not in the calls-for-proposals export). For most use cases, `/api/v1/calls-for-proposals` is the recommended endpoint. This one is preserved for backwards compatibility + a different filtering surface.\n\n**Input**\n- `programme` — substring (e.g. `Horizon`, `CEF`, `Digital Europe`).\n- `status` — `open` / `forthcoming` / `closed` / `under-evaluation`.\n- `type_of_action` — substring.\n- `q` — substring on title + short_summary.\n- `deadline_from`, `deadline_to` — deadline window.\n- `limit` (default 50, max 100), `page` (1-indexed).\n- `body_threshold` — minimum body chars for `has_body=true`.\n\n**Try it**\n```\nGET /api/v1/funding?programme=Horizon&status=open\nGET /api/v1/funding?q=AI&deadline_from=2026-06-01\n```\n\n**You get back**\nA `PaginatedResponse[FundingItem]` envelope. Each item carries `topic_id`, `call_id`, `programme`, `title`, `short_summary`, `description`, `status`, `type_of_action`, `deadline`, `deadline_secondary`, `indicative_budget`, `budget_currency`, `source_url`, `documents_url`, `keywords`, `target_audience`, `published_at`, `last_updated`, body fields + the 5 envelope-level datapoints.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/info/funding-tenders/opportunities/portal. is_test=True fixture rows are filtered out at query time.","operationId":"list_funding_opportunities_api_v2_funding_funding_opportunities_get","parameters":[{"name":"programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme name (Horizon, CEF, Digital Europe, ...)","title":"Programme"},"description":"Programme name (Horizon, CEF, Digital Europe, ...)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"open | forthcoming | closed | under-evaluation","title":"Status"},"description":"open | forthcoming | closed | under-evaluation"},{"name":"type_of_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title/short_summary","title":"Q"},"description":"Substring match on title/short_summary"},{"name":"deadline_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline From"}},{"name":"deadline_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FundingItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/funding-opportunities/{topic_id}":{"get":{"tags":["v2-funding-opportunities"],"summary":"Look up one EU funding opportunity by its topic_id","description":"**What it does**\nFetches a single EU funding opportunity by its topic_id. Returns the same shape as the list endpoint, with the full description + body composition.\n\n**When to use it**\nAfter locating an opportunity via the list endpoint, use this for the full record before drafting a bid.\n\n**Input**\n- `topic_id` (path) — the EU's topic identifier (e.g. `HORIZON-CL5-2026-D2-01-01`). The `:path` matcher accepts hyphens + dots verbatim.\n\n**Try it**\n```\nGET /api/v1/funding/HORIZON-CL5-2026-D2-01-01\n```\n\n**You get back**\nA single `FundingItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from the F&T Portal.","operationId":"get_funding_opportunity_api_v2_funding_funding_opportunities__topic_id__get","parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundingItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-calls-for-proposals":{"get":{"tags":["v2-funding-ft-calls-for-proposals"],"summary":"EU funding calls for proposals — Horizon Europe, Digital Europe, LIFE, EU4Health, Creative Europe, Erasmus+","description":"**What it does**\nReturns calls for grant proposals from the EU Funding & Tenders Portal — the canonical entry point for Commission-managed grant programmes (Horizon Europe, Digital Europe, LIFE, EU4Health, Creative Europe, Erasmus+, EIC, AMIF, ISF, BMVI, JTM, etc.). Each row carries the topic_id (the EU's identifier, e.g. `HORIZON-CL5-2026-D2-01-01`), the framework programme, the type of action (RIA / IA / CSA / CoFund / etc.), the status (open / forthcoming / closed / under-evaluation), the deadline, the budget, and a body composed from title + objective + scope.\n\n**When to use it**\nFor consultancies, universities, research orgs, and SMEs looking for non-procurement funding. Combine with `/api/v1/funded-projects` to see \"what's been funded under this programme\" → \"what's currently open\". Default ordering puts most recent deadlines first so partners land on actionable opportunities.\n\n**Input**\n- `framework_programme` — substring match (e.g. `Horizon Europe`, `Digital Europe`, `LIFE`).\n- `status` — `open` / `forthcoming` / `closed` / `under-evaluation`.\n- `type_of_action` — substring (e.g. `RIA`, `IA`, `CSA`).\n- `q` — substring search on title + description.\n- `deadline_from`, `deadline_to` — deadline window (use to find calls closing in your bidding-feasible range).\n- `limit` (default 50, max 100), `page` (1-indexed).\n- `body_threshold` — minimum body chars for `has_body=true`.\n\n**Try it**\n```\nGET /api/v1/calls-for-proposals?framework_programme=Horizon&status=open\nGET /api/v1/calls-for-proposals?q=AI&deadline_from=2026-06-01\n```\n\n**You get back**\nA `PaginatedResponse[FtCallProposalItem]` envelope. Each item carries `topic_id`, `title`, `framework_programme`, `type_of_action`, `status`, `deadline`, `budget`, `description`, `objective`, `scope`, `expected_outcome`, `participation_eligibility`, `source_url`, `last_updated`, body fields + the 5 envelope-level datapoints (`public_url` = the F&T Portal opportunity page).\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/info/funding-tenders/opportunities/portal/. New calls open / close throughout the day; daily sync catches them. is_test=True seed rows are filtered out at query time.","operationId":"list_calls_for_proposals_api_v2_funding_ft_calls_for_proposals_get","parameters":[{"name":"framework_programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"open | forthcoming | closed | under-evaluation","title":"Status"},"description":"open | forthcoming | closed | under-evaluation"},{"name":"type_of_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title/description","title":"Q"},"description":"Substring match on title/description"},{"name":"deadline_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline From"}},{"name":"deadline_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FtCallProposalItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-calls-for-proposals/{topic_id}":{"get":{"tags":["v2-funding-ft-calls-for-proposals"],"summary":"Look up one funding call for proposals by its EU topic_id","description":"**What it does**\nFetches a single call for proposals by its EU topic identifier. Returns the same shape as the list endpoint, with the full body composed from title + objective + scope + expected outcome.\n\n**When to use it**\nAfter locating a call via the list endpoint, use this for the full record — particularly when you want to embed call details in a bid-tracker or render the scope text in a UI.\n\n**Input**\n- `topic_id` (path) — the EU's identifier, e.g. `HORIZON-CL5-2026-D2-01-01`. The `:path` matcher accepts hyphens + dots verbatim, no URL-encoding needed.\n\n**Try it**\n```\nGET /api/v1/calls-for-proposals/HORIZON-CL5-2026-D2-01-01\n```\n\n**You get back**\nA single `FtCallProposalItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found` (also returned if the row is flagged `is_test=true`).\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from the F&T Portal.","operationId":"get_call_for_proposals_api_v2_funding_ft_calls_for_proposals__topic_id__get","parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FtCallProposalItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-calls-for-tenders":{"get":{"tags":["v2-funding-ft-calls-for-tenders"],"summary":"EU public-procurement tenders from the F&T Portal — distinct from the /tenders TED view","description":"**What it does**\nReturns calls for tenders (public procurement) published by EU institutions and agencies on the Funding & Tenders Portal. Each row carries the tender_reference, the contracting authority (which institution / agency is buying), the contract type, the status, the deadline, the budget, and a body composed from title + description.\n\n**When to use it**\nFor service providers, consultancies, and contractors bidding on EU institutional procurement. This is the F&T Portal-specific view; for the broader TED (Tenders Electronic Daily) feed which covers Member State buyers as well, see `/api/v2/funding/tenders`. The two surfaces overlap for some Commission contracts but TED is the authoritative legal source.\n\n**Input**\n- `contracting_authority` — substring (e.g. `European Commission`, `Frontex`, `EMA`).\n- `status` — F&T tender status enum.\n- `contract_type` — substring (e.g. `services`, `supplies`, `works`).\n- `q` — substring search on title + description.\n- `deadline_from`, `deadline_to` — submission window.\n- `limit` (default 50, max 100), `page` (1-indexed).\n- `body_threshold` — minimum body chars for `has_body=true`.\n\n**Try it**\n```\nGET /api/v1/calls-for-tenders?contracting_authority=Frontex&status=open\nGET /api/v1/calls-for-tenders?q=consultancy&deadline_from=2026-06-01\n```\n\n**You get back**\nA `PaginatedResponse[FtCallTenderItem]` envelope. Each item carries `tender_reference`, `title`, `contracting_authority`, `contract_type`, `status`, `deadline`, `budget`, `description`, `source_url`, `last_updated`, body fields + the 5 envelope-level datapoints (`public_url` = the F&T Portal tender page).\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ec.europa.eu/info/funding-tenders/opportunities/portal/. is_test=True seed rows are filtered out at query time.","operationId":"list_calls_for_tenders_api_v2_funding_ft_calls_for_tenders_get","parameters":[{"name":"contracting_authority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contracting Authority"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"contract_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"deadline_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline From"}},{"name":"deadline_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FtCallTenderItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-calls-for-tenders/{tender_reference}":{"get":{"tags":["v2-funding-ft-calls-for-tenders"],"summary":"Look up one F&T Portal tender by its tender_reference","description":"**What it does**\nFetches a single F&T Portal call for tenders by its EU tender_reference. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating a tender via the list endpoint, use this for the full record. The `:path` matcher accepts the reference verbatim including any slashes / dots / hyphens.\n\n**Input**\n- `tender_reference` (path) — the EU's tender identifier as published on the F&T Portal.\n\n**Try it**\n```\nGET /api/v1/calls-for-tenders/<tender_reference>\n```\n\n**You get back**\nA single `FtCallTenderItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from the F&T Portal.","operationId":"get_call_for_tenders_api_v2_funding_ft_calls_for_tenders__tender_reference__get","parameters":[{"name":"tender_reference","in":"path","required":true,"schema":{"type":"string","title":"Tender Reference"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FtCallTenderItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-funded-projects":{"get":{"tags":["v2-funding-ft-funded-projects"],"summary":"EU grant-funded projects — active + completed results (Horizon Europe, FP7, H2020, sectoral programmes)","description":"**What it does**\nReturns EU-funded grant projects from the Funding & Tenders Portal — both active and completed projects across all framework programmes (Horizon Europe, Horizon 2020, FP7, sectoral programmes like Digital Europe, EU4Health, LIFE, Creative Europe). Each row carries the project_id (e.g. `101082345`), the title, the framework programme, the type of action, the coordinator name + country, the consortium size, the start/end dates, the EU contribution, the total cost, the objective summary, and the project portal URL.\n\n**When to use it**\nFor research orgs and consultancies doing competitive intelligence on EU funding: \"what has the Commission funded on AI in the last 3 years?\", \"which Polish coordinators have run successful Horizon projects?\", \"what are the typical budgets for IA actions in Cluster 5?\". Combine with `/api/v1/calls-for-proposals` to see the call → project pipeline.\n\n**Input**\n- `framework_programme` — substring (e.g. `Horizon Europe`, `Horizon 2020`).\n- `coordinator_country` — ISO-2 (2 chars exact).\n- `type_of_action` — substring (`RIA`, `IA`, `CSA`).\n- `status` — F&T project status enum.\n- `q` — substring search on title + objective.\n- `start_from`, `end_to` — start-date / end-date window.\n- `limit` (default 50, max 100), `page` (1-indexed).\n- `body_threshold` — minimum body chars for `has_body=true`.\n\n**Try it**\n```\nGET /api/v1/funded-projects?framework_programme=Horizon%20Europe&coordinator_country=NL\nGET /api/v1/funded-projects?q=climate&type_of_action=IA\n```\n\n**You get back**\nA `PaginatedResponse[FtFundedProjectItem]` envelope. Each item carries `project_id`, `title`, `framework_programme`, `type_of_action`, `coordinator_name`, `coordinator_country`, `consortium_size`, `start_date`, `end_date`, `eu_contribution`, `total_cost`, `objective`, `status`, `source_url`, `last_updated`, body fields + the 5 envelope-level datapoints (`public_url` = the F&T Portal project page).\n\n**Data freshness**\nSynced once per week (Sunday 05:00 UTC, weekly tier) from ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/projects-results. CORDIS (the more comprehensive research-results portal) is reachable separately via `/api/v1/discover/eurio`. is_test=True seed rows are filtered out at query time.","operationId":"list_funded_projects_api_v2_funding_ft_funded_projects_get","parameters":[{"name":"framework_programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"}},{"name":"coordinator_country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":2},{"type":"null"}],"title":"Coordinator Country"}},{"name":"type_of_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"start_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start From"}},{"name":"end_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FtFundedProjectItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-funded-projects/{project_id}":{"get":{"tags":["v2-funding-ft-funded-projects"],"summary":"Look up one EU-funded project by its grant project_id (numeric)","description":"**What it does**\nFetches a single EU-funded project by its grant project_id. Returns the same shape as the list endpoint.\n\n**When to use it**\nAfter locating a project via the list endpoint, use this for the full record. For richer project metadata (deliverables, consortium members, publications), cross-reference via `/api/v1/discover/eurio/projects/{cordis_id}/consortium` etc.\n\n**Input**\n- `project_id` (path) — the EU grant project id (typically a numeric identifier, e.g. `101082345`).\n\n**Try it**\n```\nGET /api/v1/funded-projects/101082345\n```\n\n**You get back**\nA single `FtFundedProjectItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — weekly Sunday 05:00 UTC sync from the F&T Portal projects-results page.","operationId":"get_funded_project_api_v2_funding_ft_funded_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FtFundedProjectItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/tenders":{"get":{"tags":["v2-funding-tenders"],"summary":"EU public procurement tenders (TED — Tenders Electronic Daily)","description":"**What it does**\nReturns public-procurement tender notices from TED (Tenders Electronic Daily) — the EU's official journal for procurement, where every supplement to the OJ for above-threshold contracts is published. Covers tenders from the Commission, EP, Council, agencies, and Member State buyers obliged to publish at EU level. Each row carries the publication number, the title + description, the buying authority, the procedure type, the CPV codes (Common Procurement Vocabulary), the estimated value, the publication date, the submission deadline, lots information, and an SME-suitability score.\n\n**When to use it**\nFor consultancies / SMEs looking for EU funding opportunities — filter by `cpv_main` for your sector, set `min_value` / `max_value` for relevant contract sizes, and use `deadline_from` / `deadline_to` to scope to bidding-feasible windows. The `sme_suitability_score` (0-1) is Brubru's heuristic on how SME-friendly a tender is based on value + lots + complexity.\n\n**Input**\n- `q` — substring search on title + description + summary.\n- `buyer_country` — ISO-2.\n- `procedure_type` — TED procedure type code.\n- `contract_nature` — `works` / `supplies` / `services`.\n- `cpv_main`, `cpv_code` — CPV filter.\n- `form_type` — TED form code (F02 / F03 / F14 / etc).\n- `min_value`, `max_value` — estimated-value range in EUR.\n- `deadline_from`, `deadline_to` — submission_deadline window.\n- `published_from`, `published_to` — publication date window.\n- `updated_from` — incremental sync.\n- `limit` (default 50, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/tenders?cpv_main=72000000&min_value=50000\nGET /api/v2/funding/tenders?buyer_country=BE&contract_nature=services\n```\n\n**You get back**\nA `PaginatedResponse[TenderItem]` envelope. Each item carries `publication_number`, `notice_id`, `form_type`, `title`, `description`, `official_name`, `buyer_country`, `procedure_type`, `cpv_codes`, `cpv_main`, `contract_nature`, `estimated_value` + `estimated_value_currency`, `publication_date`, `submission_deadline`, `has_lots`, `lot_count`, `ted_url`, `summary`, `sme_suitability_score`, `status`, `last_synced_at`, `updated_at`.\n\n**Data freshness**\nSynced once per day at 04:00 UTC (daily tier) from ted.europa.eu — TED publishes daily by definition (the \"Daily\" in the name). Backed by `backend/scripts/backfill_tenders_description.py`.","operationId":"list_tenders_api_v2_funding_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on title + description + summary","title":"Q"},"description":"Substring on title + description + summary"},{"name":"buyer_country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 3166-1 alpha-2","title":"Buyer Country"},"description":"ISO 3166-1 alpha-2"},{"name":"procedure_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"}},{"name":"contract_nature","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"works | supplies | services","title":"Contract Nature"},"description":"works | supplies | services"},{"name":"cpv_main","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpv Main"}},{"name":"cpv_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match any CPV in cpv_codes","title":"Cpv Code"},"description":"Match any CPV in cpv_codes"},{"name":"form_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"}},{"name":"min_value","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Value"}},{"name":"max_value","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Value"}},{"name":"deadline_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"submission_deadline >= value","title":"Deadline From"},"description":"submission_deadline >= value"},{"name":"deadline_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline To"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"publication_date >= value","title":"Published From"},"description":"publication_date >= value"},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TenderItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/tenders/{tender_id}":{"get":{"tags":["v2-funding-tenders"],"summary":"Look up one TED tender by its internal numeric id","description":"**What it does**\nFetches a single TED tender by its Brubru-internal integer id. Returns the same shape as the list endpoint, including CPV codes + lot details + the TED URL for the official notice.\n\n**When to use it**\nAfter locating a tender via the list endpoint, use this to fetch the full record (with description + all CPV codes) for embedding in a bid-tracker UI.\n\n**Input**\n- `tender_id` (path) — Brubru integer id (returned in `id` from the list endpoint).\n\n**Try it**\n```\nGET /api/v2/funding/tenders/12345\n```\n\n**You get back**\nA single `TenderItem` (same shape as the list endpoint's `data[i]`), or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame as the list endpoint — daily 04:00 UTC sync from ted.europa.eu.","operationId":"get_tender_detail_api_v2_funding_tenders__tender_id__get","parameters":[{"name":"tender_id","in":"path","required":true,"schema":{"type":"integer","title":"Tender Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenderItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-funding-recipients":{"get":{"tags":["v2-funding"],"summary":"the EU Financial Transparency System — EU funding recipients (newest first)","description":"**What it does**\nLists the EU Financial Transparency System's EU funding recipients, newest first. Who received EU money under direct management — beneficiary name, EU commitment amount, funding type (grant, procurement contract, prize, etc.), programme, subject, responsible department, budget line, management type and country, for the most recent complete year. The recipient side of EU funded projects. Filter with q (e.g. a beneficiary, programme or country).\n\n**When to use it**\nTrack what the EC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eu-funding-recipients?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Financial Transparency System (FTS) annual dataset (most recent complete year)..","operationId":"list_ep_api_v2_funding_eu_funding_recipients_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-funding-recipients/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the EU Financial Transparency System — one EU funding recipient (full body)","description":"**What it does**\nReturns one the EU Financial Transparency System EU funding recipient in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eu-funding-recipients/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Financial Transparency System (FTS) annual dataset (most recent complete year)..","operationId":"detail_ep_api_v2_funding_eu_funding_recipients__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efca-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Fisheries Control Agency — EFCA calls for tender (newest first)","description":"**What it does**\nLists the European Fisheries Control Agency's EFCA calls for tender, newest first. The European Fisheries Control Agency's own public procurement: each call for tender with its reference number, status and deadline, linking to the tender page. Decentralised procurement that does not appear in TED below threshold. Filter with q (e.g. a reference or a topic such as 'vessel').\n\n**When to use it**\nTrack what EFCA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /efca-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFCA public-procurement pages (open calls for tender + negotiated procedures)..","operationId":"list_ep_api_v2_funding_efca_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efca-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Fisheries Control Agency — one EFCA calls for tender (full body)","description":"**What it does**\nReturns one the European Fisheries Control Agency EFCA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /efca-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFCA public-procurement pages (open calls for tender + negotiated procedures)..","operationId":"detail_ep_api_v2_funding_efca_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efca-calls":{"get":{"tags":["v2-funding"],"summary":"the European Fisheries Control Agency — EFCA calls for expression of interest (newest first)","description":"**What it does**\nLists the European Fisheries Control Agency's EFCA calls for expression of interest, newest first. EFCA calls for expression of interest (experts, service providers), with reference and deadline. Filter with q.\n\n**When to use it**\nTrack what EFCA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /efca-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFCA calls for expression of interest..","operationId":"list_ep_api_v2_funding_efca_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efca-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Fisheries Control Agency — one EFCA calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Fisheries Control Agency EFCA calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /efca-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFCA calls for expression of interest..","operationId":"detail_ep_api_v2_funding_efca_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cedefop-tenders":{"get":{"tags":["v2-funding"],"summary":"Cedefop — Cedefop calls for tender (newest first)","description":"**What it does**\nLists Cedefop's Cedefop calls for tender, newest first. Cedefop's own public procurement: each call for tender with reference, status and closing date. Decentralised procurement (sub-threshold not in TED). Filter with q.\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /cedefop-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Cedefop public-procurement listing..","operationId":"list_ep_api_v2_funding_cedefop_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cedefop-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"Cedefop — one Cedefop calls for tender (full body)","description":"**What it does**\nReturns one Cedefop Cedefop calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /cedefop-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Cedefop public-procurement listing..","operationId":"detail_ep_api_v2_funding_cedefop_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cedefop-calls":{"get":{"tags":["v2-funding"],"summary":"Cedefop — Cedefop calls for expression of interest (newest first)","description":"**What it does**\nLists Cedefop's Cedefop calls for expression of interest, newest first. Cedefop calls for expression of interest (e.g. lists of remunerated experts), with reference and closing date. Filter with q.\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /cedefop-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Cedefop public-procurement listing (expression-of-interest entries)..","operationId":"list_ep_api_v2_funding_cedefop_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cedefop-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"Cedefop — one Cedefop calls for expression of interest (full body)","description":"**What it does**\nReturns one Cedefop Cedefop calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /cedefop-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Cedefop public-procurement listing (expression-of-interest entries)..","operationId":"detail_ep_api_v2_funding_cedefop_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ema-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Medicines Agency — EMA calls for tender (newest first)","description":"**What it does**\nLists the European Medicines Agency's EMA calls for tender, newest first. The European Medicines Agency's own open procurement: each call for tender with reference and deadline. Filter with q (e.g. a reference or topic).\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /ema-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA procurement & grants listing..","operationId":"list_ep_api_v2_funding_ema_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ema-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Medicines Agency — one EMA calls for tender (full body)","description":"**What it does**\nReturns one the European Medicines Agency EMA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /ema-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA procurement & grants listing..","operationId":"detail_ep_api_v2_funding_ema_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efsa-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Food Safety Authority — EFSA calls for tender (newest first)","description":"**What it does**\nLists the European Food Safety Authority's EFSA calls for tender, newest first. The European Food Safety Authority's own calls for tender, each with its publication and closing dates. Filter with q (e.g. a scientific topic).\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /efsa-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFSA procurement calls listing..","operationId":"list_ep_api_v2_funding_efsa_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/efsa-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Food Safety Authority — one EFSA calls for tender (full body)","description":"**What it does**\nReturns one the European Food Safety Authority EFSA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /efsa-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFSA procurement calls listing..","operationId":"detail_ep_api_v2_funding_efsa_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurojust-tenders":{"get":{"tags":["v2-funding"],"summary":"Eurojust — Eurojust calls for tender (newest first)","description":"**What it does**\nLists Eurojust's Eurojust calls for tender, newest first. Eurojust's own procurement, including the low- and middle-value contracts that are below the EU threshold and never appear in TED. Each with reference, status and closing date. Filter with q (e.g. a reference or a topic such as 'security').\n\n**When to use it**\nTrack what Eurojust is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eurojust-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Eurojust procurement pages (ongoing calls for tender + low/middle-value contracts)..","operationId":"list_ep_api_v2_funding_eurojust_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurojust-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"Eurojust — one Eurojust calls for tender (full body)","description":"**What it does**\nReturns one Eurojust Eurojust calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eurojust-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Eurojust procurement pages (ongoing calls for tender + low/middle-value contracts)..","operationId":"detail_ep_api_v2_funding_eurojust_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/etf-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Training Foundation — ETF calls for tender (newest first)","description":"**What it does**\nLists the European Training Foundation's ETF calls for tender, newest first. The European Training Foundation's own procurement (tenders and expression-of-interest calls), each with its closing date. Filter with q.\n\n**When to use it**\nTrack what ETF is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /etf-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ETF procurement listing..","operationId":"list_ep_api_v2_funding_etf_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/etf-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Training Foundation — one ETF calls for tender (full body)","description":"**What it does**\nReturns one the European Training Foundation ETF calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /etf-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ETF procurement listing..","operationId":"detail_ep_api_v2_funding_etf_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/euaa-calls":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Asylum — EUAA calls for expression of interest (newest first)","description":"**What it does**\nLists the European Union Agency for Asylum's EUAA calls for expression of interest, newest first. EUAA calls for expression of interest (CEIs) such as the list of external remunerated experts in asylum-related fields, with reference and closing date. Headline open tenders are mirrored on the F&T Portal. Filter with q.\n\n**When to use it**\nTrack what EUAA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /euaa-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUAA procurement page..","operationId":"list_ep_api_v2_funding_euaa_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/euaa-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Asylum — one EUAA calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Union Agency for Asylum EUAA calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /euaa-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUAA procurement page..","operationId":"detail_ep_api_v2_funding_euaa_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/euda-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Union Drugs Agency — EUDA calls for tender (newest first)","description":"**What it does**\nLists the European Union Drugs Agency's EUDA calls for tender, newest first. EUDA open procedures — drug-policy development and evaluation, monitoring infrastructure, REITOX network support — each with its TED notice, reference and closing date. Filter with q.\n\n**When to use it**\nTrack what EUDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /euda-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUDA procurement page (mirrors TED notices)..","operationId":"list_ep_api_v2_funding_euda_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/euda-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Drugs Agency — one EUDA calls for tender (full body)","description":"**What it does**\nReturns one the European Union Drugs Agency EUDA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /euda-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUDA procurement page (mirrors TED notices)..","operationId":"detail_ep_api_v2_funding_euda_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/enisa-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Cybersecurity — ENISA calls for tender (newest first)","description":"**What it does**\nLists the European Union Agency for Cybersecurity's ENISA calls for tender, newest first. ENISA cybersecurity tenders — threat landscapes, exercises, certification, training — each with reference and deadline. EOIs are split into the calls endpoint. Filter with q.\n\n**When to use it**\nTrack what ENISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /enisa-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ENISA public-procurement page (mixed open + negotiated + CEI table)..","operationId":"list_ep_api_v2_funding_enisa_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/enisa-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Cybersecurity — one ENISA calls for tender (full body)","description":"**What it does**\nReturns one the European Union Agency for Cybersecurity ENISA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /enisa-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ENISA public-procurement page (mixed open + negotiated + CEI table)..","operationId":"detail_ep_api_v2_funding_enisa_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/enisa-calls":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Cybersecurity — ENISA calls for expression of interest (newest first)","description":"**What it does**\nLists the European Union Agency for Cybersecurity's ENISA calls for expression of interest, newest first. ENISA calls for expression of interest (e.g. external-expert lists). Filter with q.\n\n**When to use it**\nTrack what ENISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /enisa-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ENISA public-procurement page (CEI rows)..","operationId":"list_ep_api_v2_funding_enisa_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/enisa-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Cybersecurity — one ENISA calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Union Agency for Cybersecurity ENISA calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /enisa-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ENISA public-procurement page (CEI rows)..","operationId":"detail_ep_api_v2_funding_enisa_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/era-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Railways — ERA calls for tender (newest first)","description":"**What it does**\nLists the European Union Agency for Railways's ERA calls for tender, newest first. ERA's own procurement — railway-engineering studies, ERTMS support, IT, translation — each with reference (URL slug) and status. Filter with q.\n\n**When to use it**\nTrack what ERA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /era-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ERA procurement listing (open status, listing-item cards)..","operationId":"list_ep_api_v2_funding_era_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/era-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Railways — one ERA calls for tender (full body)","description":"**What it does**\nReturns one the European Union Agency for Railways ERA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /era-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ERA procurement listing (open status, listing-item cards)..","operationId":"detail_ep_api_v2_funding_era_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ecdc-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Centre for Disease Prevention and Control — ECDC calls for tender (newest first)","description":"**What it does**\nLists the European Centre for Disease Prevention and Control's ECDC calls for tender, newest first. ECDC procurement — epidemiological studies, surveillance IT, modelling, training — each with reference and closing date. The agency mixes ex-ante publicity notices with open calls; the listing covers both. Filter with q.\n\n**When to use it**\nTrack what ECDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /ecdc-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECDC procurement-and-grants listing (paginated ct-procurement cards)..","operationId":"list_ep_api_v2_funding_ecdc_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ecdc-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Centre for Disease Prevention and Control — one ECDC calls for tender (full body)","description":"**What it does**\nReturns one the European Centre for Disease Prevention and Control ECDC calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /ecdc-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECDC procurement-and-grants listing (paginated ct-procurement cards)..","operationId":"detail_ep_api_v2_funding_ecdc_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/echa-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Chemicals Agency — ECHA calls for tender (newest first)","description":"**What it does**\nLists the European Chemicals Agency's ECHA calls for tender, newest first. ECHA procurement — IUCLID and REACH-IT IT services, scientific data, translation, chemicals studies. Each call with reference and deadline. CEIs are split into the calls endpoint. Filter with q.\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /echa-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECHA Business Opportunities page (Playwright-rendered, WAF-protected)..","operationId":"list_ep_api_v2_funding_echa_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/echa-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Chemicals Agency — one ECHA calls for tender (full body)","description":"**What it does**\nReturns one the European Chemicals Agency ECHA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /echa-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECHA Business Opportunities page (Playwright-rendered, WAF-protected)..","operationId":"detail_ep_api_v2_funding_echa_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/echa-calls":{"get":{"tags":["v2-funding"],"summary":"the European Chemicals Agency — ECHA calls for expression of interest (newest first)","description":"**What it does**\nLists the European Chemicals Agency's ECHA calls for expression of interest, newest first. ECHA calls for expression of interest (e.g. external-expert lists). Filter with q.\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /echa-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECHA Business Opportunities page (CEI rows)..","operationId":"list_ep_api_v2_funding_echa_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/echa-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Chemicals Agency — one ECHA calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Chemicals Agency ECHA calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /echa-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECHA Business Opportunities page (CEI rows)..","operationId":"detail_ep_api_v2_funding_echa_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eige-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Institute for Gender Equality — EIGE calls for tender (newest first)","description":"**What it does**\nLists the European Institute for Gender Equality's EIGE calls for tender, newest first. EIGE's own procurement — gender-equality research, indicators, communications. The listing is often empty between procurement waves; the endpoint returns [] cleanly when EIGE has no ongoing procedures. Filter with q.\n\n**When to use it**\nTrack what EIGE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eige-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIGE procurement page..","operationId":"list_ep_api_v2_funding_eige_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eige-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Institute for Gender Equality — one EIGE calls for tender (full body)","description":"**What it does**\nReturns one the European Institute for Gender Equality EIGE calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eige-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIGE procurement page..","operationId":"detail_ep_api_v2_funding_eige_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/fra-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Fundamental Rights — FRA calls for tender (newest first)","description":"**What it does**\nLists the European Union Agency for Fundamental Rights's FRA calls for tender, newest first. FRA procurement — fundamental-rights research, multi-country surveys, FRANET country correspondent contracts. Headline FRANET appointments run on a multi-year cycle. Listing returns [] cleanly when no procedures are open. Filter with q.\n\n**When to use it**\nTrack what FRA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /fra-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the FRA Ongoing Procedures page (Playwright-rendered, Anubis-protected)..","operationId":"list_ep_api_v2_funding_fra_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/fra-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Union Agency for Fundamental Rights — one FRA calls for tender (full body)","description":"**What it does**\nReturns one the European Union Agency for Fundamental Rights FRA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /fra-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the FRA Ongoing Procedures page (Playwright-rendered, Anubis-protected)..","operationId":"detail_ep_api_v2_funding_fra_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eea-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Environment Agency — EEA calls for tender (newest first)","description":"**What it does**\nLists the European Environment Agency's EEA calls for tender, newest first. EEA publishes its open calls on the EU F&T Portal rather than on its own site. This endpoint returns an empty list and is wired so the agency is discoverable; EEA opportunities surface via the F&T Portal ingest (ft-calls-for-tenders / -proposals).\n\n**When to use it**\nTrack what EEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eea-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEA procurement-and-grants page (informational; opportunities live on the F&T Portal)..","operationId":"list_ep_api_v2_funding_eea_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eea-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Environment Agency — one EEA calls for tender (full body)","description":"**What it does**\nReturns one the European Environment Agency EEA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eea-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEA procurement-and-grants page (informational; opportunities live on the F&T Portal)..","operationId":"detail_ep_api_v2_funding_eea_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-osha-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Agency for Safety and Health at Work — EU-OSHA calls for tender (newest first)","description":"**What it does**\nLists the European Agency for Safety and Health at Work's EU-OSHA calls for tender, newest first. EU-OSHA procurement — ESENER survey field-work, sectoral occupational-safety studies, Healthy Workplaces campaign communications, IT, translation. Each call with reference and deadline. Filter with q.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eu-osha-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU-OSHA procurement archive (calls_archive/<year>, Drupal views-row)..","operationId":"list_ep_api_v2_funding_eu_osha_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-osha-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Agency for Safety and Health at Work — one EU-OSHA calls for tender (full body)","description":"**What it does**\nReturns one the European Agency for Safety and Health at Work EU-OSHA calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eu-osha-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU-OSHA procurement archive (calls_archive/<year>, Drupal views-row)..","operationId":"detail_ep_api_v2_funding_eu_osha_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-osha-calls":{"get":{"tags":["v2-funding"],"summary":"the European Agency for Safety and Health at Work — EU-OSHA calls for expression of interest (newest first)","description":"**What it does**\nLists the European Agency for Safety and Health at Work's EU-OSHA calls for expression of interest, newest first. EU-OSHA calls for expression of interest (occupational-safety expert pools). Filter with q.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eu-osha-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU-OSHA calls-for-expression-of-interest listing..","operationId":"list_ep_api_v2_funding_eu_osha_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eu-osha-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Agency for Safety and Health at Work — one EU-OSHA calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Agency for Safety and Health at Work EU-OSHA calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eu-osha-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU-OSHA calls-for-expression-of-interest listing..","operationId":"detail_ep_api_v2_funding_eu_osha_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eib-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Investment Bank — EIB calls for tender (newest first)","description":"**What it does**\nLists the European Investment Bank's EIB calls for tender, newest first. EIB corporate procurement — financial advisory, IT, premises, consultancy — pulled from TED rather than EIB's own site (EIB publishes nothing on its site; everything is in TED). Open calls by default; each notice carries reference, procedure type and submission deadline. The first multilateral development bank wired into the Tenderator. Filter with q.\n\n**When to use it**\nTrack what EIB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eib-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the TED public API v3 (buyer-name=European Investment Bank)..","operationId":"list_ep_api_v2_funding_eib_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eib-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Investment Bank — one EIB calls for tender (full body)","description":"**What it does**\nReturns one the European Investment Bank EIB calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eib-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the TED public API v3 (buyer-name=European Investment Bank)..","operationId":"detail_ep_api_v2_funding_eib_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurofound-tenders":{"get":{"tags":["v2-funding"],"summary":"the European Foundation for the Improvement of Living and Working Conditions — Eurofound calls for tender (newest first)","description":"**What it does**\nLists the European Foundation for the Improvement of Living and Working Conditions's Eurofound calls for tender, newest first. Eurofound procurement — large-scale European Working Conditions Survey (EWCS) field-work, industrial-relations correspondents network, secondary analyses, IT, translation. Filter with q.\n\n**When to use it**\nTrack what Eurofound is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eurofound-tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Eurofound procurement sub-pages (above-/below-€140k, Playwright-rendered)..","operationId":"list_ep_api_v2_funding_eurofound_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurofound-tenders/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Foundation for the Improvement of Living and Working Conditions — one Eurofound calls for tender (full body)","description":"**What it does**\nReturns one the European Foundation for the Improvement of Living and Working Conditions Eurofound calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eurofound-tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Eurofound procurement sub-pages (above-/below-€140k, Playwright-rendered)..","operationId":"detail_ep_api_v2_funding_eurofound_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurofound-calls":{"get":{"tags":["v2-funding"],"summary":"the European Foundation for the Improvement of Living and Working Conditions — Eurofound calls for expression of interest (newest first)","description":"**What it does**\nLists the European Foundation for the Improvement of Living and Working Conditions's Eurofound calls for expression of interest, newest first. Eurofound calls for expression of interest (correspondent networks, expert pools). Filter with q.\n\n**When to use it**\nTrack what Eurofound is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eurofound-calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Eurofound expression-of-interest listing (Playwright-rendered)..","operationId":"list_ep_api_v2_funding_eurofound_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eurofound-calls/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the European Foundation for the Improvement of Living and Working Conditions — one Eurofound calls for expression of interest (full body)","description":"**What it does**\nReturns one the European Foundation for the Improvement of Living and Working Conditions Eurofound calls for expression of interest in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eurofound-calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Eurofound expression-of-interest listing (Playwright-rendered)..","operationId":"detail_ep_api_v2_funding_eurofound_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/all":{"get":{"tags":["v2-funding"],"summary":"All EU funding — agency tenders/grants/calls + cohesion-fund allocations, every body","description":"**What it does**\nOne feed of **every EU fund** Brubru covers — the decentralised agency funding items (calls for **tender**, **grants** and calls for **expression of interest**), the per-programme grant calls ingested for their own endpoints (Justice `body=just`, Innovation Fund `body=innovfund`), AND the per-fund cohesion / structural-fund allocations (ERDF, ESF+, Cohesion Fund, JTF, Interreg, EMFAF, AMIF, ISF), the EU Solidarity Fund and the CAP funds (EAGF, EAFRD) — across every body, in one call.\n\n**When to use it**\n\"Show me everything across EU funding\", whether an agency tender, a Justice/Innovation-Fund grant call, or a Member State's cohesion-fund allocation. Filter by `type` (tender/grant/eoi_call/startup_funding/cohesion_allocation/solidarity_case/cap_payment), `body` (agency code or fund code, e.g. `efca`, `erdf`, `just`, `innovfund`), `status`, `q` (free text), and `since`/`until` on the date.\n\n**Input**\n`type`, `body`, `status`, `q` (free text), `since`/`until` (date range), `order`, `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/funding/all?type=cohesion_allocation&body=erdf\nGET /api/v2/funding/all?type=tender&order=recent\nGET /api/v2/funding/all?q=transport\n```\n\n**You get back**\nA paginated list; each item carries `body_code` (the agency or fund), `item_type`, title, a summary, `document_date` and the link. Cohesion allocations carry `item_type=cohesion_allocation` and `public_url` to the fund's Cohesion Open Data page.\n\n**Data freshness**\nLive from the database; agency items refresh as their pages are re-synced; cohesion allocations refresh weekly (Sunday 05:00 UTC).","operationId":"funding_all_api_v2_funding_all_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"tender | grant | eoi_call | startup_funding | cohesion_allocation | solidarity_case | cap_payment","title":"Type"},"description":"tender | grant | eoi_call | startup_funding | cohesion_allocation | solidarity_case | cap_payment"},{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Agency code or fund code, e.g. efca, ema, erdf, esf, jtf.","title":"Body"},"description":"Agency code or fund code, e.g. efca, ema, erdf, esf, jtf."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match on status in the summary (e.g. open, closed).","title":"Status"},"description":"Match on status in the summary (e.g. open, closed)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Deadline on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Deadline on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Deadline on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Deadline on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/startups":{"get":{"tags":["v2-funding"],"summary":"EU startup, scale-up & SME funding — EIC, COSME/EISMEA, Innovation Fund (stage-tagged)","description":"**What it does**\nOne bundled feed of the EU funding a company can actually **apply to** — startups, scale-ups and SMEs — drawn together from the EU Funding & Tenders Portal:\n- **European Innovation Council (EIC)**: Pathfinder (idea), Transition (seed), Pre-Accelerator, **Accelerator** (grant + equity), **STEP Scale-up** (equity), Innovation Challenges and Prizes.\n- **Single Market Programme — COSME / EISMEA**: Enterprise Europe Network, Euroclusters, SME-competitiveness calls.\n- **Innovation Fund** (net-zero / clean-tech) calls — for cleantech startups.\n- Any other F&T-Portal call titled for startups / scale-ups / SMEs.\n\nEach item is tagged with a derived **`stage`** (idea / seed / growth / scale-up / sme) and **`instrument`** (grant / blended / equity / prize), so you can filter by where your company is.\n\n**When to use it**\nFor a founder, scale-up or SME (or an advisor / accelerator) who wants the EU money they can apply to, in one call, instead of digging through the whole portal. Combine `stage=growth&status=open` to find, say, the open Accelerator round.\n\n**Input**\n`stage` (idea | seed | growth | scale-up | sme), `instrument` (grant | blended | equity | prize), `status` (open | forthcoming | closed | under-evaluation), `q` (free text), `deadline_from` / `deadline_to`, `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/funding/startups?status=open\nGET /api/v2/funding/startups?stage=scale-up\nGET /api/v2/funding/startups?instrument=equity\n```\n\n**You get back**\nA `PaginatedResponse[StartupFundingItem]` — each item carries `topic_id` (the stable English id, e.g. `HORIZON-EIC-2026-ACCELERATOR-01`), title, `stage`, `instrument`, status, deadline, budget, description, the F&T Portal link and the 5 datapoints (`body_txt` / `body_html` null on the list — fetch `/startups/{topic_id}` for the full body). Most recent deadlines first.\n\n**Not yet covered**\nEaSI Microfinance (loans ≤ €25k) and InvestEU (equity / guarantees) are useful for founders but Brubru does not yet hold their data. Structural funds (ERDF, ESF+, EMFAF) are excluded here because they are Member-State allocations, not direct-apply calls.\n\n**Data freshness**\nDaily sync from the EU Funding & Tenders Portal (SEDIA).","operationId":"funding_startups_api_v2_funding_startups_get","parameters":[{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"idea | seed | growth | scale-up | sme","title":"Stage"},"description":"idea | seed | growth | scale-up | sme"},{"name":"instrument","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"grant | blended | equity | prize","title":"Instrument"},"description":"grant | blended | equity | prize"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"open | forthcoming | closed | under-evaluation","title":"Status"},"description":"open | forthcoming | closed | under-evaluation"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title/description.","title":"Q"},"description":"Substring match on title/description."},{"name":"deadline_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline From"}},{"name":"deadline_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_StartupFundingItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/startups/{topic_id}":{"get":{"tags":["v2-funding"],"summary":"EU startup funding — one call (full body), by its F&T topic_id","description":"**What it does**\nFetches a single startup-funding call by its EU topic_id, with the full body and the derived `stage` / `instrument` tags.\n\n**When to use it**\nAfter locating a call in the `/startups` list, fetch the complete record (full `body_txt` / `body_html` + the 5 datapoints).\n\n**Input**\n`topic_id` (path) — the EU's identifier, e.g. `HORIZON-EIC-2026-ACCELERATOR-01` or `INNOVFUND-2024-NZT-GENERAL-LSP`.\n\n**Try it**\n```\nGET /api/v2/funding/startups/HORIZON-EIC-2026-ACCELERATOR-01\n```\n\n**You get back**\nA single `StartupFundingItem` (same shape as a list row, with the full body), or HTTP 404 if no such call.\n\n**Data freshness**\nDaily sync from the EU Funding & Tenders Portal (SEDIA).","operationId":"get_startup_funding_api_v2_funding_startups__topic_id__get","parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","description":"The EU topic_id of the call.","title":"Topic Id"},"description":"The EU topic_id of the call."},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartupFundingItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/entrepreneur-instruments":{"get":{"tags":["v2-funding"],"summary":"EU financial instruments for entrepreneurs, by delivery intermediary","description":"**What it does**\nReturns the EU financial instruments that support **entrepreneurs delivered through an intermediary or platform** — the money a founder reaches *via* a system stakeholder, not the raw call list. Scoped by `topic_id` family and tagged with the **`intermediary`** that actually delivers each instrument:\n- **EIC** (Accelerator, STEP Scale-up, Transition, Pathfinder) → **EIC Fund** (blended finance / equity) + **EISMEA**.\n- **Single Market Programme (SME strand)** → **EISMEA + Enterprise Europe Network**.\n- **Interregional Innovation Investments (I3)** → regional innovation ecosystems (managing authorities).\n- **Digital Europe** → **European Digital Innovation Hubs (EDIH)**.\n- **ESF+ / EaSI** → national managing authorities / EaSI microfinance intermediaries.\n- **Erasmus for Young Entrepreneurs** → EYE intermediary organisations.\n\nEach item carries a derived **`programme`**, **`instrument_family`** and **`intermediary`** so the payload answers *who delivers it*.\n\n**When to use it**\nFor an accelerator, incubator, business angel or ecosystem builder (like KinEtix Impact) that wants the intermediated-instrument list in one call, to pull into its own systems. The Tenderator is the profile-matched day-to-day view; this is the machine-readable equivalent.\n\n**Input**\n- `status` — comma list, default `open,forthcoming` (also `closed`, `under-evaluation`; `all` for every status).\n- `programme` — one of the coarse labels (e.g. `HORIZON (EIC)`, `Digital Europe`, `Single Market Programme`).\n- `deadline_before` — only calls closing on/before this date.\n- `q` — free text over title / description.\n- `limit` (default 20, max 50), `page`.\n\n**Try it**\n```\nGET /api/v2/funding/entrepreneur-instruments\nGET /api/v2/funding/entrepreneur-instruments?programme=HORIZON%20(EIC)&status=open\nGET /api/v2/funding/entrepreneur-instruments?status=all&q=accelerator\n```\n\n**You get back**\nA `PaginatedResponse[EntrepreneurInstrumentItem]` — each item carries `topic_id` (stable English id, e.g. `HORIZON-EIC-2026-ACCELERATOR-01`), `programme`, `instrument_family`, **`intermediary`**, `title`, `status`, `deadline`, `indicative_budget`, `source_url` and the 5 datapoints. Most recent deadlines first.\n\n**Coverage note**\n`ESF+ / EaSI` and `Erasmus for Young Entrepreneurs` families are wired but Brubru currently holds few or no open rows for them (they appear once the F&T Portal publishes calls). `Digital Europe` is matched on the whole `DIGITAL-` prefix, which is broader than EDIH alone.\n\n**Data freshness**\nDaily sync from the EU Funding & Tenders Portal (SEDIA). Reads existing data — no dedicated scraper.","operationId":"entrepreneur_instruments_api_v2_funding_entrepreneur_instruments_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Comma list: open,forthcoming (default) | closed | under-evaluation | all","default":"open,forthcoming","title":"Status"},"description":"Comma list: open,forthcoming (default) | closed | under-evaluation | all"},{"name":"programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Coarse programme label, e.g. 'HORIZON (EIC)', 'Digital Europe', 'Single Market Programme'","title":"Programme"},"description":"Coarse programme label, e.g. 'HORIZON (EIC)', 'Digital Europe', 'Single Market Programme'"},{"name":"deadline_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only calls closing on/before this date (YYYY-MM-DD)","title":"Deadline Before"},"description":"Only calls closing on/before this date (YYYY-MM-DD)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on title / description","title":"Q"},"description":"Substring match on title / description"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EntrepreneurInstrumentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/erdf":{"get":{"tags":["v2-funding"],"summary":"European Regional Development Fund (ERDF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **European Regional Development Fund (ERDF)**, one row per operational programme (CCI) and financial-allocation category. The ERDF is the EU's largest cohesion instrument, co-financing regional competitiveness, innovation, the green and digital transition and connectivity. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much ERDF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/erdf\nGET /api/v2/funding/erdf?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_erdf_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/erdf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ERDF allocation row in full","description":"**What it does**\nReturns one European Regional Development Fund (ERDF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/erdf/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_erdf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/esf-plus":{"get":{"tags":["v2-funding"],"summary":"European Social Fund Plus (ESF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **European Social Fund Plus (ESF)**, one row per operational programme (CCI) and financial-allocation category. The ESF+ is the EU's main instrument for investing in people — employment, skills, social inclusion, and support for young people and children (Socrata fund code 'ESF'). Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much ESF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/esf-plus\nGET /api/v2/funding/esf-plus?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_esf_plus_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/esf-plus/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ESF allocation row in full","description":"**What it does**\nReturns one European Social Fund Plus (ESF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/esf-plus/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_esf_plus__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cohesion-fund":{"get":{"tags":["v2-funding"],"summary":"Cohesion Fund (CF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **Cohesion Fund (CF)**, one row per operational programme (CCI) and financial-allocation category. The Cohesion Fund supports Member States with a GNI per head below 90% of the EU average, financing trans-European transport networks and environment / climate infrastructure. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much CF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/cohesion-fund\nGET /api/v2/funding/cohesion-fund?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_cohesion_fund_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cohesion-fund/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one CF allocation row in full","description":"**What it does**\nReturns one Cohesion Fund (CF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/cohesion-fund/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_cohesion_fund__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/jtf":{"get":{"tags":["v2-funding"],"summary":"Just Transition Fund (JTF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **Just Transition Fund (JTF)**, one row per operational programme (CCI) and financial-allocation category. The JTF is the key instrument of the Just Transition Mechanism, supporting the territories most affected by the move to climate neutrality through economic diversification, reskilling and clean-energy investment. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much JTF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/jtf\nGET /api/v2/funding/jtf?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_jtf_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/jtf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one JTF allocation row in full","description":"**What it does**\nReturns one Just Transition Fund (JTF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/jtf/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_jtf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/interreg":{"get":{"tags":["v2-funding"],"summary":"Interreg (European Territorial Cooperation) (INTERREG) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **Interreg (European Territorial Cooperation) (INTERREG)**, one row per operational programme (CCI) and financial-allocation category. Interreg funds cross-border, transnational and interregional cooperation programmes. Sourced from the dedicated Interreg allocation dataset (programme x strand), as it is barely present in the national-plan data. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much INTERREG money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/interreg\nGET /api/v2/funding/interreg?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_interreg_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/interreg/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one INTERREG allocation row in full","description":"**What it does**\nReturns one Interreg (European Territorial Cooperation) (INTERREG) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/interreg/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_interreg__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/emfaf":{"get":{"tags":["v2-funding"],"summary":"European Maritime, Fisheries and Aquaculture Fund (EMFAF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **European Maritime, Fisheries and Aquaculture Fund (EMFAF)**, one row per operational programme (CCI) and financial-allocation category. The EMFAF supports the EU's common fisheries policy, the sustainable blue economy, and coastal and inland fishing communities. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much EMFAF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/emfaf\nGET /api/v2/funding/emfaf?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_emfaf_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/emfaf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one EMFAF allocation row in full","description":"**What it does**\nReturns one European Maritime, Fisheries and Aquaculture Fund (EMFAF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/emfaf/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_emfaf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/amif":{"get":{"tags":["v2-funding"],"summary":"Asylum, Migration and Integration Fund (AMIF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **Asylum, Migration and Integration Fund (AMIF)**, one row per operational programme (CCI) and financial-allocation category. The AMIF (DG HOME) supports the common European asylum system, legal migration and integration, and returns. Shared-management allocations per Member State. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much AMIF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/amif\nGET /api/v2/funding/amif?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_amif_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/amif/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one AMIF allocation row in full","description":"**What it does**\nReturns one Asylum, Migration and Integration Fund (AMIF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/amif/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_amif__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/isf":{"get":{"tags":["v2-funding"],"summary":"Internal Security Fund (ISF) — 2021-2027 financial plan by programme","description":"**What it does**\nLists the 2021-2027 financial allocations of the **Internal Security Fund (ISF)**, one row per operational programme (CCI) and financial-allocation category. The ISF (DG HOME) supports police cooperation, the fight against serious and organised crime and terrorism, and crisis management across Member States. Each row carries the Member State, programme title and status, lead DG, the year-by-year breakdown (2021-2027) and the total EU allocation, plus the 5 datapoints (`body_txt`/`body_html` are null here — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see how much ISF money each Member State and programme is allocated and how it is profiled across the years. This is the allocation (planning) side.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `PL`, `ES`, `DE`).\n- `status` — programme status substring (e.g. `Adopted`).\n- `q` — substring on the programme title or the composed body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/isf\nGET /api/v2/funding/isf?ms=ES\n```\n\n**You get back**\nA `PaginatedResponse[CohesionFinanceItem]` envelope sorted by total allocation. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the structured fields (`fund`, `ms`, `cci`, `cci_title`, `y2021`..`y2027`, `total`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 9qee-iv7c).","operationId":"list_fund_api_v2_funding_isf_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme status substring","title":"Status"},"description":"Programme status substring"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the programme title or body","title":"Q"},"description":"Substring on the programme title or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionFinanceItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/isf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ISF allocation row in full","description":"**What it does**\nReturns one Internal Security Fund (ISF) financial-plan row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating a programme allocation via the list endpoint, fetch the full record (with the composed human-readable body).\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/isf/123\n```\n\n**You get back**\nA single `CohesionFinanceItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_fund_row_api_v2_funding_isf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionFinanceItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/erdf/outcomes":{"get":{"tags":["v2-funding"],"summary":"European Regional Development Fund (ERDF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **European Regional Development Fund (ERDF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/erdf`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/erdf/outcomes?type=result&ms=ES\nGET /api/v2/funding/erdf/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_erdf_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/erdf/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ERDF achievement indicator in full","description":"**What it does**\nReturns one European Regional Development Fund (ERDF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/erdf/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_erdf_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/esf-plus/outcomes":{"get":{"tags":["v2-funding"],"summary":"European Social Fund Plus (ESF+) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **European Social Fund Plus (ESF+)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/esf-plus`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/esf-plus/outcomes?type=result&ms=ES\nGET /api/v2/funding/esf-plus/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_esf_plus_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/esf-plus/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ESF+ achievement indicator in full","description":"**What it does**\nReturns one European Social Fund Plus (ESF+) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/esf-plus/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_esf_plus_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cohesion-fund/outcomes":{"get":{"tags":["v2-funding"],"summary":"Cohesion Fund (CF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **Cohesion Fund (CF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/cohesion-fund`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/cohesion-fund/outcomes?type=result&ms=ES\nGET /api/v2/funding/cohesion-fund/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_cohesion_fund_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/cohesion-fund/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one CF achievement indicator in full","description":"**What it does**\nReturns one Cohesion Fund (CF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/cohesion-fund/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_cohesion_fund_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/jtf/outcomes":{"get":{"tags":["v2-funding"],"summary":"Just Transition Fund (JTF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **Just Transition Fund (JTF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/jtf`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/jtf/outcomes?type=result&ms=ES\nGET /api/v2/funding/jtf/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_jtf_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/jtf/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one JTF achievement indicator in full","description":"**What it does**\nReturns one Just Transition Fund (JTF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/jtf/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_jtf_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/interreg/outcomes":{"get":{"tags":["v2-funding"],"summary":"Interreg (European Territorial Cooperation) (Interreg Funds) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **Interreg (European Territorial Cooperation) (Interreg Funds)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/interreg`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/interreg/outcomes?type=result&ms=ES\nGET /api/v2/funding/interreg/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_interreg_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/interreg/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one Interreg Funds achievement indicator in full","description":"**What it does**\nReturns one Interreg (European Territorial Cooperation) (Interreg Funds) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/interreg/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_interreg_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/emfaf/outcomes":{"get":{"tags":["v2-funding"],"summary":"European Maritime, Fisheries and Aquaculture Fund (EMFAF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **European Maritime, Fisheries and Aquaculture Fund (EMFAF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/emfaf`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/emfaf/outcomes?type=result&ms=ES\nGET /api/v2/funding/emfaf/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_emfaf_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/emfaf/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one EMFAF achievement indicator in full","description":"**What it does**\nReturns one European Maritime, Fisheries and Aquaculture Fund (EMFAF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/emfaf/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_emfaf_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/amif/outcomes":{"get":{"tags":["v2-funding"],"summary":"Asylum, Migration and Integration Fund (AMIF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **Asylum, Migration and Integration Fund (AMIF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/amif`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/amif/outcomes?type=result&ms=ES\nGET /api/v2/funding/amif/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_amif_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/amif/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one AMIF achievement indicator in full","description":"**What it does**\nReturns one Asylum, Migration and Integration Fund (AMIF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/amif/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_amif_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/isf/outcomes":{"get":{"tags":["v2-funding"],"summary":"Internal Security Fund (ISF) — 2021-2027 achievement indicators (outputs & results)","description":"**What it does**\nLists the 2021-2027 achievement indicators of the **Internal Security Fund (ISF)** — what the fund is delivering. One row per programme indicator, carrying the indicator name, measurement unit, baseline, 2024 milestone, 2029 target, and the decided + implemented values, plus the 5 datapoints (`body_txt`/`body_html` null here; fetch the detail endpoint for the body).\n\n**When to use it**\nTo measure progress and targets rather than money: how many people supported, entities helped, capacity created, per programme and Member State. For the euro allocations see `/api/v2/funding/isf`.\n\n**Input**\n- `ms` — Member State ISO code.\n- `type` — `result` (RESF), `output` (OESF), or `common` (COMMON). Substring also accepted.\n- `q` — substring on the indicator name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/isf/outcomes?type=result&ms=ES\nGET /api/v2/funding/isf/outcomes?q=unemployed\n```\n\n**You get back**\nA `PaginatedResponse[CohesionOutcomeItem]` envelope. Each item carries `id`, `public_url`, `document_date`, `creation_date`, the indicator fields (`indicator_long_name`, `measurement_unit`, `baseline_value`, `target_value_2029`, `implemented_value`, ...) and `body_txt`/`body_html` = null. Only the latest reporting cycle is served.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from `cohesiondata.ec.europa.eu`, dataset xi3a-zddk (latest TOD cycle only).","operationId":"list_outcomes_api_v2_funding_isf_outcomes_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"result (RESF) | output (OESF) | common (COMMON)","title":"Type"},"description":"result (RESF) | output (OESF) | common (COMMON)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the indicator name or body","title":"Q"},"description":"Substring on the indicator name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionOutcomeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/isf/outcomes/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one ISF achievement indicator in full","description":"**What it does**\nReturns one Internal Security Fund (ISF) achievement-indicator row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**When to use it**\nAfter locating an indicator via the list endpoint, fetch the full record with the composed body.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/isf/outcomes/123\n```\n\n**You get back**\nA single `CohesionOutcomeItem` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_outcome_row_api_v2_funding_isf_outcomes__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionOutcomeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eusf":{"get":{"tags":["v2-funding"],"summary":"EU Solidarity Fund (EUSF) — disaster cases 2002-2021","description":"**What it does**\nLists the **EU Solidarity Fund** disaster cases (2002-2021): floods, forest fires, earthquakes, storms, health emergencies. One row per case, with the applicant country, disaster type, accepted total direct damage and the EUSF grant paid (amounts in EUR million), plus the 5 datapoints (`body_txt`/`body_html` null on the list — fetch the detail endpoint for the full body).\n\n**When to use it**\nTo see which disasters the EUSF responded to, in which countries, and how much was paid. The EUSF assists Member States and accession countries hit by major natural disasters (and, since 2020, major health emergencies).\n\n**Input**\n- `country` — applicant country ISO code (e.g. `DE`, `IT`).\n- `disaster_type` — substring (e.g. `Floods`, `Earthquake`, `Health`).\n- `status` — substring (e.g. `Accepted`).\n- `year` — year of occurrence.\n- `q` — substring on the disaster name or body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/eusf?country=IT\nGET /api/v2/funding/eusf?disaster_type=Floods\nGET /api/v2/funding/eusf?year=2021\n```\n\n**You get back**\nA `PaginatedResponse[EUSFCase]` envelope sorted by EUSF grant paid (largest first). Each item carries `id`, `public_url`, `document_date`, `creation_date`, the case fields (`name_of_disaster`, `disaster_type`, `applicant_country`, `total_direct_damage_meur`, `eusf_grant_paid_meur`, ...) and `body_txt`/`body_html` = null. Use the detail endpoint for the full body.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`, dataset 7a49-av34).","operationId":"list_eusf_api_v2_funding_eusf_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Applicant country ISO code","title":"Country"},"description":"Applicant country ISO code"},{"name":"disaster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Disaster type substring","title":"Disaster Type"},"description":"Disaster type substring"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Status substring","title":"Status"},"description":"Status substring"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Year of occurrence","title":"Year"},"description":"Year of occurrence"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the disaster name or body","title":"Q"},"description":"Substring on the disaster name or body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EUSFCase_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eusf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one EU Solidarity Fund case in full","description":"**What it does**\nReturns one EU Solidarity Fund disaster case by its Brubru id, including the full `body_txt` + `body_html`.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/eusf/12\n```\n\n**You get back**\nA single `EUSFCase` with `body_txt` + `body_html` populated, or HTTP 404 with `reason_code: not_found`.\n\n**Data freshness**\nSame weekly sync as the list endpoint.","operationId":"get_eusf_api_v2_funding_eusf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EUSFCase"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/programmes":{"get":{"tags":["v2-funding"],"summary":"EU funding programmes directory — the EC classification + Brubru coverage","description":"**What it does**\nReturns the European Commission's own classification of the 2021-2027 EU funding programmes — the **6 MFF headings** (Single Market/Innovation/Digital; Cohesion and Values; Natural Resources and Environment; Migration and Border Management; Security and Defence; Neighbourhood and the World) broken into clusters and programmes — with **Brubru's coverage** for each: `covered` (and via which dedicated endpoint or the F&T calls feed), `gap`, or `skipped`.\n\n**When to use it**\nThe single source of truth for \"every EU fund\". Iterate it to know the full universe of programmes and, for each, exactly where Brubru's data lives (which endpoint) or that it is a known gap. Built for Tenderator and any client that needs the canonical fund taxonomy.\n\n**Input**\n- `heading` — substring on the EC heading (e.g. `Cohesion`, `Natural Resources`).\n- `cluster` — substring on the EC cluster.\n- `coverage` — `covered` | `gap` | `skipped`.\n- `q` — substring on the programme name, acronym or body.\n- `limit` (default 100, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/programmes\nGET /api/v2/funding/programmes?coverage=covered\nGET /api/v2/funding/programmes?heading=Natural Resources\n```\n\n**You get back**\nA `PaginatedResponse[ProgrammeItem]`. Each item carries `programme`, `acronym`, `heading`, `cluster`, `coverage`, `via`, `endpoint` (the Brubru path when covered by a dedicated endpoint), `source`, plus the 5 datapoints (`public_url` is the EC programmes page; `body_txt`/`body_html` null on the list — fetch the detail endpoint).\n\n**Data freshness**\nStatic reference, updated when the Commission's programme list changes (config: `funding_programmes.json`).","operationId":"list_programmes_api_v2_funding_programmes_get","parameters":[{"name":"heading","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EC heading substring","title":"Heading"},"description":"EC heading substring"},{"name":"cluster","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EC cluster substring","title":"Cluster"},"description":"EC cluster substring"},{"name":"coverage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"covered | gap | skipped","title":"Coverage"},"description":"covered | gap | skipped"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on programme name / acronym / body","title":"Q"},"description":"Substring on programme name / acronym / body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProgrammeItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/programmes/{acronym}":{"get":{"tags":["v2-funding"],"summary":"Look up one EU funding programme in the classification","description":"**What it does**\nReturns one EU funding programme from the EC classification by its acronym, with the full `body_txt` + `body_html`.\n\n**Input**\n- `acronym` (path) — e.g. `ERDF`, `Horizon Europe`, `EAGF`.\n\n**Try it**\n```\nGET /api/v2/funding/programmes/ERDF\n```\n\n**You get back**\nA single `ProgrammeItem` with the body populated, or HTTP 404 with `reason_code: not_found`.","operationId":"get_programme_api_v2_funding_programmes__acronym__get","parameters":[{"name":"acronym","in":"path","required":true,"schema":{"type":"string","description":"Programme acronym, e.g. ERDF","title":"Acronym"},"description":"Programme acronym, e.g. ERDF"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgrammeItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eagf":{"get":{"tags":["v2-funding"],"summary":"European Agricultural Guarantee Fund (EAGF) — EU payments by Member State (2023-2027)","description":"**What it does**\nLists the **European Agricultural Guarantee Fund (EAGF)** EU payments by Member State for 2023-2027. The EAGF is the 'first pillar' of the CAP, financing direct income support to farmers and agricultural market measures. One row per Member State, with the headline EU amount and the fund-specific breakdown, plus the 5 datapoints (`body_txt`/`body_html` null on the list — fetch the detail endpoint).\n\n**When to use it**\nTo see how much EAGF money each Member State receives under the Common Agricultural Policy.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `FR`, `ES`, `PL`).\n- `q` — substring on the body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/eagf\nGET /api/v2/funding/eagf?ms=FR\n```\n\n**You get back**\nA `PaginatedResponse[CAPPaymentItem]` envelope sorted by total EU amount (largest first). Each item carries `id`, `fund`, `ms`, `total_eur`, the fund-specific fields (annual `fy_2023`..`fy_2026`), `public_url`, `document_date`, `creation_date`, and `body_txt`/`body_html` = null.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`).","operationId":"list_cap_api_v2_funding_eagf_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the body","title":"Q"},"description":"Substring on the body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CAPPaymentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eagf/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one EAGF Member State payment row in full","description":"**What it does**\nReturns one European Agricultural Guarantee Fund (EAGF) Member State payment row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/eagf/3\n```\n\n**You get back**\nA single `CAPPaymentItem` with the body populated, or HTTP 404 with `reason_code: not_found`.","operationId":"get_cap_row_api_v2_funding_eagf__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CAPPaymentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eafrd":{"get":{"tags":["v2-funding"],"summary":"European Agricultural Fund for Rural Development (EAFRD) — EU payments by Member State (2023-2027)","description":"**What it does**\nLists the **European Agricultural Fund for Rural Development (EAFRD)** EU payments by Member State for 2023-2027. The EAFRD is the 'second pillar' of the CAP, co-financing rural development programmes (the figures show planned EU amount vs net payments to date). One row per Member State, with the headline EU amount and the fund-specific breakdown, plus the 5 datapoints (`body_txt`/`body_html` null on the list — fetch the detail endpoint).\n\n**When to use it**\nTo see how much EAFRD money each Member State receives under the Common Agricultural Policy.\n\n**Input**\n- `ms` — Member State ISO code (e.g. `FR`, `ES`, `PL`).\n- `q` — substring on the body.\n- `limit` (default 50, max 200), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/funding/eafrd\nGET /api/v2/funding/eafrd?ms=FR\n```\n\n**You get back**\nA `PaginatedResponse[CAPPaymentItem]` envelope sorted by total EU amount (largest first). Each item carries `id`, `fund`, `ms`, `total_eur`, the fund-specific fields (`planned_eu_amount`, `net_interim_payments`, `payment_rate`), `public_url`, `document_date`, `creation_date`, and `body_txt`/`body_html` = null.\n\n**Data freshness**\nSynced weekly (Sunday 05:00 UTC) from the DG REGIO Cohesion Open Data Platform (`cohesiondata.ec.europa.eu`).","operationId":"list_cap_api_v2_funding_eafrd_get","parameters":[{"name":"ms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Member State ISO code","title":"Ms"},"description":"Member State ISO code"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring on the body","title":"Q"},"description":"Substring on the body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CAPPaymentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/eafrd/{row_id}":{"get":{"tags":["v2-funding"],"summary":"Look up one EAFRD Member State payment row in full","description":"**What it does**\nReturns one European Agricultural Fund for Rural Development (EAFRD) Member State payment row by its Brubru id, including the full `body_txt` + `body_html`.\n\n**Input**\n- `row_id` (path) — the `id` from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/eafrd/3\n```\n\n**You get back**\nA single `CAPPaymentItem` with the body populated, or HTTP 404 with `reason_code: not_found`.","operationId":"get_cap_row_api_v2_funding_eafrd__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru row id from the list endpoint","title":"Row Id"},"description":"Brubru row id from the list endpoint"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CAPPaymentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/justice":{"get":{"tags":["v2-funding"],"summary":"Justice Programme — funding calls (newest first)","description":"**What it does**\nLists Justice Programme's funding calls, newest first. It funds judicial cooperation in civil and criminal matters, judicial training (e-Justice) and access to justice.\n\n**When to use it**\nTrack what JUST is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /justice?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal (SEDIA search API), filtered to this programme's calls by topic-id prefix; refreshed daily (04:00 UTC)..","operationId":"list_ep_api_v2_funding_justice_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/justice/{item_id}":{"get":{"tags":["v2-funding"],"summary":"Justice Programme — one funding call (full body)","description":"**What it does**\nReturns one Justice Programme funding call in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /justice/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal (SEDIA search API), filtered to this programme's calls by topic-id prefix; refreshed daily (04:00 UTC)..","operationId":"detail_ep_api_v2_funding_justice__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/innovation-fund":{"get":{"tags":["v2-funding"],"summary":"Innovation Fund — funding calls (newest first)","description":"**What it does**\nLists Innovation Fund's funding calls, newest first. It funds innovative low-carbon and net-zero technologies from EU Emissions Trading System auction revenues.\n\n**When to use it**\nTrack what INNOVFUND is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /innovation-fund?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal (SEDIA search API), filtered to this programme's calls by topic-id prefix; refreshed daily (04:00 UTC)..","operationId":"list_ep_api_v2_funding_innovation_fund_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/innovation-fund/{item_id}":{"get":{"tags":["v2-funding"],"summary":"Innovation Fund — one funding call (full body)","description":"**What it does**\nReturns one Innovation Fund funding call in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /innovation-fund/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal (SEDIA search API), filtered to this programme's calls by topic-id prefix; refreshed daily (04:00 UTC)..","operationId":"detail_ep_api_v2_funding_innovation_fund__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/international-cooperation":{"get":{"tags":["v2-funding"],"summary":"EU international cooperation awards — NDICI, IPA III, Humanitarian (who won what, where)","description":"**What it does**\nThe award (recipient) side of **EU international cooperation** — who received EU money under the three external-action instruments, parsed into structured fields:\n- **NDICI - Global Europe** (`programme=ndici`) — ~11.9k awards\n- **IPA III** pre-accession (`programme=ipa3`) — ~2.3k awards\n- **Humanitarian Aid** (`programme=humanitarian`) — ~1.3k awards\n\nEach item carries `beneficiary`, `country`, `amount_eur`, `funding_type` (grant / procurement contract / contribution), `programme`, `dg`, `contract_ref`, `year` and `subject`.\n\n**When to use it**\nMarket & competitive intelligence for the EU external-action market: which organisations win EU aid money, in which countries, under which instrument, as grants or service contracts. `funding_type=Procurement contract` isolates technical-assistance service contracts; `country=Türkiye` gives the geographic view.\n\n**Input**\n`programme` (ndici | ipa3 | humanitarian), `funding_type` (substring, e.g. `Grant`, `Procurement`), `country` (substring), `year`, `q` (free text), `order` (recent | oldest | year), `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/funding/international-cooperation?programme=ipa3&funding_type=Procurement\nGET /api/v2/funding/international-cooperation?country=Ukraine\n```\n\n**You get back**\nA paginated envelope. Each item carries the structured award fields + the 5 datapoints (`body_txt` / `body_html` null on the list — fetch the detail endpoint for the full FTS record).\n\n**Note**\nThis is the *awards* side (who already received funding). Open biddable tenders run through OPSYS/TED and are not held here.\n\n**Data freshness**\nFrom the EU Financial Transparency System (FTS) annual dataset (most recent complete year).","operationId":"list_intl_cooperation_api_v2_funding_international_cooperation_get","parameters":[{"name":"programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ndici | ipa3 | humanitarian","title":"Programme"},"description":"ndici | ipa3 | humanitarian"},{"name":"funding_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring, e.g. Grant | Procurement | Contribution.","title":"Funding Type"},"description":"Substring, e.g. Grant | Procurement | Contribution."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Beneficiary country substring.","title":"Country"},"description":"Beneficiary country substring."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"FTS budget year, e.g. 2024.","title":"Year"},"description":"FTS budget year, e.g. 2024."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free text over beneficiary, subject, programme.","title":"Q"},"description":"Free text over beneficiary, subject, programme."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | year.","default":"recent","title":"Order"},"description":"recent | oldest | year."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IntlCoopItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/international-cooperation/{item_id}":{"get":{"tags":["v2-funding"],"summary":"One EU international-cooperation award (full FTS record)","description":"**What it does**\nReturns one EU external-action award in full, including the complete FTS `body_txt` / `body_html` and all parsed fields.\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/funding/international-cooperation/{item_id}\n```\n\n**You get back**\nA single award with the structured fields + the full 5-datapoint contract.\n\n**Data freshness**\nFrom the EU Financial Transparency System (FTS).","operationId":"get_intl_cooperation_api_v2_funding_international_cooperation__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCoopItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-news":{"get":{"tags":["v2-funding"],"summary":"the EU Funding & Tenders Portal — news items (newest first)","description":"**What it does**\nLists the EU Funding & Tenders Portal's news items, newest first. Portal announcements: new calls, info sessions, programme updates and deadlines across all EU funding programmes.\n\n**When to use it**\nTrack what F&T Portal is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /ft-news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal news feed (SEDIA-NEWS-PROD); refreshed daily..","operationId":"list_ep_api_v2_funding_ft_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-news/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the EU Funding & Tenders Portal — one news item (full body)","description":"**What it does**\nReturns one the EU Funding & Tenders Portal news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /ft-news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal news feed (SEDIA-NEWS-PROD); refreshed daily..","operationId":"detail_ep_api_v2_funding_ft_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-events":{"get":{"tags":["v2-funding"],"summary":"the EU Funding & Tenders Portal — events (newest first)","description":"**What it does**\nLists the EU Funding & Tenders Portal's events, newest first. Info days, webinars and programme events; `document_date` is the event start date, so order=recent surfaces the next events first.\n\n**When to use it**\nTrack what F&T Portal is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /ft-events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal events feed (SEDIA-EVENTS-PROD); refreshed daily..","operationId":"list_ep_api_v2_funding_ft_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/funding/ft-events/{item_id}":{"get":{"tags":["v2-funding"],"summary":"the EU Funding & Tenders Portal — one event (full body)","description":"**What it does**\nReturns one the EU Funding & Tenders Portal event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /ft-events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Funding & Tenders Portal events feed (SEDIA-EVENTS-PROD); refreshed daily..","operationId":"detail_ep_api_v2_funding_ft_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/ema":{"get":{"tags":["v2-consultations"],"summary":"the European Medicines Agency — EMA public consultations (newest first)","description":"**What it does**\nLists the European Medicines Agency's EMA public consultations, newest first. Draft documents the European Medicines Agency has open for public consultation — herbal monographs, scientific guidelines, concept papers and assessment reports — each linking to the document. Filter with q (e.g. a substance or guideline topic).\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /ema?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA open-consultations page..","operationId":"list_ep_api_v2_consultations_ema_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/ema/{item_id}":{"get":{"tags":["v2-consultations"],"summary":"the European Medicines Agency — one EMA public consultation (full body)","description":"**What it does**\nReturns one the European Medicines Agency EMA public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /ema/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA open-consultations page..","operationId":"detail_ep_api_v2_consultations_ema__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/berec":{"get":{"tags":["v2-consultations"],"summary":"BEREC — BEREC public consultations (newest first)","description":"**What it does**\nLists BEREC's BEREC public consultations, newest first. BEREC's public consultations and calls for inputs on electronic-communications regulation. Filter with q (e.g. 'roaming' or 'net neutrality').\n\n**When to use it**\nTrack what BEREC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /berec?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the BEREC public consultations & calls for inputs..","operationId":"list_ep_api_v2_consultations_berec_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/berec/{item_id}":{"get":{"tags":["v2-consultations"],"summary":"BEREC — one BEREC public consultation (full body)","description":"**What it does**\nReturns one BEREC BEREC public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /berec/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the BEREC public consultations & calls for inputs..","operationId":"detail_ep_api_v2_consultations_berec__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/eiopa":{"get":{"tags":["v2-consultations"],"summary":"EIOPA — EIOPA public consultations (newest first)","description":"**What it does**\nLists EIOPA's EIOPA public consultations, newest first. EIOPA's public consultations and surveys on insurance and occupational-pensions supervision. Filter with q (e.g. 'Solvency II' or 'IORP').\n\n**When to use it**\nTrack what EIOPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eiopa?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIOPA consultations & surveys..","operationId":"list_ep_api_v2_consultations_eiopa_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/eiopa/{item_id}":{"get":{"tags":["v2-consultations"],"summary":"EIOPA — one EIOPA public consultation (full body)","description":"**What it does**\nReturns one EIOPA EIOPA public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eiopa/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIOPA consultations & surveys..","operationId":"detail_ep_api_v2_consultations_eiopa__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/amla":{"get":{"tags":["v2-consultations"],"summary":"AMLA — AMLA public consultations (newest first)","description":"**What it does**\nLists AMLA's AMLA public consultations, newest first. The Anti-Money Laundering Authority's public consultations (draft guidelines and RTS). Filter with q.\n\n**When to use it**\nTrack what AMLA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /amla?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the AMLA public consultations..","operationId":"list_ep_api_v2_consultations_amla_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/amla/{item_id}":{"get":{"tags":["v2-consultations"],"summary":"AMLA — one AMLA public consultation (full body)","description":"**What it does**\nReturns one AMLA AMLA public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /amla/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the AMLA public consultations..","operationId":"detail_ep_api_v2_consultations_amla__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/echa":{"get":{"tags":["v2-consultations"],"summary":"the European Chemicals Agency — ECHA public consultations (newest first)","description":"**What it does**\nLists the European Chemicals Agency's ECHA public consultations, newest first. ECHA's open public consultations by type -- applications for authorisation, restriction proposals, harmonised classification & labelling (CLH), testing proposals, calls for comments & evidence, candidates for substitution -- each with the count of open consultations, the closing date and a link to the full sub-list. Filter with q.\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /echa?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECHA current-consultations overview, grouped by type..","operationId":"list_ep_api_v2_consultations_echa_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/echa/{item_id}":{"get":{"tags":["v2-consultations"],"summary":"the European Chemicals Agency — one ECHA public consultation (full body)","description":"**What it does**\nReturns one the European Chemicals Agency ECHA public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /echa/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECHA current-consultations overview, grouped by type..","operationId":"detail_ep_api_v2_consultations_echa__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations":{"get":{"tags":["v2-consultations"],"summary":"Consultations folder directory — every EU public consultation, aggregated","description":"**What it does**\nOne-call overview of every EU public consultation: open vs closed, bodies and policy families covered, split by institution.\n\n**When to use it**\nBefore querying the feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/consultations\n```\n\n**You get back**\nA summary. Then `/api/v2/consultations/all`, `/api/v2/consultations/bodies`, or `/api/v2/consultations/{id}`.\n\n**Data freshness**\nLive union of the Have Your Say register + agency consultations.","operationId":"_consultations_directory_api_v2_consultations_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationsDirectory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/all":{"get":{"tags":["v2-consultations"],"summary":"All public consultations, all bodies (pick your scope)","description":"**What it does**\nEvery EU public consultation in one feed — the Commission's Have Your Say register and the decentralised agency consultations — newest closing date first.\n\n**When to use it**\n'Show me every open consultation from the bodies I care about'. Scope with `body` (comma codes) and/or `family` (a Brubru policy family); `status=open` for live ones.\n\n**Input**\n`body`, `family`, `institution` (European Commission | an agency), `status` (open | closed | all), `from` / `to` (YYYY-MM-DD on the closing date), `q`, `order` (recent | oldest | title), `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/consultations/all?status=open\nGET /api/v2/consultations/all?family=finance-economy&status=open\nGET /api/v2/consultations/all?body=echa,ema\n```\n\n**You get back**\nA paginated envelope. Each carries body_code, body_name, policy families, institution, consultation_type, status, responsible DG, policy areas, feedback count, the closing date and the link (body_txt/html on the detail endpoint).\n\n**Data freshness**\nLive union of public_consultations + economy_items.","operationId":"consultations_all_api_v2_consultations_all_get","parameters":[{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated body codes (e.g. echa,ema,commission).","title":"Body"},"description":"Comma-separated body codes (e.g. echa,ema,commission)."},{"name":"family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated Brubru policy family slugs (see /api/v2/consultations/bodies).","title":"Family"},"description":"Comma-separated Brubru policy family slugs (see /api/v2/consultations/bodies)."},{"name":"institution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"European Commission, or an agency acronym.","title":"Institution"},"description":"European Commission, or an agency acronym."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"open | closed | all.","title":"Status"},"description":"open | closed | all."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Closing date on/after (YYYY-MM-DD).","title":"From"},"description":"Closing date on/after (YYYY-MM-DD)."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Closing date on/before (YYYY-MM-DD).","title":"To"},"description":"Closing date on/before (YYYY-MM-DD)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title and summary.","title":"Q"},"description":"Free-text search over title and summary."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v1___envelope__PaginatedResponse_ConsultationItem___2"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/bodies":{"get":{"tags":["v2-consultations"],"summary":"Pick-list: bodies and policy families with consultation counts","description":"**What it does**\nThe discovery endpoint for the `body` and `family` filters: every body running consultations (count + families) and every Brubru policy family (bodies + total count).\n\n**When to use it**\nTo build a picker.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/consultations/bodies\n```\n\n**You get back**\n`{bodies: [...], families: [...]}`.\n\n**Data freshness**\nLive.","operationId":"bodies_facet_api_v2_consultations_bodies_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bodies Facet Api V2 Consultations Bodies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/consultations/{consultation_id}":{"get":{"tags":["v2-consultations"],"summary":"One public consultation (full body)","description":"**What it does**\nReturns one consultation in full, including objectives and outcome summary where the register has them.\n\n**When to use it**\nAfter finding an id on `/api/v2/consultations/all`.\n\n**Input**\n`consultation_id` — the source-prefixed aggregator id (`h<uuid>` or `e<n>`).\n\n**Try it**\n```\nGET /api/v2/consultations/h<uuid>\n```\n\n**You get back**\nA single consultation with the full record.\n\n**Data freshness**\nLive.","operationId":"get_consultation_api_v2_consultations__consultation_id__get","parameters":[{"name":"consultation_id","in":"path","required":true,"schema":{"type":"string","description":"Prefixed id: 'h<uuid>' or 'e<n>'.","title":"Consultation Id"},"description":"Prefixed id: 'h<uuid>' or 'e<n>'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v2__consultations__consultations_all__ConsultationItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/predictions/{procedure_ref}/timeline":{"get":{"tags":["v2-predictions"],"summary":"Predicted days until a legislative procedure adopts, rejects, or withdraws","description":"**What it does**\nPredicts how many days remain until a legislative procedure closes (adopted / rejected / withdrawn), combining an XGBoost model trained on historical procedure timelines with a baseline heuristic. Returns the predicted days, a confidence in `[0.0, 1.0]`, and a 25th-75th percentile range for the uncertainty.\n\n**When to use it**\nFor advocacy timing — knowing whether a file is ~30 days from adoption vs ~9 months tells you whether to push amendments now or wait. Read confidence + range together: high confidence + narrow range = trustworthy; low confidence or wide range = rough estimate.\n\n**Input**\n- `procedure_ref` (path) — procedure reference, e.g. `2025/0232(COD)` (`YYYY/NNNN(COD|CNS|APP|...)`). Get one from `/api/v2/legislative/procedures` or `/api/v2/legislative/laws`.\n- `use_ml` — boolean (default true); set false for baseline-only.\n\n**Try it**\n```\nGET /api/v2/predictions/2025/0232(COD)/timeline\nGET /api/v2/predictions/2024/0079(COD)/timeline?use_ml=false\n```\n\n**You get back**\nA `TimelinePrediction` with `current_status`, `days_in_status`, `predicted_days_remaining`, `confidence`, `lower_bound_25`, `upper_bound_75`, `model_version`, `prediction_method`, plus the 5 datapoints (`public_url` = the OEIL procedure-file URL).\n\n**Data freshness**\nComputed on-demand from the live OEIL state at request time; the model is retrained quarterly (version in `model_version`).","operationId":"predicted_timeline_api_v2_predictions__procedure_ref__timeline_get","parameters":[{"name":"procedure_ref","in":"path","required":true,"schema":{"type":"string","title":"Procedure Ref"}},{"name":"use_ml","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Use Ml"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__v1__predictions__TimelinePrediction"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/predictions/{procedure_ref}/outcome":{"get":{"tags":["v2-predictions"],"summary":"Predicted outcome probabilities — adopted, rejected, withdrawn, pending","description":"**What it does**\nPredicts the probability of each possible outcome for an ongoing legislative procedure (adopted / rejected / withdrawn / pending) as a distribution that sums to 1.0, plus the highest-probability outcome as the headline.\n\n**When to use it**\nFor risk assessment — a 70% rejected probability tells you to invest amendment energy elsewhere; a 90% adopted probability says focus on the final form. Combine with `/timeline` for a what + when picture.\n\n**Input**\n- `procedure_ref` (path) — procedure reference (same identifier as `/timeline`).\n\n**Try it**\n```\nGET /api/v2/predictions/2025/0232(COD)/outcome\n```\n\n**You get back**\nAn `OutcomePrediction` with `outcome_probabilities` (outcome → probability), `predicted_outcome`, `confidence`, plus the 5 datapoints.\n\n**Data freshness**\nComputed on-demand from the live OEIL state at request time.","operationId":"predicted_outcome_api_v2_predictions__procedure_ref__outcome_get","parameters":[{"name":"procedure_ref","in":"path","required":true,"schema":{"type":"string","title":"Procedure Ref"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutcomePrediction"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/calendar/events":{"get":{"tags":["v2-calendar"],"summary":"Unified EU institutional calendar — plenary, committees, Council, College, agencies","description":"**What it does**\nOne feed of EU institutional events across the institutions — European Parliament plenary + committee meetings, Council and European Council meetings, Commission College meetings, and agency events — with dates, institution, type, linked procedures and (for EP committee meetings) the webstream URL.\n\n**When to use it**\nTo track when the institutions are meeting on the files you follow. Filter by `institution`, `event_type`, `committee`, `commission_dg`, and a `date_from`/`date_to` window; use `updated_from` for incremental sync.\n\n**Input**\n`institution`, `event_type`, `committee`, `commission_dg`, `date_from`, `date_to`, `updated_from`/`updated_to`, `limit` (max 100), `page`.\n\n**Try it**\n```\nGET /api/v2/calendar/events?institution=EP&event_type=PLENARY\nGET /api/v2/calendar/events?date_from=2026-06-15&date_to=2026-06-30\n```\n\n**You get back**\nA paginated envelope. Each event carries `institution`, `event_type`, `title`, `start_date`/`end_date`, linked `procedure_refs`, `webstream_url` where applicable, plus the 5 datapoints (`public_url`, `document_date` = start date; `body_txt`/`body_html` null on the list — fetch the detail endpoint).\n\n**Data freshness**\nSynced from the institutions' agendas (EP doceo, Council, College agenda, agency calendars).","operationId":"list_calendar_events_api_v2_calendar_events_get","parameters":[{"name":"institution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EP | COUNCIL | EUROPEAN_COUNCIL | COMMISSION | ECJ | ECB | ESMA | EMA | EBA | EIOPA | COR | EESC","title":"Institution"},"description":"EP | COUNCIL | EUROPEAN_COUNCIL | COMMISSION | ECJ | ECB | ESMA | EMA | EBA | EIOPA | COR | EESC"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PLENARY | COMMITTEE_MEETING | COUNCIL_MEETING | COLLEGE_MEETING | ...","title":"Event Type"},"description":"PLENARY | COMMITTEE_MEETING | COUNCIL_MEETING | COLLEGE_MEETING | ..."},{"name":"committee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"EP committee code","title":"Committee"},"description":"EP committee code"},{"name":"commission_dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. AGRI, CNECT, ENV","title":"Commission Dg"},"description":"e.g. AGRI, CNECT, ENV"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync — events last_updated >= value.","title":"Updated From"},"description":"Incremental sync — events last_updated >= value."},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"}},{"name":"updated_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Alias of updated_to.","title":"Updated End"},"description":"Alias of updated_to."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CalendarEventV2_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/calendar/events/{event_id}":{"get":{"tags":["v2-calendar"],"summary":"Look up one calendar event by its Brubru-internal id (full body)","description":"**What it does**\nReturns one EU calendar event in full, including the composed `body_txt` / `body_html` and all 5 datapoints.\n\n**Input**\n`event_id` — the Brubru-internal event id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/calendar/events/{event_id}\n```\n\n**You get back**\nA single `CalendarEventV2` with the full record + the 5 datapoints, or HTTP 404.\n\n**Data freshness**\nSame as the list endpoint.","operationId":"get_calendar_event_api_v2_calendar_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarEventV2"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/transparency-register":{"get":{"tags":["v2-transparency-register"],"summary":"EU Transparency Register — lobbyists / interest representatives","description":"**What it does**\nReturns organisations in the EU Transparency Register — the interest representatives (lobbyists, NGOs, trade unions, professional associations, think tanks, law firms, churches) who declare lobbying towards the Commission and the European Parliament (~17k active orgs from the daily public XML).\n\n**When to use it**\nLead generation, competitive intelligence and CRM enrichment — find who lobbies in your policy area, with what budget and how many EP-accredited passes. Filter by `country`, `category`, `interest`, `q`, `min_fte`, `min_costs`, `ep_accredited_only`.\n\n**Input**\n`country`, `category`, `interest`, `q`, `min_fte`, `min_costs`, `ep_accredited_only`, `limit` (max 200), `page`.\n\n**Try it**\n```\nGET /api/v2/transparency-register?country=BE&min_costs=1000000\nGET /api/v2/transparency-register?interest=digital&ep_accredited_only=true\n```\n\n**You get back**\nA paginated envelope; each org carries name, acronym, country, registration category, declared interests, FTE, lobbying costs, EP passes, plus the 5 datapoints (`public_url` = its register page; `body_txt`/`body_html` null on the list — fetch `/{code}`).\n\n**Data freshness**\nRefreshed daily from the Transparency Register public XML.","operationId":"list_transparency_register_api_v2_transparency_register_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"interest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interest"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"min_fte","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Fte"}},{"name":"min_costs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Costs"}},{"name":"ep_accredited_only","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ep Accredited Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TrListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/transparency-register/categories":{"get":{"tags":["v2-transparency-register"],"summary":"Registration-category breakdown with EP-pass and costs aggregates","description":"**What it does**\nReturns the breakdown of registered organisations by registration category, with the count, total declared lobbying costs and number of EP accreditation passes per category.\n\n**When to use it**\nA one-call overview of the lobbying landscape — which categories (in-house, consultancies, NGOs, think tanks, ...) dominate by number, spend and Parliament access.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/transparency-register/categories\n```\n\n**You get back**\nA list of category records, each with the category name, organisation count, aggregate costs and EP-pass count.\n\n**Data freshness**\nRefreshed daily from the Transparency Register public XML.","operationId":"transparency_register_categories_api_v2_transparency_register_categories_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/api__v1__specialised_transparency_register__CategoryCount"},"title":"Response Transparency Register Categories Api V2 Transparency Register Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/transparency-register/{code}":{"get":{"tags":["v2-transparency-register"],"summary":"Single organisation in the Transparency Register (full record + body)","description":"**What it does**\nReturns one registered organisation in full by its Transparency Register identification code — all declared fields plus the composed body and the 5 datapoints.\n\n**Input**\n`code` — the Transparency Register identification code, e.g. `880143435725-46`.\n\n**Try it**\n```\nGET /api/v2/transparency-register/880143435725-46\n```\n\n**You get back**\nA single `TrDetail` with the full record + the 5 datapoints, or HTTP 404.\n\n**Data freshness**\nRefreshed daily from the Transparency Register public XML.","operationId":"get_transparency_register_api_v2_transparency_register__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","description":"Transparency Register identification code, e.g. 880143435725-46.","title":"Code"},"description":"Transparency Register identification code, e.g. 880143435725-46."},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/datasets":{"get":{"tags":["v2-open-data-datasets"],"summary":"EU open datasets — search data.europa.eu (with direct download links)","description":"**What it does**\nSearches the European Union open-data portal (data.europa.eu) — datasets published by EU institutions and member states, each with its publisher, catalogue, themes, formats, the High-Value-Dataset flag, and direct distribution download URLs.\n\n**When to use it**\nTo find and pull EU open data on any policy topic — the single biggest EU open-data catalogue (1.9M+ datasets), with machine-readable download links per dataset.\n\n**Input**\n- `q` — full-text search over title / description / keywords.\n- `publisher` — substring match on the publisher.\n- `theme` — DCAT theme / category.\n- `country` — ISO country code of the publishing portal (e.g. `de`, `fr`).\n- `format` — distribution format (CSV, JSON, XML, ...).\n- `catalogue` — catalogue id.\n- `hvd` — true = only High-Value Datasets.\n- `published_from`, `published_to` — bound on the last-modified date.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/open-data/datasets?q=air+quality&format=CSV\n```\n\n**You get back**\nA `PaginatedResponse[OpenDataDatasetItem]`; each item carries `distributions` (download URLs), `formats`, `is_hvd`, `publisher`, `catalogue`, `themes`. The five envelope datapoints are filled: `public_url` (the data.europa.eu page), `body_txt`/`body_html` (metadata + download links), `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from the data.europa.eu open JSON API (no scraping). Bodies are composed at ingest, so the API never calls data.europa.eu on the request path.","operationId":"list_datasets_api_v2_open_data_datasets_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"publisher","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"}},{"name":"theme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"catalogue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue"}},{"name":"hvd","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hvd"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_OpenDataDatasetItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/datasets/{item_id}":{"get":{"tags":["v2-open-data-datasets"],"summary":"One EU open dataset by id — full metadata + download links","description":"Fetch a single data.europa.eu dataset by its Brubru UUID, with the full DCAT metadata and all distribution download URLs. 404 with `reason_code: not_found` if absent.","operationId":"get_dataset_api_v2_open_data_datasets__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenDataDatasetItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/high-value-datasets":{"get":{"tags":["v2-open-data-high-value-datasets"],"summary":"EU High-Value Datasets (Open Data Directive)","description":"**What it does**\nReturns the High-Value Datasets — the category the EU Open Data Directive designates as having high reuse potential (geospatial, earth observation/environment, meteorological, statistics, companies, mobility) — a filtered view of the open-data catalogue.\n\n**When to use it**\nTo find the EU datasets the law itself flags as the most valuable to reuse, with their download links.\n\n**Input**\n- `q`, `publisher`, `theme`, `country`, `format`, `catalogue` — same as the datasets endpoint.\n- `published_from`, `published_to`.\n- `limit` (default 25, max 100), `page`.\n\n**Try it**\n```\nGET /api/v2/open-data/high-value-datasets?theme=geospatial\n```\n\n**You get back**\nA `PaginatedResponse[OpenDataDatasetItem]` of High-Value Datasets (all `is_hvd=true`). The five envelope datapoints are filled: `public_url` (the data.europa.eu page), `body_txt`/`body_html` (metadata + download links), `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from the data.europa.eu open JSON API (no scraping). Bodies are composed at ingest, so the API never calls data.europa.eu on the request path.","operationId":"list_high_value_datasets_api_v2_open_data_high_value_datasets_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"publisher","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"}},{"name":"theme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"catalogue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_OpenDataDatasetItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/catalogues":{"get":{"tags":["v2-open-data-catalogues"],"summary":"EU open-data catalogues — the data.europa.eu catalogue directory","description":"**What it does**\nReturns the data catalogues federated by data.europa.eu — the ~90 EU institution and member-state open-data catalogues (including the EU Legal Data Space ELDS and the Public Procurement Data Space PPDS).\n\n**When to use it**\nAs a reference list of the data sources data.europa.eu aggregates, to scope a dataset search by `catalogue`.\n\n**Input**\n- `q` — substring match on the catalogue id / title.\n- `limit` (default 50, max 100), `page`.\n\n**Try it**\n```\nGET /api/v2/open-data/catalogues?q=eurostat\n```\n\n**You get back**\nA `PaginatedResponse[OpenDataCatalogueItem]`. The five envelope datapoints are filled: `public_url` (the data.europa.eu page), `body_txt`/`body_html` (metadata + download links), `document_date`, `creation_date`.\n\n**Data freshness**\nSynced from the data.europa.eu open JSON API (no scraping). Bodies are composed at ingest, so the API never calls data.europa.eu on the request path.","operationId":"list_data_catalogues_api_v2_open_data_catalogues_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_OpenDataCatalogueItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/catalogues/{item_id}":{"get":{"tags":["v2-open-data-catalogues"],"summary":"One EU open-data catalogue by id","description":"Fetch a single data.europa.eu catalogue by its Brubru UUID. 404 with `reason_code: not_found` if absent.","operationId":"get_data_catalogue_api_v2_open_data_catalogues__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenDataCatalogueItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/jrc-datasets":{"get":{"tags":["v2-open-data"],"summary":"JRC data catalogue — Joint Research Centre datasets","description":"**What it does**\nReturns datasets from the Joint Research Centre (JRC) data catalogue — the Commission's in-house science service: environmental, energy, agricultural, economic and scientific datasets.\n\n**When to use it**\nTo find authoritative EU scientific datasets by topic. Filter by `q` (free text) and `keyword`.\n\n**Input**\n`q`, `keyword`, `limit` (max 200), `page`.\n\n**Try it**\n```\nGET /api/v2/open-data/jrc-datasets?q=emissions\n```\n\n**You get back**\nA paginated list of datasets; each carries title, description, publisher, keywords, modified date, plus the 5 datapoints (`public_url` = the JRC dataset page; full body on the detail endpoint).\n\n**Data freshness**\nSynced from the JRC data catalogue.","operationId":"list_jrc_datasets_api_v2_open_data_jrc_datasets_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_JrcDatasetItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/jrc-datasets/{uuid}":{"get":{"tags":["v2-open-data"],"summary":"Look up one JRC dataset by its UUID (full metadata + distributions)","description":"**What it does**\nFetches one JRC dataset in full by its UUID — full metadata plus its distributions (download links).\n\n**Input**\n`uuid` — the JRC dataset UUID from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/open-data/jrc-datasets/{uuid}\n```\n\n**You get back**\nA single `JrcDatasetDetail` with the full record + the 5 datapoints, or HTTP 404.\n\n**Data freshness**\nSynced from the JRC data catalogue.","operationId":"get_jrc_dataset_api_v2_open_data_jrc_datasets__uuid__get","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","description":"JRC dataset UUID.","title":"Uuid"},"description":"JRC dataset UUID."},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JrcDatasetDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/cohesion-datasets":{"get":{"tags":["v2-open-data"],"summary":"DG REGIO Cohesion Open Data datasets (the dataset catalogue)","description":"**What it does**\nReturns the catalogue of DG REGIO Cohesion Open Data Platform datasets (Socrata). Each row is a *dataset*, not a data row — to fetch the actual tabular rows follow `api_endpoint` (Socrata REST) or `public_url` (HTML viewer). For per-fund allocation rows, use the dedicated endpoints under `/api/v2/funding/*` (erdf, esf-plus, ...).\n\n**When to use it**\nTo discover which cohesion-policy datasets exist (finances, achievements, beneficiaries) and where to pull them.\n\n**Input**\n`category`, `tag`, `q`, `limit` (max 200), `page`.\n\n**Try it**\n```\nGET /api/v2/open-data/cohesion-datasets?category=Finances\nGET /api/v2/open-data/cohesion-datasets?q=ERDF\n```\n\n**You get back**\nA paginated list of datasets; each carries title, category, tags, `api_endpoint`, plus the 5 datapoints (`public_url` = the Socrata viewer page).\n\n**Data freshness**\nSynced from the Cohesion Open Data Platform catalogue.","operationId":"list_cohesion_datasets_api_v2_open_data_cohesion_datasets_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CohesionListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/cohesion-datasets/categories":{"get":{"tags":["v2-open-data"],"summary":"Cohesion Open Data dataset counts by category — browseable index","description":"**What it does**\nReturns the count of cohesion datasets per category — a quick browseable index of the catalogue.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/open-data/cohesion-datasets/categories\n```\n\n**You get back**\nA list of category records with the dataset count per category.\n\n**Data freshness**\nSynced from the Cohesion Open Data Platform catalogue.","operationId":"cohesion_dataset_categories_api_v2_open_data_cohesion_datasets_categories_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CohesionCategoryCount"},"title":"Response Cohesion Dataset Categories Api V2 Open Data Cohesion Datasets Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/cohesion-datasets/{socrata_id}":{"get":{"tags":["v2-open-data"],"summary":"Look up one Cohesion Open Data dataset by its Socrata id (full schema + body)","description":"**What it does**\nFetches one cohesion dataset in full by its Socrata 4x4 id — full schema, the API endpoint and the composed body.\n\n**Input**\n`socrata_id` — the Socrata 4x4 id, e.g. `7twf-r3rc`.\n\n**Try it**\n```\nGET /api/v2/open-data/cohesion-datasets/7twf-r3rc\n```\n\n**You get back**\nA single `CohesionDetail` with the full record + the 5 datapoints, or HTTP 404.\n\n**Data freshness**\nSynced from the Cohesion Open Data Platform catalogue.","operationId":"get_cohesion_dataset_api_v2_open_data_cohesion_datasets__socrata_id__get","parameters":[{"name":"socrata_id","in":"path","required":true,"schema":{"type":"string","description":"Socrata 4x4 ID, e.g. 7twf-r3rc.","title":"Socrata Id"},"description":"Socrata 4x4 ID, e.g. 7twf-r3rc."},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohesionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/eurostat-series":{"get":{"tags":["v2-open-data-eurostat-series"],"summary":"Brubru-curated Eurostat sport + fitness-relevant health datasets (10 series)","description":"**What it does**\nReturns the curated set of Eurostat dissemination datasets useful for sport, fitness, and physical-activity products: aerobic + muscle-strengthening physical activity frequency, sport employment by sex / age, sport participation by income quintile, household spend on recreation + sport, BMI, daily fruit + vegetable intake, BMI trends. Each item ships its Eurostat code, theme, plain-language description, unit hint, and a public_url pointing at the Eurostat Data Browser.\n\n**When to use it**\nTo enumerate Brubru's sport + health Eurostat coverage and pick which dataset to fetch in full via `/{dataset_code}`. The Eurostat dissemination API is public + free; Brubru's value here is the curated whitelist (saves you discovering relevant codes manually across thousands of Eurostat datasets) and the unified 5-datapoint contract.\n\n**Input**\n- `theme`: filter by curated theme. One of: `Sport and physical activity`, `Health, BMI, nutrition`, `Household leisure expenditure`.\n- `q`: case-insensitive substring match on name + description.\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/open-data/eurostat-series\nGET /api/v2/open-data/eurostat-series?theme=Sport%20and%20physical%20activity\nGET /api/v2/open-data/eurostat-series?q=BMI\n```\n\n**You get back**\nA `PaginatedResponse[EurostatSeriesItem]` with 10 curated rows. Per item: `code`, `name`, `theme`, `description`, `unit_hint`, plus the 5 datapoints (`public_url` = Eurostat Data Browser; `body_txt` / `body_html` null on list, populated on detail; `document_date` null on list, set from Eurostat 'last update' on detail).\n\n**Data freshness**\nThe curated whitelist is Brubru-managed. Each dataset's underlying observations come from Eurostat's dissemination API at fetch time on the detail endpoint, so values are always live.","operationId":"list_eurostat_series_api_v2_open_data_eurostat_series_get","parameters":[{"name":"theme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Curated theme filter (case-insensitive).","title":"Theme"},"description":"Curated theme filter (case-insensitive)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text filter over name + description.","title":"Q"},"description":"Free-text filter over name + description."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EurostatSeriesItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/eurostat-series/themes":{"get":{"tags":["v2-open-data-eurostat-series"],"summary":"Distinct themes in the Brubru curated Eurostat list (with dataset counts)","description":"**What it does**\nReturns the distinct themes across the curated Eurostat sport + health dataset list, each with the number of datasets under it. Drives faceted-search UIs.\n\n**When to use it**\nTo populate a theme picker before calling `/api/v2/open-data/eurostat-series?theme=...`.\n\n**Input**\nNone.\n\n**Try it**\n```\nGET /api/v2/open-data/eurostat-series/themes\n```\n\n**You get back**\nA list of `ThemeFacet` rows: `theme` (string), `dataset_count` (int).","operationId":"list_themes_api_v2_open_data_eurostat_series_themes_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ThemeFacet"},"title":"Response List Themes Api V2 Open Data Eurostat Series Themes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/open-data/eurostat-series/{dataset_code}":{"get":{"tags":["v2-open-data-eurostat-series"],"summary":"Fetch one Eurostat dataset's full JSON-stat 2.0 payload + composed summary","description":"**What it does**\nFetches a Eurostat dissemination dataset live from `ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/{code}` and returns it under `payload` (verbatim JSON-stat 2.0) alongside Brubru's standard 5-datapoint envelope: a composed `body_txt` / `body_html` summary, the Eurostat Data Browser `public_url`, and `document_date` set from the upstream `updated` timestamp. Up to 10 sample observations are surfaced separately under `sample_observations` for quick orientation, and the dimension list under `dimensions`.\n\nAny Eurostat dataset code works, not only the curated 10; codes outside the whitelist will have empty `theme` / `description` / `unit_hint` but full `payload`, `dimensions`, and `sample_observations`.\n\n**When to use it**\nTo pull a Eurostat sport / fitness time series into your app (gym memberships, BMI per country, sport employment, physical-activity participation). One round-trip; you can render the verbatim JSON-stat payload yourself or use Brubru's `sample_observations` for a quick chart.\n\n**Input**\n- `dataset_code` (path): Eurostat dataset code (e.g. `hlth_ehis_pe9e`, `sport_emp_sex`, `hbs_str_t211`).\n- `geo`: filter to a single country (ISO-2 / Eurostat geo code, e.g. `ES`, `FR`, `DE`, `EU27_2020`). Optional.\n- `time`: filter to one year (e.g. `2023`). Optional.\n- `sex`: filter to one sex code (e.g. `T`, `F`, `M`). Optional, only meaningful for datasets with a sex dimension.\n- `include_payload`: include the full JSON-stat 2.0 `payload` (default `true`). Set to `false` to get only the summary + sample (smaller response).\n\n**Try it**\n```\nGET /api/v2/open-data/eurostat-series/hlth_ehis_pe9e?geo=ES&time=2019\nGET /api/v2/open-data/eurostat-series/sport_emp_sex?geo=EU27_2020\nGET /api/v2/open-data/eurostat-series/hbs_str_t211?include_payload=false\n```\n\n**You get back**\nAn `EurostatSeriesItem` with `payload` (JSON-stat 2.0), `dimensions`, `sample_observations`, plus the 5 datapoints. 404 with `reason_code: not_found` if Eurostat returns 404. 502 with `reason_code: upstream_unavailable` if Eurostat is down.\n\n**Data freshness**\nLive every call. Eurostat's own `updated` field is surfaced as `document_date`.","operationId":"get_eurostat_series_api_v2_open_data_eurostat_series__dataset_code__get","parameters":[{"name":"dataset_code","in":"path","required":true,"schema":{"type":"string","description":"Eurostat dataset code, e.g. 'hlth_ehis_pe9e' or 'sport_emp_sex'.","title":"Dataset Code"},"description":"Eurostat dataset code, e.g. 'hlth_ehis_pe9e' or 'sport_emp_sex'."},{"name":"geo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single geo code filter (e.g. ES, FR, EU27_2020).","title":"Geo"},"description":"Single geo code filter (e.g. ES, FR, EU27_2020)."},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single year filter, e.g. '2023'.","title":"Time"},"description":"Single year filter, e.g. '2023'."},{"name":"sex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single sex code filter, e.g. T, F, M.","title":"Sex"},"description":"Single sex code filter, e.g. T, F, M."},{"name":"include_payload","in":"query","required":false,"schema":{"type":"boolean","description":"Include the full JSON-stat 2.0 payload in the response.","default":true,"title":"Include Payload"},"description":"Include the full JSON-stat 2.0 payload in the response."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EurostatSeriesItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/who-is-who/departments":{"get":{"tags":["v2-who-is-who-departments"],"summary":"EU departments — organisational units across all EU institutions","description":"**What it does**\nReturns the organisational units of the EU institutions — Directorates-General, directorates, units, cabinets, services — from the official interinstitutional directory, each with its code and the number of officials listed.\n\n**When to use it**\nTo map the EU's organisational structure, resolve a department code, or find which unit owns a policy area.\n\n**Input**\n- `q` — substring search over department name / code.\n- `mnemonic` — exact department code (e.g. AGRI).\n- `limit` (default 25, max 100), `page`.\n\n**Try it**\n```\nGET /api/v2/who-is-who/departments?q=agriculture\n```\n\n**You get back**\nA `PaginatedResponse[WhoIsWhoDepartmentItem]`. The five envelope datapoints are filled (`public_url` = the Who is Who page, `body_txt`/`body_html` composed, `document_date` = null, `creation_date`).\n\n**Data freshness**\nSynced from the EU SPARQL endpoint (the structured EU Whoiswho directory). Bodies composed at ingest.","operationId":"list_departments_api_v2_who_is_who_departments_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"mnemonic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mnemonic"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WhoIsWhoDepartmentItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/who-is-who/departments/{item_id}":{"get":{"tags":["v2-who-is-who-departments"],"summary":"One EU department by id","description":"Fetch a single EU department by its Brubru UUID. 404 with `reason_code: not_found` if absent.","operationId":"get_department_api_v2_who_is_who_departments__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoIsWhoDepartmentItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/who-is-who/officials":{"get":{"tags":["v2-who-is-who-officials"],"summary":"EU officials — named officials with position and department","description":"**What it does**\nReturns named EU officials from the official interinstitutional directory — each with their position (job title) and the department they belong to, across all EU institutions.\n\n**When to use it**\nTo find who holds a position (e.g. the Director-General of a DG), or to list the officials of a department.\n\n**Input**\n- `q` — substring search over the official's name.\n- `department` — substring match on the department name.\n- `mnemonic` — exact department code.\n- `position` — substring match on the position / job title.\n- `limit` (default 25, max 100), `page`.\n\n**Try it**\n```\nGET /api/v2/who-is-who/officials?position=Director-General&mnemonic=AGRI\n```\n\n**You get back**\nA `PaginatedResponse[WhoIsWhoOfficialItem]`. The five envelope datapoints are filled (`public_url` = the Who is Who page, `body_txt`/`body_html` composed, `document_date` = null, `creation_date`).\n\n**Data freshness**\nSynced from the EU SPARQL endpoint (the structured EU Whoiswho directory). Bodies composed at ingest.","operationId":"list_officials_api_v2_who_is_who_officials_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"department","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"}},{"name":"mnemonic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mnemonic"}},{"name":"position","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WhoIsWhoOfficialItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/who-is-who/officials/{item_id}":{"get":{"tags":["v2-who-is-who-officials"],"summary":"One EU official by id","description":"Fetch a single EU official by its Brubru UUID. 404 with `reason_code: not_found` if absent.","operationId":"get_official_api_v2_who_is_who_officials__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoIsWhoOfficialItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/general-publications":{"get":{"summary":"EU general publications — brochures, reports and studies","description":"**What it does**\nReturns the EU Publications Office's general publications (brochures, reports, studies) — Cellar works of resource-type PUB_GEN — each with its title, publication date, and the read/download page.\n\n**When to use it**\nTo search the EU's catalogue of general (non-legal) publications across all policy areas.\n\n**Input**\n- `q` — substring search over the title.\n- `published_from`, `published_to` — bound on the publication date.\n- `limit` (default 25, max 100), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/general-publications?q=artificial+intelligence\n```\n\n**You get back**\nA `PaginatedResponse[GeneralPublicationItem]` with the five envelope datapoints filled (`public_url` = the publication page, `body_txt`/`body_html` composed, `document_date` = publication date, `creation_date`).\n\n**Data freshness**\nSynced from the EU SPARQL endpoint (Cellar). Bodies composed at ingest.","operationId":"list_general_publications_api_v2_general_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"published_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"}},{"name":"published_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_GeneralPublicationItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/general-publications/{item_id}":{"get":{"summary":"One EU general publication by id","description":"Fetch a single EU general publication by its Brubru UUID. 404 with `reason_code: not_found` if absent.","operationId":"get_general_publication_api_v2_general_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneralPublicationItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"DPP folder directory — what DPP carries","description":"**What it does**\nReturns Digital Product Passport (DPP) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/dpp\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_dpp_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Dpp Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/legal-framework":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — acts (newest first)","description":"**What it does**\nLists Digital Product Passport's acts, newest first. The acts that create digital product passport obligations, each with its registry hook: the ESPR framework itself, the implementing regulation for the registry, the harmonised-standards decision, and the sectoral laws named in Implementing Regulation (EU) 2026/1778 Article 1 (batteries, construction products, toys, detergents). The detail endpoint returns the full text of the act.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /legal-framework?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EUR-Lex and the Publications Office Cellar graph..","operationId":"list_ep_api_v2_dpp_legal_framework_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/legal-framework/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one act (full body)","description":"**What it does**\nReturns one Digital Product Passport act in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /legal-framework/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EUR-Lex and the Publications Office Cellar graph..","operationId":"detail_ep_api_v2_dpp_legal_framework__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/sectors":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — sector profiles (newest first)","description":"**What it does**\nLists Digital Product Passport's sector profiles, newest first. One profile per product group in the rollout: batteries, textiles and apparel, iron and steel, aluminium, tyres, construction products, furniture, mattresses, toys, detergents and ICT. Each carries the indicative date its passport becomes mandatory, its legal basis and the state of its delegated act.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /sectors?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission DPP sector pages and the ESPR working plan..","operationId":"list_ep_api_v2_dpp_sectors_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/sectors/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one sector profile (full body)","description":"**What it does**\nReturns one Digital Product Passport sector profile in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /sectors/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission DPP sector pages and the ESPR working plan..","operationId":"detail_ep_api_v2_dpp_sectors__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/registry":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — registry facts (newest first)","description":"**What it does**\nLists Digital Product Passport's registry facts, newest first. How registration works: the production and acceptance environments, the two registration pathways (user interface and API), what the unique registration identifier is and, importantly, what it is not (Article 13(5) states it is not proof of compliance).\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /registry?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission DPP registry pages and Reg. (EU) 2026/1778..","operationId":"list_ep_api_v2_dpp_registry_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/registry/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one registry fact (full body)","description":"**What it does**\nReturns one Digital Product Passport registry fact in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /registry/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission DPP registry pages and Reg. (EU) 2026/1778..","operationId":"detail_ep_api_v2_dpp_registry__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/standards":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — harmonised standards (newest first)","description":"**What it does**\nLists Digital Product Passport's harmonised standards, newest first. The six EN standards whose references were published in the OJ and which therefore carry a presumption of conformity for DPP requirements: data exchange protocols, unique identifiers, data carriers, storage and persistence, APIs, and system interoperability.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /standards?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from Commission Implementing Decision (EU) 2026/1736, Annex..","operationId":"list_ep_api_v2_dpp_standards_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/standards/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one harmonised standard (full body)","description":"**What it does**\nReturns one Digital Product Passport harmonised standard in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /standards/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from Commission Implementing Decision (EU) 2026/1736, Annex..","operationId":"detail_ep_api_v2_dpp_standards__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/data-points":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — data points (newest first)","description":"**What it does**\nLists Digital Product Passport's data points, newest first. The 71 concrete fields the battery passport must carry, each with its legal source in Regulation (EU) 2023/1542 and its applicability to electric-vehicle, light-means-of-transport and industrial batteries. This is the schema a passport platform builds against, and the template the later sectors follow. Where the guidance layout could not be read unambiguously the item says so in its body rather than asserting an obligation: check `applicability_confidence` in the body.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /data-points?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from Commission guidance 'Digital Batteries Passport: data points by category', version 1.0 of 28 July 2026..","operationId":"list_ep_api_v2_dpp_data_points_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/data-points/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one data point (full body)","description":"**What it does**\nReturns one Digital Product Passport data point in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /data-points/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from Commission guidance 'Digital Batteries Passport: data points by category', version 1.0 of 28 July 2026..","operationId":"detail_ep_api_v2_dpp_data_points__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/guidance":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — guidance documents (newest first)","description":"**What it does**\nLists Digital Product Passport's guidance documents, newest first. Commission-published guidance including the registry user guide for economic operators and the battery passport data-point guidance.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /guidance?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from Commission DPP guidance, user guides and FAQs..","operationId":"list_ep_api_v2_dpp_guidance_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/guidance/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one guidance document (full body)","description":"**What it does**\nReturns one Digital Product Passport guidance document in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /guidance/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from Commission DPP guidance, user guides and FAQs..","operationId":"detail_ep_api_v2_dpp_guidance__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/audiences":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — audience guides (newest first)","description":"**What it does**\nLists Digital Product Passport's audience guides, newest first. What the passport means for each group the regime addresses: economic operators, consumers, repairers and recyclers, and public authorities.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /audiences?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission DPP audience pages..","operationId":"list_ep_api_v2_dpp_audiences_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/audiences/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one audience guide (full body)","description":"**What it does**\nReturns one Digital Product Passport audience guide in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /audiences/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission DPP audience pages..","operationId":"detail_ep_api_v2_dpp_audiences__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/news":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — news items (newest first)","description":"**What it does**\nLists Digital Product Passport's news items, newest first. Commission announcements on the passport, the registry and sector milestones.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission single-market newsroom, filtered to DPP..","operationId":"list_ep_api_v2_dpp_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/news/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one news item (full body)","description":"**What it does**\nReturns one Digital Product Passport news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission single-market newsroom, filtered to DPP..","operationId":"detail_ep_api_v2_dpp_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/events":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — events (newest first)","description":"**What it does**\nLists Digital Product Passport's events, newest first. Webinars and stakeholder events on the passport, past and upcoming.\n\n**When to use it**\nTrack what DPP is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission single-market events listing, filtered to DPP..","operationId":"list_ep_api_v2_dpp_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/dpp/events/{item_id}":{"get":{"tags":["v2-dpp","v2-dpp"],"summary":"Digital Product Passport — one event (full body)","description":"**What it does**\nReturns one Digital Product Passport event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission single-market events listing, filtered to DPP..","operationId":"detail_ep_api_v2_dpp_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/guides":{"get":{"tags":["v2-proprietary-guides"],"summary":"List Brubru's curated EU-policy knowledge guides — the chatbot's grounding layer","description":"**What it does**\nReturns Brubru's curated knowledge-base guides — the same markdown explainers the chatbot uses to ground its answers. Each guide is a 100-300-line domain explainer for one policy area (AI Act, CBAM, MFF 2028-2034, ...) with a QUICK FACTS block at the top, a body, and keyword triggers. With no `q` this enumerates the **entire** corpus (~290 guides), page by page.\n\n**When to use it**\nGround your own LLM in Brubru's EU-policy knowledge: pull the guides for a topic with `q=<topic>`, embed them as context, and your assistant gets the same grounding the Brubru chatbot uses. Pass `detail_level=Full` for the complete markdown body (vs a 500-char preview at `Summary`).\n\n**Input**\n- `q` — keyword query (`GDPR`, `AI Act`, `CBAM`, `housing crisis`). Omit to list everything.\n- `detail_level` — `Summary` (default, 500-char preview) or `Full` (complete markdown).\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/guides?limit=100\nGET /api/v2/proprietary/guides?q=AI%20Act&detail_level=Full\n```\n\n**You get back**\nA `PaginatedResponse[KnowledgeGuideItem]`. Each item carries `id`, `title`, `quick_facts`, `triggers[]`, `content` (Full or preview), `content_preview`, `full_content_chars`. The 5 envelope datapoints sit on the envelope (per-item body lives in `content`).\n\n**Data freshness**\nBrubru-curated (not synced from external sources). Refreshed by `/morning` Phase 3D, `/audit-queries` gap-fills, and ad-hoc edits.","operationId":"list_guides_api_v2_proprietary_guides_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keyword query (e.g. 'GDPR', 'AI Act', 'CBAM'). Omit to list every guide.","title":"Q"},"description":"Keyword query (e.g. 'GDPR', 'AI Act', 'CBAM'). Omit to list every guide."},{"name":"detail_level","in":"query","required":false,"schema":{"type":"string","description":"Summary returns a 500-char preview; Full returns the full markdown body","default":"Summary","title":"Detail Level"},"description":"Summary returns a 500-char preview; Full returns the full markdown body"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (default 50, max 100)","default":50,"title":"Limit"},"description":"Items per page (default 50, max 100)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_KnowledgeGuideItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/guides/{guide_id}":{"get":{"tags":["v2-proprietary-guides"],"summary":"Look up one knowledge guide by its slug — full markdown body","description":"**What it does**\nReturns the full markdown content of one Brubru knowledge guide by its filename slug. Always returns the complete body — no truncation. Same content the chatbot injects into Claude/Mistral context for grounded answers.\n\n**When to use it**\nAfter locating a guide via the list endpoint (or when you already know the slug), fetch the full markdown for embedding in your own UI or feeding to a downstream LLM as context.\n\n**Input**\n- `guide_id` (path) — the guide's filename slug without `.md`, e.g. `ai_act_regulation`, `cbam_downstream_goods_extension`, `mff_2028_2034`.\n\n**Try it**\n```\nGET /api/v2/proprietary/guides/ai_act_regulation\n```\n\n**You get back**\nA single `KnowledgeGuideItem`: `id`, `title`, `quick_facts`, `triggers[]`, full `content` markdown, `full_content_chars`. HTTP 404 (`reason_code: not_found`) if no guide with that slug exists.\n\n**Data freshness**\nBrubru-curated. Updated by `/morning` Phase 3D + ad-hoc edits when major legislative developments warrant a refresh.","operationId":"get_guide_api_v2_proprietary_guides__guide_id__get","parameters":[{"name":"guide_id","in":"path","required":true,"schema":{"type":"string","title":"Guide Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeGuideItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/catalan":{"get":{"tags":["v2-proprietary-catalan"],"summary":"List EU binding laws translated into Catalan — the whole corpus, filterable","description":"**What it does**\nReturns a paginated catalogue of binding EU legal acts (Regulations, Directives, Decisions) translated into Catalan by Brubru. With no filters this enumerates the **entire** binding-law corpus (thousands of acts), page by page.\n\n**When to use it**\nBrowse, search, or sync the Catalan corpus — populate a search index, build a per-category dashboard, or pull updates incrementally with `updated_from`.\n\n**Input**\n- `q` — substring search across `title_ca`, `title_en`, `short_name`, `celex` (e.g. `GDPR`).\n- `celex` — exact CELEX filter (e.g. `32016R0679`).\n- `doc_type` — long form (`regulation`/`directive`/`decision`/`delegated`/`implementing`) or CELEX shorthand (`R`/`L`/`D`).\n- `category` / `category_en` — exact name or slug (see `/catalan/stats` for names).\n- `engine` — `softcatala` (default) or `sonnet`.\n- `updated_from` / `updated_to` — incremental sync over `updated_at`.\n- `limit` (1-200, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/catalan?q=GDPR&limit=3\nGET /api/v2/proprietary/catalan?doc_type=R&limit=50\n```\n\n**You get back**\nA `PaginatedResponse[CatalanTranslationItem]`. Per row: `celex`, `doc_type`, `short_name`, `title_ca`, `title_en`, `category`/`category_en`, `articles_count`, `recitals_count`, `html_size_bytes`, `engine`, `ca_url` (the canonical render on brubru.beresol.eu), `source_eurlex_url`, timestamps.\n\n**Data freshness**\nBrubru-curated (MIT-licensed). New translations are added via the `/catalan` skill; daily disk-to-DB sync keeps the table current.","operationId":"list_catalan_api_v2_proprietary_catalan_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search across title_ca, title_en, short_name, celex.","title":"Q"},"description":"Substring search across title_ca, title_en, short_name, celex."},{"name":"celex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact CELEX filter.","title":"Celex"},"description":"Exact CELEX filter."},{"name":"doc_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"regulation | directive | decision | delegated | implementing (or R/L/D shorthand).","title":"Doc Type"},"description":"regulation | directive | decision | delegated | implementing (or R/L/D shorthand)."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brubru category (Catalan name) — see /catalan/stats.","title":"Category"},"description":"Brubru category (Catalan name) — see /catalan/stats."},{"name":"category_en","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brubru category (English name).","title":"Category En"},"description":"Brubru category (English name)."},{"name":"engine","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"softcatala | sonnet","title":"Engine"},"description":"softcatala | sonnet"},{"name":"updated_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync — rows with updated_at >= value.","title":"Updated From"},"description":"Incremental sync — rows with updated_at >= value."},{"name":"updated_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Incremental sync upper bound — rows with updated_at <= value.","title":"Updated To"},"description":"Incremental sync upper bound — rows with updated_at <= value."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Items per page (default 50, max 200).","default":50,"title":"Limit"},"description":"Items per page (default 50, max 200)."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CatalanTranslationItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/catalan/stats":{"get":{"tags":["v2-proprietary-catalan"],"summary":"Catalan translations — aggregate counts (coverage, by doc_type / category / engine)","description":"**What it does**\nReturns aggregate counts of Catalan-translated EU acts grouped by `doc_type`, `category` (Catalan + English), and `engine`, plus the canonical 8,710 target and current coverage percentage.\n\n**When to use it**\nBuild a coverage dashboard, verify ingestion before pulling pages, or discover the canonical category names to use as filters on the list endpoint.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/proprietary/catalan/stats\n```\n\n**You get back**\n`CatalanStats`: `total`, `target` (8,710), `coverage_pct`, `by_doc_type[]`, `by_category[]` (use these names for the `category`/`category_en` filters), `by_engine[]`, `last_translated_at`, `licence` (`MIT`).\n\n**Data freshness**\nLive aggregate query over the `catalan_translations` table on each request.","operationId":"catalan_stats_api_v2_proprietary_catalan_stats_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalanStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/catalan/{celex}":{"get":{"tags":["v2-proprietary-catalan"],"summary":"One Catalan translation by CELEX — optional inlined body","description":"**What it does**\nReturns one Catalan-translated EU act by its CELEX number, optionally with the full rendered body inlined.\n\n**When to use it**\nWhen you have a CELEX and want the Catalan translation's metadata, optionally with the rendered HTML body for display or downstream processing.\n\n**Input**\n- `celex` (path) — CELEX (sector 3, forms R/L/D), e.g. `32016R0679` (GDPR), `32024R1689` (AI Act).\n- `body=html` (optional) — inlines the rendered Catalan HTML into `body_html` and a stripped plain-text version into `body_txt`.\n- `body_threshold` (optional, default 500) — minimum char length for `has_body=true`.\n\n**Try it**\n```\nGET /api/v2/proprietary/catalan/32016R0679\nGET /api/v2/proprietary/catalan/32016R0679?body=html\n```\n\n**You get back**\nAll list fields plus `has_body`, `body_html`, `body_txt` (the last two only when `?body=html`). HTTP 404 when the CELEX is outside the binding-law corpus or has no Catalan translation yet.\n\n**Data freshness**\nBrubru-curated (MIT). Generated by the `/catalan` skill; new translations land via daily disk-to-DB sync.","operationId":"get_catalan_api_v2_proprietary_catalan__celex__get","parameters":[{"name":"celex","in":"path","required":true,"schema":{"type":"string","title":"Celex"}},{"name":"body","in":"query","required":false,"schema":{"type":"string","description":"`html` (default) inlines the rendered Catalan body; any other value returns metadata only.","default":"html","title":"Body"},"description":"`html` (default) inlines the rendered Catalan body; any other value returns metadata only."},{"name":"body_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body.","default":500,"title":"Body Threshold"},"description":"Minimum character length of body_text required for has_body=True. Default 500. Lower it (e.g. 200) if the source data has legitimately short bodies (funding-call summaries, infringement summaries). Set 0 to make has_body=True on any non-empty body."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalanTranslationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/canon":{"get":{"tags":["v2-proprietary-canon"],"summary":"List every Brubru deep-dive report — the EU Canon + law deep-dives","description":"**What it does**\nReturns Brubru's catalogue of hand-built HTML deep-dive reports: the **EU Canon** (article-by-article explainers of binding EU laws, e.g. the AI Act, CRR, MiCA) and the **law deep-dives** (thematic explainers, e.g. the Biotech Act, Critical Medicines Act, EU Inc.). With no filters this enumerates the **entire** catalogue, each entry carrying its public URL and the languages it is published in.\n\n**When to use it**\nDiscover which laws Brubru has a published deep-dive for, link to the citizen-facing report, or pick a `slug` to fetch the full body via `/canon/{slug}`. Filter to one report type or one legal family to build a topic index.\n\n**Input**\n- `report_type` — `canon` (EU Canon) or `deep_dive` (law deep-dives). Omit for both.\n- `q` — substring over title, summary, slug, CELEX.\n- `legal_family` — cluster tag (e.g. `anti_subsidy_trade_remedies`, `eu_pharmaceutical`).\n- `language` — keep only reports published in this language (en/es/ca/fr/it/nl).\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/canon\nGET /api/v2/proprietary/canon?report_type=canon&legal_family=eu_pharmaceutical\nGET /api/v2/proprietary/canon?q=AI%20Act\n```\n\n**You get back**\nA `PaginatedResponse[CanonReport]`. Each item: `slug`, `report_type`, `title`, `summary`, `celex`, `doc_type`, `legal_family`, `languages[]`, `lang_urls{}`, `eurlex_url`, plus the 5 datapoints — including the **fully populated `body_html` + `body_txt`** (the rendered report and its plain-text rendering, in the `language` edition or English). `public_url` is the language page; `document_date` is the act's publication date for canon entries.\n\n**Data freshness**\nBrubru-curated. New reports ship via the `/canon` skill; the manifest is regenerated by `scripts/build_canon_manifest.py` and bodies re-seeded by `scripts/seed_proprietary_bodies.py`.","operationId":"list_canon_api_v2_proprietary_canon_get","parameters":[{"name":"report_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"canon | deep_dive (omit for both)","title":"Report Type"},"description":"canon | deep_dive (omit for both)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring over title, summary, slug, CELEX","title":"Q"},"description":"Substring over title, summary, slug, CELEX"},{"name":"legal_family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Legal-family cluster tag (e.g. eu_pharmaceutical)","title":"Legal Family"},"description":"Legal-family cluster tag (e.g. eu_pharmaceutical)"},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keep only reports published in this language (en/es/ca/fr/it/nl); also the body edition returned","title":"Language"},"description":"Keep only reports published in this language (en/es/ca/fr/it/nl); also the body edition returned"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CanonReport_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/canon/{slug}":{"get":{"tags":["v2-proprietary-canon"],"summary":"One Brubru deep-dive report by slug — optional inlined body","description":"**What it does**\nReturns one Brubru deep-dive report (EU Canon entry or law deep-dive) by its slug, optionally with the full rendered HTML body inlined in the requested language.\n\n**When to use it**\nAfter locating a report via the list endpoint, fetch its metadata — and, with `include_body=true`, the full rendered article-by-article explainer — for display or downstream processing.\n\n**Input**\n- `slug` (path) — the report slug, e.g. `2024-1689_aiact`, `2013-575_crr`, `biotech-act`.\n- `lang` (optional, default `en`) — which language edition to return for `body_html` / `body_txt` (falls back to English if that edition isn't published).\n- `include_body` (optional, default `true`) — set `false` to omit the body and return metadata only (lighter response).\n\n**Try it**\n```\nGET /api/v2/proprietary/canon/2024-1689_aiact\nGET /api/v2/proprietary/canon/2024-1689_aiact?lang=ca\nGET /api/v2/proprietary/canon/2024-1689_aiact?include_body=false\n```\n\n**You get back**\nA single `CanonReport`: `slug`, `report_type`, `title`, `summary`, `celex`, `doc_type`, `legal_family`, `languages[]`, `lang_urls{}`, `eurlex_url`, plus the 5 datapoints with **`body_html` + `body_txt` populated by default** (the rendered report + its plain-text rendering, served from the DB body cache). HTTP 404 (`reason_code: not_found`) for an unknown slug.\n\n**Data freshness**\nBrubru-curated. Bodies are seeded by `scripts/seed_proprietary_bodies.py` and re-seeded when a report changes.","operationId":"get_canon_api_v2_proprietary_canon__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","description":"Report slug (e.g. '2024-1689_aiact', 'biotech-act')","title":"Slug"},"description":"Report slug (e.g. '2024-1689_aiact', 'biotech-act')"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Body language edition to return (en/es/ca/fr/it/nl); falls back to English.","default":"en","title":"Lang"},"description":"Body language edition to return (en/es/ca/fr/it/nl); falls back to English."},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Default true — set false to omit body_html/body_txt for a lighter response.","default":true,"title":"Include Body"},"description":"Default true — set false to omit body_html/body_txt for a lighter response."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanonReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/brussels-lobbies":{"get":{"tags":["v2-proprietary-brussels-lobbies"],"summary":"Brussels lobbies — ranked directory of who is publishing what","description":"**What it does**\nReturns a ranked directory of every **Brussels-based** organisation in the EU Transparency Register, enriched with whether that organisation actually publishes news/updates on its own website and when it last did. \"Brussels-based\" means it declares an EU office or a head office in Brussels. Each row carries its normalised type (NGO, trade association, company, think tank, consultancy, law firm, trade union, academic, religious, public authority, third-country entity), its register profile, and its news-availability flags. This view does not exist anywhere else.\n\n**When to use it**\n- Monitor what the Brussels advocacy ecosystem is saying, in one ranked feed.\n- Find the most active lobbies on a policy area, or the freshest publishers in a given type.\n- Pick an organisation, then read its items via `/brussels-lobbies/{code}/news`.\n\n**Input**\n- `q` — substring over organisation name + acronym.\n- `org_type` — one of: ngo, trade_association, company, think_tank, consultancy, law_firm, trade_union, academic, religious, public_authority, third_country, self_employed, other.\n- `eutr_section` — official EUTR section I–VI.\n- `for_profit` (bool), `has_news` (bool — keep only orgs that publish news), `exclude_global_corp` (bool — drop multinationals' global newsrooms).\n- `interest` — substring on the declared policy-interest list.\n- `country` — head-office country (exact, case-insensitive).\n- `min_costs` — minimum upper-bound declared lobbying costs (EUR).\n- `order` — `recent` (default, freshest news first), `costs` (biggest spenders), `name`.\n- `limit` (1–200, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/brussels-lobbies?has_news=true&order=recent\nGET /api/v2/proprietary/brussels-lobbies?org_type=trade_association&interest=climate\n```\n\n**You get back**\nA `PaginatedResponse[BrusselsLobby]`. Each item: identification code, name, acronym, org_type, eutr_section, for_profit, is_global_corp, office_basis, head office, website, the three flags (`has_org_data`, `has_news_data`, plus `news_status`), news source kind + feed URL + last-item date + item count, influence signals (EP passes, FTE, costs, interests), and the 5 datapoints (the composed profile body, register URL, last-item date).\n\n**Data freshness**\nProfiles refresh daily from the Transparency Register XML; news detection runs on a tiered crawl (RSS / Atom / sitemap / validated path probe).","operationId":"list_brussels_lobbies_api_v2_proprietary_brussels_lobbies_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"org_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Type"}},{"name":"eutr_section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eutr Section"}},{"name":"for_profit","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"For Profit"}},{"name":"has_news","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has News"}},{"name":"exclude_global_corp","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exclude Global Corp"}},{"name":"interest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interest"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"min_costs","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Costs"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_BrusselsLobby_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/brussels-lobbies/types":{"get":{"tags":["v2-proprietary-brussels-lobbies"],"summary":"Brussels lobbies — organisation-type breakdown","description":"**What it does**\nReturns each organisation type with how many Brussels-based orgs it has and how many of those publish discoverable news. Powers the directory's type filter.\n\n**When to use it**\nBuild a type picker, or get a one-glance view of which parts of the Brussels ecosystem are most active online.\n\n**Input**\nNone.\n\n**Try it**\n```\nGET /api/v2/proprietary/brussels-lobbies/types\n```\n\n**You get back**\nA flat list of `OrgTypeFacet` (org_type, eutr_section, organisations, with_news) sorted by organisation count.\n\n**Data freshness**\nRecomputed live from brussels_lobby_profiles.","operationId":"list_types_api_v2_proprietary_brussels_lobbies_types_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrgTypeFacet"},"title":"Response List Types Api V2 Proprietary Brussels Lobbies Types Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/brussels-lobbies/{code}/news":{"get":{"tags":["v2-proprietary-brussels-lobbies"],"summary":"Brussels lobby — news / update items for one organisation","description":"**What it does**\nReturns the dated news/update items Brubru has detected on one Brussels lobby's own website, newest first. Items come from the organisation's RSS/Atom feed or sitemap; organisations whose news section is HTML-only return an empty list while still being flagged as publishing news in the directory (use `news_feed_url` there to link out).\n\n**When to use it**\n- Read what a specific lobby has published recently.\n- Build a per-organisation activity timeline.\n\n**Input**\n- `code` (path) — EU Transparency Register identification code (from the directory).\n- `since` (date, optional) — only items published on/after this date.\n- `limit` (1–100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/brussels-lobbies/03543031681-83/news\n```\n\n**You get back**\nA `PaginatedResponse[LobbyNewsItem]`: title, summary, item URL, published_at, source kind, and the 5 datapoints (item URL as public_url, composed body, published date).\n\n**Data freshness**\nRefreshed on the tiered news-detection crawl.","operationId":"get_lobby_news_api_v2_proprietary_brussels_lobbies__code__news_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","description":"Transparency Register identification code.","title":"Code"},"description":"Transparency Register identification code."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_LobbyNewsItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/tender-docs/templates":{"get":{"tags":["v2-proprietary-tender-docs"],"summary":"List Brubru's funding-application templates: section structure, comply targets, reference-doc bundles","description":"**What it does**\nReturns Brubru's library of funding-application templates for EU grant programmes: each one ships the section structure, AI co-writer prompt seeds, comply targets, and (for grant programmes) the model + annotated Grant Agreement URLs that the Tenderator product renders. List projection only: `documents`, `reference_docs`, and the rest of the detail-only payload sit on `/{template_id}`.\n\n19 templates (17 June 2026) across 8 programmes / 17 sub-instruments: EIC (8 templates: Accelerator Stage 1+2, Pathfinder Open + Challenges, Transition, STEP Scale-up, AIC Stage 1+2, Pre-Accelerator 2027), Erasmus+, Digital Europe, CERV, LIFE, Creative Europe (Culture + Media), CEF (Transport + Energy + Digital), ESF+ (Agency Procurement).\n\n**When to use it**\nBuilding a Tenderator-like UX in your own product, or enumerating Brubru's grant-template coverage before deciding which templates to deep-fetch. Filter by `programme` to scope (e.g. `programme=Horizon%20Europe`).\n\n**Input**\n- `programme`: programme name as stored on the templates (e.g. `Horizon Europe`, `Erasmus+`, `Digital Europe`, `CERV`, `LIFE`, `Creative Europe`, `Connecting Europe Facility`, `ESF+`).\n- `sub_instrument`: narrow to a sub-instrument (e.g. `accelerator`, `agency-procurement`).\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/tender-docs/templates\nGET /api/v2/proprietary/tender-docs/templates?programme=ESF%2B\n```\n\n**You get back**\nA `PaginatedResponse[TenderTemplateItem]`. Per item: `id`, `name`, `programme`, `sub_instrument`, `stage`, `scaffold_version`, `kb_guide`, `topic_id_default`, `deadline`, `official_template_url`, plus the 5 datapoints (`public_url` = official_template_url when known, `document_date` = the next deadline; `body_txt`/`body_html` null on list: fetch `/{template_id}` for the composed body).\n\n**Data freshness**\nBrubru-curated. Templates are committed JSON files; refreshed when EU programmes publish new calls or revise existing ones (see `kb_guide` for the related knowledge guide).","operationId":"list_templates_api_v2_proprietary_tender_docs_templates_get","parameters":[{"name":"programme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme name filter (case-insensitive).","title":"Programme"},"description":"Programme name filter (case-insensitive)."},{"name":"sub_instrument","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sub-instrument filter (case-insensitive).","title":"Sub Instrument"},"description":"Sub-instrument filter (case-insensitive)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TenderTemplateItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/tender-docs/templates/programmes":{"get":{"tags":["v2-proprietary-tender-docs"],"summary":"List distinct programmes with template counts","description":"**What it does**\nReturns the distinct EU funding programmes Brubru ships templates for, with a count of templates per programme: the facet used by the Tenderator \"Start a Tender Doc\" wizard.\n\n**When to use it**\nTo populate a programme picker before calling the list endpoint with `programme=<name>`.\n\n**Input**\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/tender-docs/templates/programmes\n```\n\n**You get back**\nA `PaginatedResponse[ProgrammeFacet]`. Each item: `programme`, `template_count`. Sorted alphabetically by programme.\n\n**Data freshness**\nSame as the list endpoint.","operationId":"list_programmes_api_v2_proprietary_tender_docs_templates_programmes_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProgrammeFacet_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/tender-docs/templates/{template_id}":{"get":{"tags":["v2-proprietary-tender-docs"],"summary":"Get one funding template by id: full section structure + reference_docs + grant-agreement URLs","description":"**What it does**\nReturns one funding template in full: every section, every AI co-writer prompt seed, the complete `reference_docs` bundle (guidance / model_documents / unit_costs / annotated MGA / ...), and the canonical Grant Agreement URLs. Composes `body_txt` / `body_html` from those sections so a downstream LLM can ingest the template as a single grounded context.\n\nThe richest reference-doc bundle today is `eic-accelerator-stage-2` (13 reference entries across 7 categories).\n\n**When to use it**\nTo preview a template before generating an application, to embed the section scaffold in your own UI, or to feed an LLM the full template as context for a custom drafter. Pair with `/comply-clusters?template_id=<id>` to surface the EU Law Comply clusters relevant to this template.\n\n**Input**\n- `template_id` (path): the template slug, e.g. `eic-accelerator-stage-2`, `cef-transport`, `esf-plus-agency-procurement`.\n\n**Try it**\n```\nGET /api/v2/proprietary/tender-docs/templates/eic-accelerator-stage-2\n```\n\n**You get back**\nA single `TenderTemplateItem` with every detail-only field populated: `documents` (full section trees), `comply_targets`, `hand_offs`, `model_grant_agreement_url`, `annotated_grant_agreement_url`, `reference_docs`, plus the 5 datapoints (`body_txt`/`body_html` composed from sections + references). HTTP 404 (`reason_code: not_found`) if the slug is unknown.\n\n**Data freshness**\nBrubru-curated. Committed JSON; refreshed when the underlying EU programme publishes a new revision.","operationId":"get_template_api_v2_proprietary_tender_docs_templates__template_id__get","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenderTemplateItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/tender-docs/comply-clusters":{"get":{"tags":["v2-proprietary-tender-docs"],"summary":"EU Law Comply clusters relevant to a funding template: Tender Docs cross-fetch","description":"**What it does**\nGiven a funding template id (+ optional `funding_mode` + ethics flags), returns the EU Law Comply clusters whose `policy_area` matches the template's declared `comply_targets`, plus any extras driven by ethics flags or by an equity/blended funding mode. Each cluster carries the law count, requirement count, and a `match_reason` array explaining why it surfaced (`template`, `ethics`, or `funding-mode`).\n\nSame resolution path as the v1 endpoint at `/api/eu-law-comply/by-topic-clusters`: one shared helper backs both. The v2 surface uses API-key auth (no tier gate).\n\n**When to use it**\nAfter picking a funding template (`/templates/{id}`), to populate a \"Compliance checklist\" panel that lists the EU laws the applicant will need to demonstrate compliance with. Pre-flight tool for grant applicants and for advisors building Tenderator-like products.\n\n**Input**\n- `template_id` (required): the template slug, e.g. `eic-accelerator-stage-2`, `esf-plus-agency-procurement`.\n- `funding_mode`: `equity-only` / `blended` triggers Sustainable Finance + AIFMD + AML cluster additions.\n- `ethics_personal_data`, `ethics_special_categories`, `ethics_clinical_studies`, `ethics_dual_use`, `ethics_animals`: booleans; each adds a curated set of clusters.\n- `limit` (1-100, default 50), `page` (1-indexed).\n\n**Try it**\n```\nGET /api/v2/proprietary/tender-docs/comply-clusters?template_id=eic-accelerator-stage-2\nGET /api/v2/proprietary/tender-docs/comply-clusters?template_id=esf-plus-agency-procurement&ethics_personal_data=true\n```\n\n**You get back**\nA `PaginatedResponse[TenderComplyClusterItem]`. Per item: `id`, `name`, `description`, `applicability`, `policy_area`, `priority_level`, `law_count`, `requirement_count`, `matched_targets`, `match_reason`, plus the 5 datapoints (`public_url` = Brubru Comply cluster page, `body_txt`/`body_html` composed). HTTP 404 if the `template_id` is unknown.\n\n**Data freshness**\nClusters are Brubru-curated (53 today). Refreshed when laws move between clusters or when new comply_target labels enter the template catalogue.","operationId":"list_comply_clusters_api_v2_proprietary_tender_docs_comply_clusters_get","parameters":[{"name":"template_id","in":"query","required":true,"schema":{"type":"string","description":"Funding template slug (see /templates for the catalogue).","title":"Template Id"},"description":"Funding template slug (see /templates for the catalogue)."},{"name":"funding_mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'grant' (default), 'equity-only', or 'blended': equity/blended add finance clusters.","title":"Funding Mode"},"description":"'grant' (default), 'equity-only', or 'blended': equity/blended add finance clusters."},{"name":"ethics_personal_data","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ethics Personal Data"}},{"name":"ethics_special_categories","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ethics Special Categories"}},{"name":"ethics_clinical_studies","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ethics Clinical Studies"}},{"name":"ethics_dual_use","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ethics Dual Use"}},{"name":"ethics_animals","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ethics Animals"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TenderComplyClusterItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/textile-circularity":{"get":{"tags":["v2-proprietary-textile-circularity"],"summary":"Live status of EU textile-circularity law","description":"**What it does**\nReturns the curated corpus of EU law that governs the textile / waste / ecodesign product lifecycle — the acts a digital product passport must track so it always shows the norm **in force**, not a copy that ages. Each act carries a stable ELI permalink, a plain-language title (Catalan / Spanish / English), its in-force status and key operational dates, the latest legislative step for acts still moving, and a Brubru deep-link. Titles, ELI and in-force status are resolved **live** from the EU Publications Office (Cellar), so this never returns the blanks a stale local mirror would.\n\n**When to use it**\nFeed a digital-product-passport platform (or any compliance surface) the live regulatory backbone for textiles: the Textile EPR / Waste Framework Directive, the ESPR, the PPWR, the Waste Shipments Regulation, the Critical Raw Materials Act and CBAM, plus the delegated acts and proposals still moving through the institutions.\n\n**Input**\n- `lang` — `ca` | `es` | `en` (default `ca`). Selects the title and key-date labels.\n- `status` — `in_force` | `pending` | `all` (default `all`). `pending` returns the delegated acts / proposals still in procedure.\n- `member_state` — `ES` | `BG` | ... . Restricts to acts that carry a transposition deadline for that Member State (directives) and echoes that date.\n- `include_delegated` — `true` (default) | `false`. Set `false` to drop the not-yet-adopted delegated acts / proposals.\n\n**Try it**\n```\nGET /api/v2/proprietary/textile-circularity?lang=ca\nGET /api/v2/proprietary/textile-circularity?status=pending\nGET /api/v2/proprietary/textile-circularity?member_state=ES\nGET /api/v2/proprietary/textile-circularity?lang=es&include_delegated=false\n```\n\n**You get back**\nA `PaginatedResponse[TextileAct]`. Each item: `celex` (or `procedure_ref` for pending acts), `kind`, `eli`, `title` (+ `titles{}` in ca/es/en), `role`, `status`, `in_force`, `entry_into_force`, `transposition[]` (per Member State), `key_dates[]`, `latest_step` (pending acts), `deep_link`, plus the 5 Brubru datapoints (`public_url` == the deep-link; `document_date`; `creation_date`). In-force acts carry a non-null `eli`; delegated acts / proposals carry a `procedure_ref` and a live `latest_step` instead.\n\n**Data freshness**\nCurated corpus, live-resolved. ELI / in-force / titles come from Cellar SPARQL (12h server-side cache); `latest_step` comes from `legislative_carriages`; transposition dates and key operational dates are Brubru-curated from the primary act. If Cellar is briefly unreachable the endpoint degrades to the curated values.","operationId":"list_textile_circularity_api_v2_proprietary_textile_circularity_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"ca | es | en (default ca)","default":"ca","title":"Lang"},"description":"ca | es | en (default ca)"},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"in_force | pending | all (default all)","default":"all","title":"Status"},"description":"in_force | pending | all (default all)"},{"name":"member_state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ES | BG | ... — restrict to acts with a transposition deadline for that Member State","title":"Member State"},"description":"ES | BG | ... — restrict to acts with a transposition deadline for that Member State"},{"name":"include_delegated","in":"query","required":false,"schema":{"type":"boolean","description":"Include not-yet-adopted delegated acts / proposals (default true)","default":true,"title":"Include Delegated"},"description":"Include not-yet-adopted delegated acts / proposals (default true)"},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TextileAct_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/proprietary/packaging-waste-regulation":{"get":{"tags":["v2-proprietary-ppwr"],"summary":"The EU Packaging Regulation (PPWR) in one call — applies from 12 August 2026","description":"**What it does**\nReturns everything you need on the **Packaging and Packaging Waste Regulation (Regulation (EU) 2025/40, PPWR)** in a single call: the act itself (CELEX + ELI + status), a **phased-obligation timeline** (the dates that actually bite — PFAS ban, recyclability grades, recycled content, reuse targets, deposit-return systems), the delegated acts still moving, and the official Commission resources (guidance, FAQ, facts, LEGISSUM) plus Brubru's deep-dive.\n\n**Heads-up on dates:** the PPWR **entered into force on 11 February 2025** and **applies from 12 August 2026** — these are different. The endpoint returns both, plus `days_until_application`.\n\n**When to use it**\nFor a compliance team, packaging producer, retailer or comms team tracking what the PPWR requires and when. One call gives the whole roadmap; feed it into a dashboard or a briefing.\n\n**Input**\n- `lang` — `ca` | `es` | `en` (default `en`). Selects the title and timeline labels.\n- `upcoming_only` — `true` returns only timeline milestones on/after today (default `false`).\n- `include_delegated` — include the delegated/implementing acts still moving (default `true`).\n- `include_news` — attach recent packaging & circular-economy news, with full article bodies (default `true`; keyword-matched, relevance approximate).\n- `include_body` — include the full guide body in `body_txt` + `body_html` (~80 KB; default `true`). Set `false` for a light response (timeline + resources + news only).\n\n**Try it**\n```\nGET /api/v2/proprietary/packaging-waste-regulation\nGET /api/v2/proprietary/packaging-waste-regulation?lang=es&upcoming_only=true\n```\n\n**You get back**\nA `PaginatedResponse[PpwrItem]`. The first item is the **regulation** — `celex`, `eli`, `title` (+ `titles{}`), `status`, `in_force`, `entry_into_force`, `applies_from`, `days_until_application`, `structure`, `repeals`, the `timeline[]`, `official_resources[]` and `related_news[]` (recent packaging/plastics news with full bodies), the Brubru `deep_link`, and the **full guide body in `body_txt` + `body_html`**. Further items are the delegated acts (with `procedure_ref` + live `latest_step`).\n\n**Data freshness**\nCurated corpus, verified against the PPWR knowledge guide + canon page; ELI/in-force re-confirmed live from Cellar; delegated-act status from `legislative_carriages`.","operationId":"packaging_waste_regulation_api_v2_proprietary_packaging_waste_regulation_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"ca | es | en (default en)","default":"en","title":"Lang"},"description":"ca | es | en (default en)"},{"name":"upcoming_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only timeline milestones on/after today","default":false,"title":"Upcoming Only"},"description":"Only timeline milestones on/after today"},{"name":"include_delegated","in":"query","required":false,"schema":{"type":"boolean","description":"Include delegated/implementing acts still moving","default":true,"title":"Include Delegated"},"description":"Include delegated/implementing acts still moving"},{"name":"include_news","in":"query","required":false,"schema":{"type":"boolean","description":"Attach recent packaging & circular-economy news (with backfilled bodies)","default":true,"title":"Include News"},"description":"Attach recent packaging & circular-economy news (with backfilled bodies)"},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Include the full guide body (body_txt + body_html, ~80 KB). Set false for a light response.","default":true,"title":"Include Body"},"description":"Include the full guide body (body_txt + body_html, ~80 KB). Set false for a light response."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_PpwrItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb":{"get":{"tags":["v2-ecb"],"summary":"ECB folder directory — the two bodies and what each one carries","description":"**What it does**\nLists the two bodies in the ECB folder (the European Central Bank and ECB Banking Supervision / SSM) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview to discover which resources (news, publications, events, legal acts) are populated before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ecb\n```\n\n**You get back**\nTwo body records, each with acronym, name, mandate, website and an `item_counts` map (e.g. `{\"news\": 30, \"publication\": 12, ...}`).\n\n**Data freshness**\nCounts are live from the database.","operationId":"ecb_directory_api_v2_ecb_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EcbBody"},"title":"Response Ecb Directory Api V2 Ecb Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/news":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — news items (newest first)","description":"**What it does**\nLists European Central Bank's news items, newest first. Covers press releases, speeches, interviews and The ECB Blog.\n\n**When to use it**\nTrack what the ECB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from ECB press & blog RSS feeds plus the server-rendered detail pages..","operationId":"list_ep_api_v2_ecb_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/news/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — one news item (full body)","description":"**What it does**\nReturns one European Central Bank news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from ECB press & blog RSS feeds plus the server-rendered detail pages..","operationId":"detail_ep_api_v2_ecb_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/publications":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — publications (newest first)","description":"**What it does**\nLists European Central Bank's publications, newest first. Working papers and statistical releases; bodies are extracted from the source PDFs.\n\n**When to use it**\nTrack what the ECB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from ECB publication RSS feeds (working papers, statistical releases) with PDF/HTML detail..","operationId":"list_ep_api_v2_ecb_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/publications/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — one publication (full body)","description":"**What it does**\nReturns one European Central Bank publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from ECB publication RSS feeds (working papers, statistical releases) with PDF/HTML detail..","operationId":"detail_ep_api_v2_ecb_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/events":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — events (newest first)","description":"**What it does**\nLists European Central Bank's events, newest first. Conferences, seminars and fora, with their dates.\n\n**When to use it**\nTrack what the ECB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECB conferences programme (headless-rendered, since the list is loaded client-side)..","operationId":"list_ep_api_v2_ecb_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/events/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — one event (full body)","description":"**What it does**\nReturns one European Central Bank event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECB conferences programme (headless-rendered, since the list is loaded client-side)..","operationId":"detail_ep_api_v2_ecb_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/legal-acts":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — legal acts (newest first)","description":"**What it does**\nLists European Central Bank's legal acts, newest first. ECB regulations, decisions, guidelines and opinions, each linking to its EUR-Lex record.\n\n**When to use it**\nTrack what the ECB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /legal-acts?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU Publications Office (Cellar SPARQL), with ECB as author. CELEX is taken verbatim, never derived..","operationId":"list_ep_api_v2_ecb_legal_acts_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/legal-acts/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — one legal act (full body)","description":"**What it does**\nReturns one European Central Bank legal act in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /legal-acts/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU Publications Office (Cellar SPARQL), with ECB as author. CELEX is taken verbatim, never derived..","operationId":"detail_ep_api_v2_ecb_legal_acts__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/datasets":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — statistical datasets (newest first)","description":"**What it does**\nLists European Central Bank's statistical datasets, newest first. The catalogue of ECB statistical datasets (dataflows) — e.g. exchange rates, bank lending survey, balance-sheet items. Each item gives the dataflow code, the Data Portal browse link and the SDMX data/structure API URLs so you can pull the actual time series. The ECB Data Portal is time-series data, so this is a catalogue, not the numbers themselves.\n\n**When to use it**\nTrack what the ECB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /datasets?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECB Data Portal SDMX dataflow catalogue..","operationId":"list_ep_api_v2_ecb_datasets_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/datasets/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb"],"summary":"European Central Bank — one statistical dataset (full body)","description":"**What it does**\nReturns one European Central Bank statistical dataset in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /datasets/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECB Data Portal SDMX dataflow catalogue..","operationId":"detail_ep_api_v2_ecb_datasets__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/news":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — news items (newest first)","description":"**What it does**\nLists ECB Banking Supervision's news items, newest first. Press releases, speeches, interviews, blog posts and supervisory newsletters.\n\n**When to use it**\nTrack what the SSM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from SSM press & speeches RSS feeds plus the server-rendered detail pages..","operationId":"list_ep_api_v2_ecb_banking_supervision_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/news/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — one news item (full body)","description":"**What it does**\nReturns one ECB Banking Supervision news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from SSM press & speeches RSS feeds plus the server-rendered detail pages..","operationId":"detail_ep_api_v2_ecb_banking_supervision_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/publications":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — publications (newest first)","description":"**What it does**\nLists ECB Banking Supervision's publications, newest first. SREP outcomes, supervisory reports, thematic reviews and good-practice guides.\n\n**When to use it**\nTrack what the SSM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SSM publications listing (headless-rendered) with PDF/HTML detail..","operationId":"list_ep_api_v2_ecb_banking_supervision_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/publications/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — one publication (full body)","description":"**What it does**\nReturns one ECB Banking Supervision publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SSM publications listing (headless-rendered) with PDF/HTML detail..","operationId":"detail_ep_api_v2_ecb_banking_supervision_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/events":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — events (newest first)","description":"**What it does**\nLists ECB Banking Supervision's events, newest first. Supervision conferences, fora and research events, with their dates.\n\n**When to use it**\nTrack what the SSM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SSM conferences programme (headless-rendered)..","operationId":"list_ep_api_v2_ecb_banking_supervision_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecb/banking-supervision/events/{item_id}":{"get":{"tags":["v2-ecb","v2-ecb-banking-supervision"],"summary":"ECB Banking Supervision — one event (full body)","description":"**What it does**\nReturns one ECB Banking Supervision event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SSM conferences programme (headless-rendered)..","operationId":"detail_ep_api_v2_ecb_banking_supervision_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions":{"get":{"tags":["v2-eu-financial-institutions"],"summary":"Economic & Financial Institutions of the EU — directory","description":"**What it does**\nLists the EU financial-supervision and financing bodies in this folder (EBA, ESMA, EIOPA, ESRB, SRB, EIB, AMLA, EPPO) with a count of stored items per resource type. Bodies appear here as each is built out.\n\n**When to use it**\nA one-call overview of which bodies and resources (news, publications, events) are populated before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eu-financial-institutions\n```\n\n**You get back**\nOne record per available body, with acronym, name, family, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"fin_directory_api_v2_eu_financial_institutions_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinBody"},"title":"Response Fin Directory Api V2 Eu Financial Institutions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — news items (newest first)","description":"**What it does**\nLists European Banking Authority's news items, newest first. Press releases, speeches and interviews from the European Banking Authority.\n\n**When to use it**\nTrack what the EBA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EBA press releases, speeches and interviews (server-rendered listings) plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eba_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — one news item (full body)","description":"**What it does**\nReturns one European Banking Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EBA press releases, speeches and interviews (server-rendered listings) plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eba_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — publications (newest first)","description":"**What it does**\nLists European Banking Authority's publications, newest first. Guidelines, technical standards, reports, consultation papers and factsheets.\n\n**When to use it**\nTrack what the EBA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EBA publications listing (server-rendered); document bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_eba_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — one publication (full body)","description":"**What it does**\nReturns one European Banking Authority publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EBA publications listing (server-rendered); document bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_eba_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — events (newest first)","description":"**What it does**\nLists European Banking Authority's events, newest first. Board of Supervisors meetings, research workshops, hearings and conferences, with their dates.\n\n**When to use it**\nTrack what the EBA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EBA events listing (server-rendered)..","operationId":"list_ep_api_v2_eu_financial_institutions_eba_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — one event (full body)","description":"**What it does**\nReturns one European Banking Authority event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EBA events listing (server-rendered)..","operationId":"detail_ep_api_v2_eu_financial_institutions_eba_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/credit-institutions":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — credit institutions (newest first)","description":"**What it does**\nLists European Banking Authority's credit institutions, newest first. Every credit institution and branch authorised in the EEA — name, LEI/entity code, national reference code, country, town, authorisation date, competent authority and deposit-guarantee scheme. Filter with q (e.g. an institution name, LEI or country code).\n\n**When to use it**\nTrack what the EBA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /credit-institutions?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EBA EUCLID Credit Institutions Register (CIR) API..","operationId":"list_ep_api_v2_eu_financial_institutions_eba_credit_institutions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eba/credit-institutions/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eba"],"summary":"European Banking Authority — one credit institution (full body)","description":"**What it does**\nReturns one European Banking Authority credit institution in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /credit-institutions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EBA EUCLID Credit Institutions Register (CIR) API..","operationId":"detail_ep_api_v2_eu_financial_institutions_eba_credit_institutions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — news items (newest first)","description":"**What it does**\nLists European Securities and Markets Authority's news items, newest first. Press releases, consultations, Q&As and reports from ESMA's news stream.\n\n**When to use it**\nTrack what ESMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESMA news listing (server-rendered, paginated) plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_esma_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — one news item (full body)","description":"**What it does**\nReturns one European Securities and Markets Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESMA news listing (server-rendered, paginated) plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_esma_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — publications (newest first)","description":"**What it does**\nLists European Securities and Markets Authority's publications, newest first. Consultation papers, reply forms and related library documents.\n\n**When to use it**\nTrack what ESMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESMA consultations/library listing (server-rendered); bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_esma_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — one publication (full body)","description":"**What it does**\nReturns one European Securities and Markets Authority publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESMA consultations/library listing (server-rendered); bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_esma_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/financial-instruments":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — financial instruments (newest first)","description":"**What it does**\nLists European Securities and Markets Authority's financial instruments, newest first. A bounded recent slice of the Financial Instruments Reference Data System — ISIN, name, CFI classification, currency, issuer LEI, trading venue (MIC) and first-trading date. FIRDS holds ~30M instruments; this surfaces the most recent admissions/changes. Filter with q (e.g. an ISIN, issuer LEI or instrument name).\n\n**When to use it**\nTrack what ESMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /financial-instruments?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from ESMA FIRDS — the latest daily delta file (ISO 20022), stream-parsed..","operationId":"list_ep_api_v2_eu_financial_institutions_esma_financial_instruments_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esma/financial-instruments/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esma"],"summary":"European Securities and Markets Authority — one financial instrument (full body)","description":"**What it does**\nReturns one European Securities and Markets Authority financial instrument in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /financial-instruments/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from ESMA FIRDS — the latest daily delta file (ISO 20022), stream-parsed..","operationId":"detail_ep_api_v2_eu_financial_institutions_esma_financial_instruments__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — news items (newest first)","description":"**What it does**\nLists European Insurance and Occupational Pensions Authority's news items, newest first. News articles, interviews, feature articles and speeches/presentations.\n\n**When to use it**\nTrack what EIOPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eiopa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — one news item (full body)","description":"**What it does**\nReturns one European Insurance and Occupational Pensions Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eiopa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — publications (newest first)","description":"**What it does**\nLists European Insurance and Occupational Pensions Authority's publications, newest first. Reports, technical standards, studies and consultations from the EIOPA document library.\n\n**When to use it**\nTrack what EIOPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eiopa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — one publication (full body)","description":"**What it does**\nReturns one European Insurance and Occupational Pensions Authority publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eiopa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — events (newest first)","description":"**What it does**\nLists European Insurance and Occupational Pensions Authority's events, newest first. Public workshops, debates and conferences, with their dates.\n\n**When to use it**\nTrack what EIOPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eiopa_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eiopa/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eiopa"],"summary":"European Insurance and Occupational Pensions Authority — one event (full body)","description":"**What it does**\nReturns one European Insurance and Occupational Pensions Authority event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from EIOPA's server-rendered EU ECL listings (with ISO-dated cards), paginated, plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eiopa_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — news items (newest first)","description":"**What it does**\nLists European Systemic Risk Board's news items, newest first. Press releases and speeches from the European Systemic Risk Board.\n\n**When to use it**\nTrack what the ESRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESRB press RSS feed (press releases + speeches) plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_esrb_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — one news item (full body)","description":"**What it does**\nReturns one European Systemic Risk Board news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESRB press RSS feed (press releases + speeches) plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_esrb_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — publications (newest first)","description":"**What it does**\nLists European Systemic Risk Board's publications, newest first. Recommendations, warnings, opinions, stress tests and responses.\n\n**When to use it**\nTrack what the ESRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESRB macroprudential-policy pages (server-rendered); bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_esrb_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — one publication (full body)","description":"**What it does**\nReturns one European Systemic Risk Board publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESRB macroprudential-policy pages (server-rendered); bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_esrb_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — events (newest first)","description":"**What it does**\nLists European Systemic Risk Board's events, newest first. Conferences, workshops and meetings, with their dates.\n\n**When to use it**\nTrack what the ESRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESRB schedule page (server-rendered)..","operationId":"list_ep_api_v2_eu_financial_institutions_esrb_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/esrb/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-esrb"],"summary":"European Systemic Risk Board — one event (full body)","description":"**What it does**\nReturns one European Systemic Risk Board event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESRB schedule page (server-rendered)..","operationId":"detail_ep_api_v2_eu_financial_institutions_esrb_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — news items (newest first)","description":"**What it does**\nLists Single Resolution Board's news items, newest first. Press releases, statements, speeches and interviews from the Single Resolution Board.\n\n**When to use it**\nTrack what the SRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SRB news archive (rendered from the SRB site) plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_srb_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — one news item (full body)","description":"**What it does**\nReturns one Single Resolution Board news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SRB news archive (rendered from the SRB site) plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_srb_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — publications (newest first)","description":"**What it does**\nLists Single Resolution Board's publications, newest first. Decisions, reports, guidance, budgets and other documents from the public register.\n\n**When to use it**\nTrack what the SRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SRB public register of documents; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_srb_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — one publication (full body)","description":"**What it does**\nReturns one Single Resolution Board publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SRB public register of documents; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_srb_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — events (newest first)","description":"**What it does**\nLists Single Resolution Board's events, newest first. Conferences, technical meetings and public engagements, with their dates.\n\n**When to use it**\nTrack what the SRB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SRB events listing..","operationId":"list_ep_api_v2_eu_financial_institutions_srb_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/srb/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-srb"],"summary":"Single Resolution Board — one event (full body)","description":"**What it does**\nReturns one Single Resolution Board event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SRB events listing..","operationId":"detail_ep_api_v2_eu_financial_institutions_srb_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — news items (newest first)","description":"**What it does**\nLists European Investment Bank's news items, newest first. Press releases from the EIB and the European Investment Fund (EIF), part of the EIB Group.\n\n**When to use it**\nTrack what the EIB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIB Group press feed (which also covers the European Investment Fund) plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eib_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — one news item (full body)","description":"**What it does**\nReturns one European Investment Bank news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIB Group press feed (which also covers the European Investment Fund) plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eib_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — publications (newest first)","description":"**What it does**\nLists European Investment Bank's publications, newest first. Reports, studies, annual reports and economics research from the EIB Group.\n\n**When to use it**\nTrack what the EIB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIB publications and research catalogue..","operationId":"list_ep_api_v2_eu_financial_institutions_eib_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — one publication (full body)","description":"**What it does**\nReturns one European Investment Bank publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIB publications and research catalogue..","operationId":"detail_ep_api_v2_eu_financial_institutions_eib_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — events (newest first)","description":"**What it does**\nLists European Investment Bank's events, newest first. Board meetings, conferences and other EIB Group events, with their dates.\n\n**When to use it**\nTrack what the EIB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIB events listing..","operationId":"list_ep_api_v2_eu_financial_institutions_eib_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — one event (full body)","description":"**What it does**\nReturns one European Investment Bank event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIB events listing..","operationId":"detail_ep_api_v2_eu_financial_institutions_eib_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/projects":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — projects (newest first)","description":"**What it does**\nLists European Investment Bank's projects, newest first. EIB-financed projects (pipeline): title, description, country/city, project id and release date. ~4,600 projects under appraisal or financing. Filter with q (e.g. a country, sector or project name).\n\n**When to use it**\nTrack what the EIB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /projects?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIB project pipeline open-data API..","operationId":"list_ep_api_v2_eu_financial_institutions_eib_projects_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eib/projects/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eib"],"summary":"European Investment Bank — one project (full body)","description":"**What it does**\nReturns one European Investment Bank project in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /projects/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIB project pipeline open-data API..","operationId":"detail_ep_api_v2_eu_financial_institutions_eib_projects__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — news items (newest first)","description":"**What it does**\nLists Anti-Money Laundering Authority's news items, newest first. News articles and press releases from the Anti-Money Laundering Authority.\n\n**When to use it**\nTrack what AMLA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the AMLA news RSS feed plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_amla_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — one news item (full body)","description":"**What it does**\nReturns one Anti-Money Laundering Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the AMLA news RSS feed plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_amla_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — publications (newest first)","description":"**What it does**\nLists Anti-Money Laundering Authority's publications, newest first. Guidelines, technical standards, consultation papers and other AMLA documents.\n\n**When to use it**\nTrack what AMLA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the AMLA document library; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_amla_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — one publication (full body)","description":"**What it does**\nReturns one Anti-Money Laundering Authority publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the AMLA document library; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_amla_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/events":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — events (newest first)","description":"**What it does**\nLists Anti-Money Laundering Authority's events, newest first. Public hearings and speaking engagements, with their dates.\n\n**When to use it**\nTrack what AMLA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the AMLA public hearings and speaking engagements listings..","operationId":"list_ep_api_v2_eu_financial_institutions_amla_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/amla/events/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-amla"],"summary":"Anti-Money Laundering Authority — one event (full body)","description":"**What it does**\nReturns one Anti-Money Laundering Authority event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the AMLA public hearings and speaking engagements listings..","operationId":"detail_ep_api_v2_eu_financial_institutions_amla_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eppo/news":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eppo"],"summary":"European Public Prosecutor's Office — news items (newest first)","description":"**What it does**\nLists European Public Prosecutor's Office's news items, newest first. Press releases on investigations, seizures and prosecutions from the European Public Prosecutor's Office.\n\n**When to use it**\nTrack what the EPPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EPPO news listing plus the detail pages..","operationId":"list_ep_api_v2_eu_financial_institutions_eppo_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eppo/news/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eppo"],"summary":"European Public Prosecutor's Office — one news item (full body)","description":"**What it does**\nReturns one European Public Prosecutor's Office news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EPPO news listing plus the detail pages..","operationId":"detail_ep_api_v2_eu_financial_institutions_eppo_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eppo/publications":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eppo"],"summary":"European Public Prosecutor's Office — publications (newest first)","description":"**What it does**\nLists European Public Prosecutor's Office's publications, newest first. Decisions, appointments, declarations of interest and other EPPO documents.\n\n**When to use it**\nTrack what the EPPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EPPO documents register; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eu_financial_institutions_eppo_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-financial-institutions/eppo/publications/{item_id}":{"get":{"tags":["v2-eu-financial-institutions","v2-eu-fin-eppo"],"summary":"European Public Prosecutor's Office — one publication (full body)","description":"**What it does**\nReturns one European Public Prosecutor's Office publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EPPO documents register; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eu_financial_institutions_eppo_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm":{"get":{"tags":["v2-esm"],"summary":"ESM folder directory — what the European Stability Mechanism carries","description":"**What it does**\nReturns the European Stability Mechanism with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview to discover which resources (news, publications, events) are populated before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/esm\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map (e.g. `{\"news\": 60, \"publication\": 13, \"event\": 5}`).\n\n**Data freshness**\nCounts are live from the database.","operationId":"esm_directory_api_v2_esm_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EsmBody"},"title":"Response Esm Directory Api V2 Esm Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/news":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — news items (newest first)","description":"**What it does**\nLists European Stability Mechanism's news items, newest first. Press releases and news from the European Stability Mechanism and the EFSF.\n\n**When to use it**\nTrack what the ESM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESM newsroom plus the detail pages..","operationId":"list_ep_api_v2_esm_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/news/{item_id}":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — one news item (full body)","description":"**What it does**\nReturns one European Stability Mechanism news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESM newsroom plus the detail pages..","operationId":"detail_ep_api_v2_esm_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/publications":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — publications (newest first)","description":"**What it does**\nLists European Stability Mechanism's publications, newest first. Annual reports, ESM briefs, research and analysis from the European Stability Mechanism.\n\n**When to use it**\nTrack what the ESM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESM publications listing..","operationId":"list_ep_api_v2_esm_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/publications/{item_id}":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — one publication (full body)","description":"**What it does**\nReturns one European Stability Mechanism publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESM publications listing..","operationId":"detail_ep_api_v2_esm_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/events":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — events (newest first)","description":"**What it does**\nLists European Stability Mechanism's events, newest first. Eurogroup meetings, Board of Governors meetings and other ESM events, with their dates.\n\n**When to use it**\nTrack what the ESM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESM events listing..","operationId":"list_ep_api_v2_esm_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/events/{item_id}":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — one event (full body)","description":"**What it does**\nReturns one European Stability Mechanism event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESM events listing..","operationId":"detail_ep_api_v2_esm_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/programmes":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — programmes (newest first)","description":"**What it does**\nLists European Stability Mechanism's programmes, newest first. The ESM/EFSF financial-assistance programmes (Greece, Ireland, Portugal, Spain, Cyprus), each with its programme overview. The detailed disbursement figures live in ESM's Power BI report; this catalogues the programmes and their narrative.\n\n**When to use it**\nTrack what the ESM is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /programmes?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESM/EFSF country financial-assistance programme pages..","operationId":"list_ep_api_v2_esm_programmes_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esm/programmes/{item_id}":{"get":{"tags":["v2-esm","v2-esm"],"summary":"European Stability Mechanism — one programme (full body)","description":"**What it does**\nReturns one European Stability Mechanism programme in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /programmes/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESM/EFSF country financial-assistance programme pages..","operationId":"detail_ep_api_v2_esm_programmes__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec":{"get":{"tags":["v2-berec","v2-berec"],"summary":"BEREC folder directory — what BEREC carries","description":"**What it does**\nReturns Body of European Regulators for Electronic Communications (BEREC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/berec\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_berec_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Berec Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/news":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — news items (newest first)","description":"**What it does**\nLists Body of European Regulators for Electronic Communications's news items, newest first. News and press releases from the Body of European Regulators for Electronic Communications.\n\n**When to use it**\nTrack what BEREC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the BEREC latest-news and press-releases listings plus the detail pages..","operationId":"list_ep_api_v2_berec_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/news/{item_id}":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — one news item (full body)","description":"**What it does**\nReturns one Body of European Regulators for Electronic Communications news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the BEREC latest-news and press-releases listings plus the detail pages..","operationId":"detail_ep_api_v2_berec_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/publications":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — publications (newest first)","description":"**What it does**\nLists Body of European Regulators for Electronic Communications's publications, newest first. Reports, work programmes, opinions and guidelines from BEREC.\n\n**When to use it**\nTrack what BEREC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the BEREC publications listing..","operationId":"list_ep_api_v2_berec_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/publications/{item_id}":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — one publication (full body)","description":"**What it does**\nReturns one Body of European Regulators for Electronic Communications publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the BEREC publications listing..","operationId":"detail_ep_api_v2_berec_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/events":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — events (newest first)","description":"**What it does**\nLists Body of European Regulators for Electronic Communications's events, newest first. Plenary meetings, workshops, public debriefings and stakeholder events, with their dates.\n\n**When to use it**\nTrack what BEREC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the BEREC events listing..","operationId":"list_ep_api_v2_berec_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/events/{item_id}":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — one event (full body)","description":"**What it does**\nReturns one Body of European Regulators for Electronic Communications event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the BEREC events listing..","operationId":"detail_ep_api_v2_berec_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/topics":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — topic pages (newest first)","description":"**What it does**\nLists Body of European Regulators for Electronic Communications's topic pages, newest first. Snapshots of BEREC's mission and strategy, tasks, tools, the Board of Regulators, working groups, external cooperation, the public consultation procedure, the annual work programme and the all-topics introductions (evolution of wireless networks, digital markets, roaming, end-user protection, cybersecurity and resilience).\n\n**When to use it**\nTrack what BEREC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of BEREC mission, governance and thematic pages..","operationId":"list_ep_api_v2_berec_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/berec/topics/{item_id}":{"get":{"tags":["v2-berec","v2-berec"],"summary":"Body of European Regulators for Electronic Communications — one topic page (full body)","description":"**What it does**\nReturns one Body of European Regulators for Electronic Communications topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of BEREC mission, governance and thematic pages..","operationId":"detail_ep_api_v2_berec_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer":{"get":{"tags":["v2-acer","v2-acer"],"summary":"ACER folder directory — what ACER carries","description":"**What it does**\nReturns Agency for the Cooperation of Energy Regulators (ACER) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/acer\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_acer_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Acer Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/news":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — news items (newest first)","description":"**What it does**\nLists Agency for the Cooperation of Energy Regulators's news items, newest first. News and press releases from the Agency for the Cooperation of Energy Regulators.\n\n**When to use it**\nTrack what ACER is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ACER news and press-releases listings plus the detail pages..","operationId":"list_ep_api_v2_acer_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/news/{item_id}":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — one news item (full body)","description":"**What it does**\nReturns one Agency for the Cooperation of Energy Regulators news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ACER news and press-releases listings plus the detail pages..","operationId":"detail_ep_api_v2_acer_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/publications":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — publications (newest first)","description":"**What it does**\nLists Agency for the Cooperation of Energy Regulators's publications, newest first. Market monitoring reports, position papers, opinions and other ACER documents.\n\n**When to use it**\nTrack what ACER is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ACER publications listing; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_acer_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/publications/{item_id}":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — one publication (full body)","description":"**What it does**\nReturns one Agency for the Cooperation of Energy Regulators publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ACER publications listing; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_acer_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/topics":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — topic pages (newest first)","description":"**What it does**\nLists Agency for the Cooperation of Energy Regulators's topic pages, newest first. Snapshots of ACER's thematic pages across the agency, electricity (market rules, infrastructure, connection and operation codes, security of supply, cybersecurity), gas (LNG price assessment, the market correction mechanism, decarbonisation, network codes), the green deal and REMIT wholesale-market surveillance.\n\n**When to use it**\nTrack what ACER is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ACER thematic landing pages..","operationId":"list_ep_api_v2_acer_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/acer/topics/{item_id}":{"get":{"tags":["v2-acer","v2-acer"],"summary":"Agency for the Cooperation of Energy Regulators — one topic page (full body)","description":"**What it does**\nReturns one Agency for the Cooperation of Energy Regulators topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ACER thematic landing pages..","operationId":"detail_ep_api_v2_acer_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit":{"get":{"tags":["v2-eit","v2-eit"],"summary":"EIT folder directory — what EIT carries","description":"**What it does**\nReturns European Institute of Innovation and Technology (EIT) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eit\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eit_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/news":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — news items (newest first)","description":"**What it does**\nLists European Institute of Innovation and Technology's news items, newest first. News from the European Institute of Innovation and Technology and its Knowledge and Innovation Communities.\n\n**When to use it**\nTrack what EIT is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIT news listing plus the detail pages..","operationId":"list_ep_api_v2_eit_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/news/{item_id}":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — one news item (full body)","description":"**What it does**\nReturns one European Institute of Innovation and Technology news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIT news listing plus the detail pages..","operationId":"detail_ep_api_v2_eit_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/events":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — events (newest first)","description":"**What it does**\nLists European Institute of Innovation and Technology's events, newest first. Conferences, summits and community events, with their dates.\n\n**When to use it**\nTrack what EIT is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIT events listing..","operationId":"list_ep_api_v2_eit_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/events/{item_id}":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — one event (full body)","description":"**What it does**\nReturns one European Institute of Innovation and Technology event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIT events listing..","operationId":"detail_ep_api_v2_eit_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/topics":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — topic pages (newest first)","description":"**What it does**\nLists European Institute of Innovation and Technology's topic pages, newest first. Snapshots of EIT's at-a-glance, community-activities, global-challenges and ecosystem-map pages, plus its Knowledge and Innovation Communities (EIT Climate-KIC, Digital, Food, InnoEnergy, RawMaterials, Urban Mobility, Water and Culture & Creativity).\n\n**When to use it**\nTrack what EIT is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EIT who-we-are and Innovation Community pages..","operationId":"list_ep_api_v2_eit_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eit/topics/{item_id}":{"get":{"tags":["v2-eit","v2-eit"],"summary":"European Institute of Innovation and Technology — one topic page (full body)","description":"**What it does**\nReturns one European Institute of Innovation and Technology topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EIT who-we-are and Innovation Community pages..","operationId":"detail_ep_api_v2_eit_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"ENISA folder directory — what ENISA carries","description":"**What it does**\nReturns European Union Agency for Cybersecurity (ENISA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/enisa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_enisa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Enisa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/news":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — news items (newest first)","description":"**What it does**\nLists European Union Agency for Cybersecurity's news items, newest first. News and press releases from the European Union Agency for Cybersecurity.\n\n**When to use it**\nTrack what ENISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ENISA news listing plus the detail pages..","operationId":"list_ep_api_v2_enisa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/news/{item_id}":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Cybersecurity news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ENISA news listing plus the detail pages..","operationId":"detail_ep_api_v2_enisa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/publications":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — publications (newest first)","description":"**What it does**\nLists European Union Agency for Cybersecurity's publications, newest first. Reports, threat landscapes, guidelines and studies from ENISA.\n\n**When to use it**\nTrack what ENISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ENISA publications listing..","operationId":"list_ep_api_v2_enisa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/publications/{item_id}":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — one publication (full body)","description":"**What it does**\nReturns one European Union Agency for Cybersecurity publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ENISA publications listing..","operationId":"detail_ep_api_v2_enisa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/topics":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Cybersecurity's topic pages, newest first. Snapshots of ENISA's about and audience pages and its cybersecurity topics: AI and next-gen technologies, cyber threats, certification and standards, critical-sector cybersecurity, digital identity and data protection, incident response and crisis management, risk management, product security, skills and competences, the state of cybersecurity in the EU and vulnerability disclosure.\n\n**When to use it**\nTrack what ENISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ENISA about, audience and cybersecurity-topic pages..","operationId":"list_ep_api_v2_enisa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/enisa/topics/{item_id}":{"get":{"tags":["v2-enisa","v2-enisa"],"summary":"European Union Agency for Cybersecurity — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Cybersecurity topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ENISA about, audience and cybersecurity-topic pages..","operationId":"detail_ep_api_v2_enisa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"eu-LISA folder directory — what eu-LISA carries","description":"**What it does**\nReturns European Union Agency for the Operational Management of Large-Scale IT Systems (eu-LISA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eu-lisa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eu_lisa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eu Lisa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/news":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — news items (newest first)","description":"**What it does**\nLists European Union Agency for the Operational Management of Large-Scale IT Systems's news items, newest first. News from the EU Agency for the Operational Management of Large-Scale IT Systems (EES, ETIAS, SIS, VIS, Eurodac).\n\n**When to use it**\nTrack what eu-LISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the eu-LISA news listing plus the detail pages..","operationId":"list_ep_api_v2_eu_lisa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/news/{item_id}":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for the Operational Management of Large-Scale IT Systems news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the eu-LISA news listing plus the detail pages..","operationId":"detail_ep_api_v2_eu_lisa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/publications":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — publications (newest first)","description":"**What it does**\nLists European Union Agency for the Operational Management of Large-Scale IT Systems's publications, newest first. Annual reports, statistics, research and corporate documents from eu-LISA.\n\n**When to use it**\nTrack what eu-LISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the eu-LISA publications listing..","operationId":"list_ep_api_v2_eu_lisa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/publications/{item_id}":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — one publication (full body)","description":"**What it does**\nReturns one European Union Agency for the Operational Management of Large-Scale IT Systems publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the eu-LISA publications listing..","operationId":"detail_ep_api_v2_eu_lisa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/events":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — events (newest first)","description":"**What it does**\nLists European Union Agency for the Operational Management of Large-Scale IT Systems's events, newest first. Conferences, industry roundtables and Management Board meetings, with their dates.\n\n**When to use it**\nTrack what eu-LISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the eu-LISA events listing..","operationId":"list_ep_api_v2_eu_lisa_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/events/{item_id}":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — one event (full body)","description":"**What it does**\nReturns one European Union Agency for the Operational Management of Large-Scale IT Systems event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the eu-LISA events listing..","operationId":"detail_ep_api_v2_eu_lisa_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/topics":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for the Operational Management of Large-Scale IT Systems's topic pages, newest first. Snapshots of eu-LISA's about pages and its activities: the large-scale IT systems (SIS, VIS, Eurodac, EES, ETIAS), interoperability, data protection, security, research and innovation, training, carriers, EMPACT and pilot projects.\n\n**When to use it**\nTrack what eu-LISA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of eu-LISA about and activities pages..","operationId":"list_ep_api_v2_eu_lisa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-lisa/topics/{item_id}":{"get":{"tags":["v2-eu-lisa","v2-eu-lisa"],"summary":"European Union Agency for the Operational Management of Large-Scale IT Systems — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for the Operational Management of Large-Scale IT Systems topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of eu-LISA about and activities pages..","operationId":"detail_ep_api_v2_eu_lisa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"EUIPO folder directory — what EUIPO carries","description":"**What it does**\nReturns European Union Intellectual Property Office (EUIPO) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euipo\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euipo_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euipo Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/news":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — news items (newest first)","description":"**What it does**\nLists European Union Intellectual Property Office's news items, newest first. News and announcements from the European Union Intellectual Property Office on trade marks, designs and IP enforcement.\n\n**When to use it**\nTrack what EUIPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUIPO news index (full text included in the source)..","operationId":"list_ep_api_v2_euipo_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/news/{item_id}":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — one news item (full body)","description":"**What it does**\nReturns one European Union Intellectual Property Office news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUIPO news index (full text included in the source)..","operationId":"detail_ep_api_v2_euipo_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/events":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — events (newest first)","description":"**What it does**\nLists European Union Intellectual Property Office's events, newest first. Conferences, webinars, IPforYOU sessions and DesignEuropa events, with their dates.\n\n**When to use it**\nTrack what EUIPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUIPO events index..","operationId":"list_ep_api_v2_euipo_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/events/{item_id}":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — one event (full body)","description":"**What it does**\nReturns one European Union Intellectual Property Office event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUIPO events index..","operationId":"detail_ep_api_v2_euipo_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/trademarks":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — trade marks (newest first)","description":"**What it does**\nLists European Union Intellectual Property Office's trade marks, newest first. A bounded slice of the most recent EU trade marks from TMview — name, application number, applicant, status, Nice classes and filing date (TMview holds millions of EUTMs; this surfaces the latest filings). Filter with q (e.g. an applicant or mark name).\n\n**When to use it**\nTrack what EUIPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /trademarks?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the TMview database (EUIPO/EM office), most recent first..","operationId":"list_ep_api_v2_euipo_trademarks_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/trademarks/{item_id}":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — one trade mark (full body)","description":"**What it does**\nReturns one European Union Intellectual Property Office trade mark in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /trademarks/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the TMview database (EUIPO/EM office), most recent first..","operationId":"detail_ep_api_v2_euipo_trademarks__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/topics":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — topic pages (newest first)","description":"**What it does**\nLists European Union Intellectual Property Office's topic pages, newest first. Snapshots of EUIPO's about and governance pages (the office, the Strategic Plan, quality) and its IP domains: trade marks, designs, law and guidelines, the Boards of Appeal, the Mediation Centre, the Observatory on IP infringements (enforcement, publications), the copyright knowledge centre, the SME corner and SME Fund, and IP enforcement.\n\n**When to use it**\nTrack what EUIPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EUIPO about and IP-domain pages..","operationId":"list_ep_api_v2_euipo_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euipo/topics/{item_id}":{"get":{"tags":["v2-euipo","v2-euipo"],"summary":"European Union Intellectual Property Office — one topic page (full body)","description":"**What it does**\nReturns one European Union Intellectual Property Office topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EUIPO about and IP-domain pages..","operationId":"detail_ep_api_v2_euipo_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"CPVO folder directory — what CPVO carries","description":"**What it does**\nReturns Community Plant Variety Office (CPVO) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cpvo\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cpvo_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cpvo Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/news":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — news items (newest first)","description":"**What it does**\nLists Community Plant Variety Office's news items, newest first. Official announcements and news from the Community Plant Variety Office.\n\n**When to use it**\nTrack what CPVO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CPVO news listing plus the detail pages..","operationId":"list_ep_api_v2_cpvo_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/news/{item_id}":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — one news item (full body)","description":"**What it does**\nReturns one Community Plant Variety Office news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CPVO news listing plus the detail pages..","operationId":"detail_ep_api_v2_cpvo_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/publications":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — publications (newest first)","description":"**What it does**\nLists Community Plant Variety Office's publications, newest first. Annual reports, statistics and corporate documents from the CPVO.\n\n**When to use it**\nTrack what CPVO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CPVO reports listing; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_cpvo_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/publications/{item_id}":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — one publication (full body)","description":"**What it does**\nReturns one Community Plant Variety Office publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CPVO reports listing; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_cpvo_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/events":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — events (newest first)","description":"**What it does**\nLists Community Plant Variety Office's events, newest first. Seminars, conferences and meetings, with their dates.\n\n**When to use it**\nTrack what CPVO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CPVO conferences and events listing..","operationId":"list_ep_api_v2_cpvo_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/events/{item_id}":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — one event (full body)","description":"**What it does**\nReturns one Community Plant Variety Office event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CPVO conferences and events listing..","operationId":"detail_ep_api_v2_cpvo_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/topics":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — topic pages (newest first)","description":"**What it does**\nLists Community Plant Variety Office's topic pages, newest first. Snapshots of CPVO reference pages: about us, our mission, the strategic plan, research and development, law and practice (board of appeal, legislation in force), reports, statistics and the FAQ on Community plant variety rights.\n\n**When to use it**\nTrack what CPVO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CPVO about, mission and law-and-practice pages..","operationId":"list_ep_api_v2_cpvo_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cpvo/topics/{item_id}":{"get":{"tags":["v2-cpvo","v2-cpvo"],"summary":"Community Plant Variety Office — one topic page (full body)","description":"**What it does**\nReturns one Community Plant Variety Office topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CPVO about, mission and law-and-practice pages..","operationId":"detail_ep_api_v2_cpvo_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/details":{"get":{"tags":["v2-geographical-indications"],"summary":"Search EU GI records with their production-area text, control body and geometry status","description":"**What it does** — Lists EU geographical indications from the harvested detail table, each with the plain-language description of its delimited production area, the competent authority / control body (where known), and whether a mapped boundary exists.\n\n**When to use it** — To find GIs by country, type or product and see which have a resolved map boundary before fetching the geometry.\n\n**Input** — Optional filters: `country` (2-letter, e.g. ES), `gi_type` (PDO/PGI/GI), `product_type` (e.g. wine, cheese), `q` (free text over name and area), `has_geometry`. Paginated with `page` and `limit`.\n\n**Try it** — `/api/v2/geographical-indications/details?country=ES&has_geometry=true`\n\n**You get back** — A page of records: protected name, type, product, countries, status, competent authority, the area description, area in km2, and a `has_geometry` flag.","operationId":"list_details_api_v2_geographical_indications_details_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":2},{"type":"null"}],"title":"Country"}},{"name":"gi_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gi Type"}},{"name":"product_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"has_geometry","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Geometry"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/details/{file_number}":{"get":{"tags":["v2-geographical-indications"],"summary":"Get one EU GI record with its full production-area text and control body","description":"**What it does** — Returns a single GI's full detail record.\n\n**When to use it** — When you have a file number (e.g. from the list) and want the complete area description and metadata.\n\n**Input** — `file_number` in the path (e.g. PDO-ES-A1560).\n\n**Try it** — `/api/v2/geographical-indications/details/PDO-ES-A1560`\n\n**You get back** — The record: name, type, product, countries, status, EU protection date, competent authority, full geographical-area text, area km2 and geometry status.","operationId":"get_detail_api_v2_geographical_indications_details__file_number__get","parameters":[{"name":"file_number","in":"path","required":true,"schema":{"type":"string","title":"File Number"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/geometry":{"get":{"tags":["v2-geographical-indications"],"summary":"Get the mapped boundaries of EU GIs as GeoJSON (for maps)","description":"**What it does** — Returns the resolved delimited areas of EU geographical indications as a standard GeoJSON FeatureCollection, ready to render on a map.\n\n**When to use it** — To draw GI production areas. Each feature's `confidence` says whether the boundary is municipality-precise or a province-level approximation.\n\n**Input** — Optional `country` (2-letter), `q` (name/area text), `precise_only` (only municipality-precise boundaries), `limit` (default 500, max 4000).\n\n**Try it** — `/api/v2/geographical-indications/geometry?country=ES&limit=200`\n\n**You get back** — `{type:'FeatureCollection', features:[...]}` in EPSG:4326; each feature's properties include name, gi_type, product_type, competent_authority, area_km2 and confidence.","operationId":"geometry_api_v2_geographical_indications_geometry_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":2},{"type":"null"}],"title":"Country"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"precise_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Precise Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":4000,"minimum":1,"default":500,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/geometry/{file_number}":{"get":{"tags":["v2-geographical-indications"],"summary":"Get one EU GI's mapped boundary as a GeoJSON Feature","description":"**What it does** — Returns a single GI's resolved boundary as a GeoJSON Feature.\n\n**When to use it** — To draw or inspect one GI's production area.\n\n**Input** — `file_number` in the path.\n\n**Try it** — `/api/v2/geographical-indications/geometry/PDO-ES-A1560`\n\n**You get back** — A GeoJSON Feature (EPSG:4326) with name, type, product, competent authority, area km2 and confidence in its properties; 404 if the GI has no geometry yet.","operationId":"geometry_one_api_v2_geographical_indications_geometry__file_number__get","parameters":[{"name":"file_number","in":"path","required":true,"schema":{"type":"string","title":"File Number"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/eu-register":{"get":{"tags":["v2-geographical-indications"],"summary":"the EU geographical-indications register (eAmbrosia) — EU geographical indications (newest first)","description":"**What it does**\nLists the EU geographical-indications register (eAmbrosia)'s EU geographical indications, newest first. Every EU geographical indication for wine, spirits, agricultural products and foodstuffs (PDO, PGI, GI and TSG) — protected name, type, product type, country, status, file number, EU protection date, legal instrument, CN classification, producer-group contact (where published) and Official Journal publications. ~3,997 entries. Filter with q (e.g. a name, country or product such as 'Champagne', 'cheese' or 'ES').\n\n**When to use it**\nTrack what DG AGRI is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /eu-register?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from eAmbrosia, the official EU GI register maintained by DG AGRI (the full register)..","operationId":"list_ep_api_v2_geographical_indications_eu_register_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/eu-register/{item_id}":{"get":{"tags":["v2-geographical-indications"],"summary":"the EU geographical-indications register (eAmbrosia) — one EU geographical indication (full body)","description":"**What it does**\nReturns one the EU geographical-indications register (eAmbrosia) EU geographical indication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /eu-register/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from eAmbrosia, the official EU GI register maintained by DG AGRI (the full register)..","operationId":"detail_ep_api_v2_geographical_indications_eu_register__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/third-country":{"get":{"tags":["v2-geographical-indications"],"summary":"eAmbrosia (third-country GIs) — third-country geographical indications (newest first)","description":"**What it does**\nLists eAmbrosia (third-country GIs)'s third-country geographical indications, newest first. Geographical indications from non-EU countries protected in the EU via bilateral or multilateral trade agreements (e.g. EU-Mercosur) — protected name, third country, product category, protection type, status and the agreement under which it is protected. ~2,044 entries. Filter with q (e.g. a country or product).\n\n**When to use it**\nTrack what DG AGRI / DG TRADE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /third-country?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from eAmbrosia, the third-country GIs protected in the EU under international trade agreements..","operationId":"list_ep_api_v2_geographical_indications_third_country_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/third-country/{item_id}":{"get":{"tags":["v2-geographical-indications"],"summary":"eAmbrosia (third-country GIs) — one third-country geographical indication (full body)","description":"**What it does**\nReturns one eAmbrosia (third-country GIs) third-country geographical indication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /third-country/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from eAmbrosia, the third-country GIs protected in the EU under international trade agreements..","operationId":"detail_ep_api_v2_geographical_indications_third_country__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/giview":{"get":{"tags":["v2-geographical-indications"],"summary":"GIView (EUIPO) — geographical indications (newest first)","description":"**What it does**\nLists GIView (EUIPO)'s geographical indications, newest first. Every EU geographical indication (PDO, PGI and GI for spirits/wines) as held in EUIPO's GIView portal — protected name, type, product type, country, EU protection date, file number and status. ~3,960 entries from the agri and craft/industrial union registers. Filter with q (e.g. a name, country or product).\n\n**When to use it**\nTrack what EUIPO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /giview?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the GIView EU geographical-indications register (the full union register)..","operationId":"list_ep_api_v2_geographical_indications_giview_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/geographical-indications/giview/{item_id}":{"get":{"tags":["v2-geographical-indications"],"summary":"GIView (EUIPO) — one geographical indication (full body)","description":"**What it does**\nReturns one GIView (EUIPO) geographical indication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /giview/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the GIView EU geographical-indications register (the full union register)..","operationId":"detail_ep_api_v2_geographical_indications_giview__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema":{"get":{"tags":["v2-ema","v2-ema"],"summary":"EMA folder directory — what EMA carries","description":"**What it does**\nReturns European Medicines Agency (EMA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ema\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ema_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ema Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/news":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — news items (newest first)","description":"**What it does**\nLists European Medicines Agency's news items, newest first. News from the European Medicines Agency on human and veterinary medicines, safety and public-health threats.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA news listing plus the detail pages..","operationId":"list_ep_api_v2_ema_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/news/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one news item (full body)","description":"**What it does**\nReturns one European Medicines Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA news listing plus the detail pages..","operationId":"detail_ep_api_v2_ema_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/events":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — events (newest first)","description":"**What it does**\nLists European Medicines Agency's events, newest first. Committee meetings (CHMP, PRAC, CVMP and others), info days and training, with their dates.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA upcoming-events listing..","operationId":"list_ep_api_v2_ema_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/events/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one event (full body)","description":"**What it does**\nReturns one European Medicines Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA upcoming-events listing..","operationId":"detail_ep_api_v2_ema_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/medicines":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — medicines (newest first)","description":"**What it does**\nLists European Medicines Agency's medicines, newest first. Every medicine evaluated by EMA — name, EMA product number, status, INN, active substance, therapeutic area, marketing-authorisation holder, key dates and the EPAR URL. Filter with q (e.g. an active substance or therapeutic area).\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /medicines?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA medicines dataset (the full register of EU-evaluated medicines / EPARs)..","operationId":"list_ep_api_v2_ema_medicines_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/medicines/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one medicine (full body)","description":"**What it does**\nReturns one European Medicines Agency medicine in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /medicines/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA medicines dataset (the full register of EU-evaluated medicines / EPARs)..","operationId":"detail_ep_api_v2_ema_medicines__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/topics":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — topic pages (newest first)","description":"**What it does**\nLists European Medicines Agency's topic pages, newest first. Snapshots of EMA's about-us pages (who we are, what we do, how we work, the European medicines regulatory network, crisis preparedness, history, SME support, annual reports), its scientific committees (CHMP, PRAC, CAT, COMP, HMPC, CVMP, PDCO) and the human-regulatory overview.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EMA about-us, scientific-committee and human-regulatory pages..","operationId":"list_ep_api_v2_ema_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/topics/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one topic page (full body)","description":"**What it does**\nReturns one European Medicines Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EMA about-us, scientific-committee and human-regulatory pages..","operationId":"detail_ep_api_v2_ema_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/shortages":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — shortages (newest first)","description":"**What it does**\nLists European Medicines Agency's shortages, newest first. Medicine shortages reported to EMA — affected medicine, status and key dates.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /shortages?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA shortages dataset..","operationId":"list_ep_api_v2_ema_shortages_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/shortages/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one shortage (full body)","description":"**What it does**\nReturns one European Medicines Agency shortage in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /shortages/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA shortages dataset..","operationId":"detail_ep_api_v2_ema_shortages__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/referrals":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — referral procedures (newest first)","description":"**What it does**\nLists European Medicines Agency's referral procedures, newest first. EU referral procedures (safety/scientific reviews) handled by EMA committees.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /referrals?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA referral procedures dataset..","operationId":"list_ep_api_v2_ema_referrals_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/referrals/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one referral procedure (full body)","description":"**What it does**\nReturns one European Medicines Agency referral procedure in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /referrals/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA referral procedures dataset..","operationId":"detail_ep_api_v2_ema_referrals__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/orphan-designations":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — orphan designations (newest first)","description":"**What it does**\nLists European Medicines Agency's orphan designations, newest first. Orphan-medicine designations — active substance, intended use, status and dates.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /orphan-designations?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA orphan designations dataset..","operationId":"list_ep_api_v2_ema_orphan_designations_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/orphan-designations/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one orphan designation (full body)","description":"**What it does**\nReturns one European Medicines Agency orphan designation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /orphan-designations/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA orphan designations dataset..","operationId":"detail_ep_api_v2_ema_orphan_designations__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/post-authorisation":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — post-authorisation procedures (newest first)","description":"**What it does**\nLists European Medicines Agency's post-authorisation procedures, newest first. Post-authorisation procedures affecting authorised medicines.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /post-authorisation?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA post-authorisation procedures dataset..","operationId":"list_ep_api_v2_ema_post_authorisation_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/post-authorisation/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one post-authorisation procedure (full body)","description":"**What it does**\nReturns one European Medicines Agency post-authorisation procedure in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /post-authorisation/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA post-authorisation procedures dataset..","operationId":"detail_ep_api_v2_ema_post_authorisation__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/paediatric-investigation-plans":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — paediatric investigation plans (newest first)","description":"**What it does**\nLists European Medicines Agency's paediatric investigation plans, newest first. Paediatric investigation plans (PIPs) agreed by the EMA Paediatric Committee.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /paediatric-investigation-plans?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA paediatric investigation plans dataset..","operationId":"list_ep_api_v2_ema_paediatric_investigation_plans_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/paediatric-investigation-plans/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one paediatric investigation plan (full body)","description":"**What it does**\nReturns one European Medicines Agency paediatric investigation plan in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /paediatric-investigation-plans/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA paediatric investigation plans dataset..","operationId":"detail_ep_api_v2_ema_paediatric_investigation_plans__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/psusa":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — PSUSA assessments (newest first)","description":"**What it does**\nLists European Medicines Agency's PSUSA assessments, newest first. Periodic safety update single assessments (PSUSA) — active substance and outcome.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /psusa?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA PSUSA assessments dataset..","operationId":"list_ep_api_v2_ema_psusa_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/psusa/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one PSUSA assessment (full body)","description":"**What it does**\nReturns one European Medicines Agency PSUSA assessment in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /psusa/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA PSUSA assessments dataset..","operationId":"detail_ep_api_v2_ema_psusa__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/herbal-medicines":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — herbal medicines (newest first)","description":"**What it does**\nLists European Medicines Agency's herbal medicines, newest first. Herbal medicinal substances assessed by the EMA HMPC.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /herbal-medicines?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA herbal medicines dataset..","operationId":"list_ep_api_v2_ema_herbal_medicines_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/herbal-medicines/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one herbal medicine (full body)","description":"**What it does**\nReturns one European Medicines Agency herbal medicine in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /herbal-medicines/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA herbal medicines dataset..","operationId":"detail_ep_api_v2_ema_herbal_medicines__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/maximum-residue-limits":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — maximum residue limits (newest first)","description":"**What it does**\nLists European Medicines Agency's maximum residue limits, newest first. Maximum residue limits (MRLs) for veterinary substances in food.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /maximum-residue-limits?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA maximum residue limits dataset..","operationId":"list_ep_api_v2_ema_maximum_residue_limits_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/maximum-residue-limits/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one maximum residue limit (full body)","description":"**What it does**\nReturns one European Medicines Agency maximum residue limit in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /maximum-residue-limits/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA maximum residue limits dataset..","operationId":"detail_ep_api_v2_ema_maximum_residue_limits__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/dhpc":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — direct healthcare professional communications (newest first)","description":"**What it does**\nLists European Medicines Agency's direct healthcare professional communications, newest first. Direct healthcare professional communications (DHPCs) — urgent safety information.\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /dhpc?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA direct healthcare professional communications dataset..","operationId":"list_ep_api_v2_ema_dhpc_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/dhpc/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one direct healthcare professional communication (full body)","description":"**What it does**\nReturns one European Medicines Agency direct healthcare professional communication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /dhpc/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA direct healthcare professional communications dataset..","operationId":"detail_ep_api_v2_ema_dhpc__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/opinions-outside-eu":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — opinions for use outside the EU (newest first)","description":"**What it does**\nLists European Medicines Agency's opinions for use outside the EU, newest first. Scientific opinions on medicines intended for markets outside the EU (Article 58).\n\n**When to use it**\nTrack what EMA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /opinions-outside-eu?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMA opinions for use outside the EU dataset..","operationId":"list_ep_api_v2_ema_opinions_outside_eu_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ema/opinions-outside-eu/{item_id}":{"get":{"tags":["v2-ema","v2-ema"],"summary":"European Medicines Agency — one opinions for use outside the EU (full body)","description":"**What it does**\nReturns one European Medicines Agency opinions for use outside the EU in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /opinions-outside-eu/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMA opinions for use outside the EU dataset..","operationId":"detail_ep_api_v2_ema_opinions_outside_eu__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"ECDC folder directory — what ECDC carries","description":"**What it does**\nReturns European Centre for Disease Prevention and Control (ECDC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ecdc\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ecdc_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ecdc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/news":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — news items (newest first)","description":"**What it does**\nLists European Centre for Disease Prevention and Control's news items, newest first. News and press releases from the European Centre for Disease Prevention and Control.\n\n**When to use it**\nTrack what ECDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECDC news search feed plus the detail pages..","operationId":"list_ep_api_v2_ecdc_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/news/{item_id}":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — one news item (full body)","description":"**What it does**\nReturns one European Centre for Disease Prevention and Control news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECDC news search feed plus the detail pages..","operationId":"detail_ep_api_v2_ecdc_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/publications":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — publications (newest first)","description":"**What it does**\nLists European Centre for Disease Prevention and Control's publications, newest first. Surveillance reports, risk assessments, threat reports and guidance from ECDC.\n\n**When to use it**\nTrack what ECDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECDC publications search feed..","operationId":"list_ep_api_v2_ecdc_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/publications/{item_id}":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — one publication (full body)","description":"**What it does**\nReturns one European Centre for Disease Prevention and Control publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECDC publications search feed..","operationId":"detail_ep_api_v2_ecdc_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/surveillance":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — surveillance topics (newest first)","description":"**What it does**\nLists European Centre for Disease Prevention and Control's surveillance topics, newest first. Catalogue of the infectious diseases under EU surveillance — each with its Atlas link and the REST API for the case figures by country and period. The Atlas holds time-series surveillance data, so this is a catalogue of topics, not the numbers.\n\n**When to use it**\nTrack what ECDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /surveillance?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECDC Surveillance Atlas of Infectious Diseases (REST API)..","operationId":"list_ep_api_v2_ecdc_surveillance_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/surveillance/{item_id}":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — one surveillance topic (full body)","description":"**What it does**\nReturns one European Centre for Disease Prevention and Control surveillance topic in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /surveillance/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECDC Surveillance Atlas of Infectious Diseases (REST API)..","operationId":"detail_ep_api_v2_ecdc_surveillance__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/topics":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — topic pages (newest first)","description":"**What it does**\nLists European Centre for Disease Prevention and Control's topic pages, newest first. Snapshots of ECDC reference pages: about us and governance, what we do, partnerships and disease/laboratory networks, country support, data tools, the EPIET/EUPHEM fellowship and training, outbreak surveillance tools, EpiPulse, the GeoPortal, RespiCast and the learning portal.\n\n**When to use it**\nTrack what ECDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ECDC about, tools and data-portal pages..","operationId":"list_ep_api_v2_ecdc_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ecdc/topics/{item_id}":{"get":{"tags":["v2-ecdc","v2-ecdc"],"summary":"European Centre for Disease Prevention and Control — one topic page (full body)","description":"**What it does**\nReturns one European Centre for Disease Prevention and Control topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ECDC about, tools and data-portal pages..","operationId":"detail_ep_api_v2_ecdc_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"EFSA folder directory — what EFSA carries","description":"**What it does**\nReturns European Food Safety Authority (EFSA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/efsa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_efsa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Efsa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/news":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — news items (newest first)","description":"**What it does**\nLists European Food Safety Authority's news items, newest first. News and press releases from the European Food Safety Authority.\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFSA press RSS feed plus the detail pages..","operationId":"list_ep_api_v2_efsa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/news/{item_id}":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — one news item (full body)","description":"**What it does**\nReturns one European Food Safety Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFSA press RSS feed plus the detail pages..","operationId":"detail_ep_api_v2_efsa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/publications":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — publications (newest first)","description":"**What it does**\nLists European Food Safety Authority's publications, newest first. Scientific opinions, statements, guidance and data reports from EFSA.\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFSA publications listing (EFSA Journal scientific outputs and reports)..","operationId":"list_ep_api_v2_efsa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/publications/{item_id}":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — one publication (full body)","description":"**What it does**\nReturns one European Food Safety Authority publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFSA publications listing (EFSA Journal scientific outputs and reports)..","operationId":"detail_ep_api_v2_efsa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/topics":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — topic pages (newest first)","description":"**What it does**\nLists European Food Safety Authority's topic pages, newest first. Snapshots of EFSA's about page and its thematic topics: animal health and welfare, antimicrobial resistance, biological hazards, chemical contaminants, emerging risks, feed and food additives, food contact materials, food ingredients, GMOs, novel food, nutrition, pesticides and plant health.\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EFSA about and thematic topic pages..","operationId":"list_ep_api_v2_efsa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/topics/{item_id}":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — one topic page (full body)","description":"**What it does**\nReturns one European Food Safety Authority topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EFSA about and thematic topic pages..","operationId":"detail_ep_api_v2_efsa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/openfoodtox":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — OpenFoodTox substances (newest first)","description":"**What it does**\nLists European Food Safety Authority's OpenFoodTox substances, newest first. OpenFoodTox 3.0 — EFSA's chemical hazards database: substances with CAS number, IUPAC name and regulatory references.\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /openfoodtox?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFSA OpenFoodTox substances dataset (Zenodo)..","operationId":"list_ep_api_v2_efsa_openfoodtox_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/openfoodtox/{item_id}":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — one OpenFoodTox substance (full body)","description":"**What it does**\nReturns one European Food Safety Authority OpenFoodTox substance in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /openfoodtox/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFSA OpenFoodTox substances dataset (Zenodo)..","operationId":"detail_ep_api_v2_efsa_openfoodtox__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/xylella-host-plants":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — Xylella host-plant records (newest first)","description":"**What it does**\nLists European Food Safety Authority's Xylella host-plant records, newest first. Host plants of Xylella fastidiosa — one record per observation (plant taxon, Xylella species/subspecies, reference, infection type).\n\n**When to use it**\nTrack what EFSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /xylella-host-plants?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFSA Xylella host-plant records dataset (Zenodo)..","operationId":"list_ep_api_v2_efsa_xylella_host_plants_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efsa/xylella-host-plants/{item_id}":{"get":{"tags":["v2-efsa","v2-efsa"],"summary":"European Food Safety Authority — one Xylella host-plant record (full body)","description":"**What it does**\nReturns one European Food Safety Authority Xylella host-plant record in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /xylella-host-plants/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFSA Xylella host-plant records dataset (Zenodo)..","operationId":"detail_ep_api_v2_efsa_xylella_host_plants__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea":{"get":{"tags":["v2-eea","v2-eea"],"summary":"EEA folder directory — what EEA carries","description":"**What it does**\nReturns European Environment Agency (EEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/indicators":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — environmental indicators (newest first)","description":"**What it does**\nLists European Environment Agency's environmental indicators, newest first. The EEA's curated environmental indicators — air, climate, biodiversity, waste, water, energy and more. Each entry is the standing assessment of the state of and trends in one environmental issue, with its topic and indicator-code tags, last-update date and the indicator page. Filter with q (e.g. a topic such as 'air pollution' or an indicator code such as AIR009).\n\n**When to use it**\nTrack what EEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /indicators?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEA environmental indicators (Plone REST API)..","operationId":"list_ep_api_v2_eea_indicators_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/indicators/{item_id}":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — one environmental indicator (full body)","description":"**What it does**\nReturns one European Environment Agency environmental indicator in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /indicators/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEA environmental indicators (Plone REST API)..","operationId":"detail_ep_api_v2_eea_indicators__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/news":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — news items (newest first)","description":"**What it does**\nLists European Environment Agency's news items, newest first. News and announcements from the European Environment Agency.\n\n**When to use it**\nTrack what EEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEA newsroom (Plone REST API)..","operationId":"list_ep_api_v2_eea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/news/{item_id}":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — one news item (full body)","description":"**What it does**\nReturns one European Environment Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEA newsroom (Plone REST API)..","operationId":"detail_ep_api_v2_eea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/events":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — events (newest first)","description":"**What it does**\nLists European Environment Agency's events, newest first. Conferences, webinars and meetings hosted or co-hosted by the European Environment Agency.\n\n**When to use it**\nTrack what EEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEA newsroom events (Plone REST API)..","operationId":"list_ep_api_v2_eea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/events/{item_id}":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — one event (full body)","description":"**What it does**\nReturns one European Environment Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEA newsroom events (Plone REST API)..","operationId":"detail_ep_api_v2_eea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/topics":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — topic pages (newest first)","description":"**What it does**\nLists European Environment Agency's topic pages, newest first. Snapshots of the EEA's about pages and its in-depth thematic pages across air pollution, biodiversity, climate change mitigation and adaptation, the circular economy, energy, water, soil, land use, transport, nature protection, sustainable finance and more.\n\n**When to use it**\nTrack what EEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EEA about and in-depth thematic pages..","operationId":"list_ep_api_v2_eea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eea/topics/{item_id}":{"get":{"tags":["v2-eea","v2-eea"],"summary":"European Environment Agency — one topic page (full body)","description":"**What it does**\nReturns one European Environment Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EEA about and in-depth thematic pages..","operationId":"detail_ep_api_v2_eea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa":{"get":{"tags":["v2-echa","v2-echa"],"summary":"ECHA folder directory — what ECHA carries","description":"**What it does**\nReturns European Chemicals Agency (ECHA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/echa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_echa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Echa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/candidate-list":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — Candidate List substances (newest first)","description":"**What it does**\nLists European Chemicals Agency's Candidate List substances, newest first. The REACH Candidate List of substances of very high concern that may be placed on the Authorisation List. Each entry carries the substance name, EC and CAS numbers, the date of inclusion, the reason for inclusion (the SVHC property, e.g. carcinogenic, toxic for reproduction, endocrine disrupting) and the ECHA substance-information link. Filter with q (e.g. a substance name, a CAS number, or an SVHC property).\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /candidate-list?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECHA REACH Candidate List of substances of very high concern (SVHC)..","operationId":"list_ep_api_v2_echa_candidate_list_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/candidate-list/{item_id}":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — one Candidate List substance (full body)","description":"**What it does**\nReturns one European Chemicals Agency Candidate List substance in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /candidate-list/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECHA REACH Candidate List of substances of very high concern (SVHC)..","operationId":"detail_ep_api_v2_echa_candidate_list__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/news":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — news items (newest first)","description":"**What it does**\nLists European Chemicals Agency's news items, newest first. News alerts from the European Chemicals Agency on REACH, CLP, biocides and the agency's regulatory work.\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECHA news archive..","operationId":"list_ep_api_v2_echa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/news/{item_id}":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — one news item (full body)","description":"**What it does**\nReturns one European Chemicals Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECHA news archive..","operationId":"detail_ep_api_v2_echa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/topics":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — topic pages (newest first)","description":"**What it does**\nLists European Chemicals Agency's topic pages, newest first. Snapshots of ECHA reference pages: who we are and what we do, the committees and enforcement forum (Risk Assessment, Socio-Economic Analysis, Biocidal Products, Member State Committee), environment, health and chemicals at work, partners and networks, and the understanding-REACH, understanding-CLP and understanding-BPR guides.\n\n**When to use it**\nTrack what ECHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ECHA about, committee and regulation pages..","operationId":"list_ep_api_v2_echa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/echa/topics/{item_id}":{"get":{"tags":["v2-echa","v2-echa"],"summary":"European Chemicals Agency — one topic page (full body)","description":"**What it does**\nReturns one European Chemicals Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ECHA about, committee and regulation pages..","operationId":"detail_ep_api_v2_echa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda":{"get":{"tags":["v2-euda","v2-euda"],"summary":"EUDA folder directory — what EUDA carries","description":"**What it does**\nReturns European Union Drugs Agency (EUDA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euda\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euda_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euda Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/publications":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — publications (newest first)","description":"**What it does**\nLists European Union Drugs Agency's publications, newest first. The EUDA's reference publications on the drugs phenomenon — the European Drug Report, EU Drug Markets analyses, drug-profile and health-response guides, country and technical reports. Each entry carries the title, publication type and the publication page. Filter with q (e.g. a topic such as 'cocaine' or a report series such as 'European Drug Report').\n\n**When to use it**\nTrack what EUDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUDA publications library..","operationId":"list_ep_api_v2_euda_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/publications/{item_id}":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — one publication (full body)","description":"**What it does**\nReturns one European Union Drugs Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUDA publications library..","operationId":"detail_ep_api_v2_euda_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/news":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — news items (newest first)","description":"**What it does**\nLists European Union Drugs Agency's news items, newest first. News from the European Union Drugs Agency on the drugs situation, new substances, alerts and the agency's work.\n\n**When to use it**\nTrack what EUDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUDA news section..","operationId":"list_ep_api_v2_euda_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/news/{item_id}":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — one news item (full body)","description":"**What it does**\nReturns one European Union Drugs Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUDA news section..","operationId":"detail_ep_api_v2_euda_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/events":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — events (newest first)","description":"**What it does**\nLists European Union Drugs Agency's events, newest first. Conferences, webinars and meetings hosted or co-hosted by the European Union Drugs Agency.\n\n**When to use it**\nTrack what EUDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUDA events section..","operationId":"list_ep_api_v2_euda_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/events/{item_id}":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — one event (full body)","description":"**What it does**\nReturns one European Union Drugs Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUDA events section..","operationId":"detail_ep_api_v2_euda_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/topics":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — topic pages (newest first)","description":"**What it does**\nLists European Union Drugs Agency's topic pages, newest first. Snapshots of EUDA's manifesto, partners and data-catalogue pages and its Statistical Bulletin key indicators: drug-induced deaths, drug use prevalence, treatment demand, problem drug use, drug law offences, health and social responses, seizures, and price and purity.\n\n**When to use it**\nTrack what EUDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EUDA about and key-indicator data pages..","operationId":"list_ep_api_v2_euda_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euda/topics/{item_id}":{"get":{"tags":["v2-euda","v2-euda"],"summary":"European Union Drugs Agency — one topic page (full body)","description":"**What it does**\nReturns one European Union Drugs Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EUDA about and key-indicator data pages..","operationId":"detail_ep_api_v2_euda_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige":{"get":{"tags":["v2-eige","v2-eige"],"summary":"EIGE folder directory — what EIGE carries","description":"**What it does**\nReturns European Institute for Gender Equality (EIGE) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eige\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eige_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eige Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/news":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — news items (newest first)","description":"**What it does**\nLists European Institute for Gender Equality's news items, newest first. News from the European Institute for Gender Equality on gender equality, the Gender Equality Index, gender-based violence and gender mainstreaming.\n\n**When to use it**\nTrack what EIGE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIGE newsroom..","operationId":"list_ep_api_v2_eige_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/news/{item_id}":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — one news item (full body)","description":"**What it does**\nReturns one European Institute for Gender Equality news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIGE newsroom..","operationId":"detail_ep_api_v2_eige_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/events":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — events (newest first)","description":"**What it does**\nLists European Institute for Gender Equality's events, newest first. Conferences, webinars and meetings hosted or co-hosted by EIGE.\n\n**When to use it**\nTrack what EIGE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIGE newsroom events..","operationId":"list_ep_api_v2_eige_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/events/{item_id}":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — one event (full body)","description":"**What it does**\nReturns one European Institute for Gender Equality event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIGE newsroom events..","operationId":"detail_ep_api_v2_eige_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/publications":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — publications (newest first)","description":"**What it does**\nLists European Institute for Gender Equality's publications, newest first. EIGE reports, studies, toolkits and guides on gender equality. Filter with q (e.g. a topic such as 'gender-based violence' or 'gender mainstreaming').\n\n**When to use it**\nTrack what EIGE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EIGE publications library..","operationId":"list_ep_api_v2_eige_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/publications/{item_id}":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — one publication (full body)","description":"**What it does**\nReturns one European Institute for Gender Equality publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EIGE publications library..","operationId":"detail_ep_api_v2_eige_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/topics":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — topic pages (newest first)","description":"**What it does**\nLists European Institute for Gender Equality's topic pages, newest first. Snapshots of EIGE's about and organisation pages, its gender mainstreaming work (what it is, policy areas, countries, good practices, toolkits), its gender-based-violence work (focus areas, the regulatory framework, data collection, the Istanbul Convention), the Gender Equality Index, gender statistics and the thesaurus.\n\n**When to use it**\nTrack what EIGE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EIGE about, gender-mainstreaming and gender-based-violence pages..","operationId":"list_ep_api_v2_eige_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eige/topics/{item_id}":{"get":{"tags":["v2-eige","v2-eige"],"summary":"European Institute for Gender Equality — one topic page (full body)","description":"**What it does**\nReturns one European Institute for Gender Equality topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EIGE about, gender-mainstreaming and gender-based-violence pages..","operationId":"detail_ep_api_v2_eige_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"Cedefop folder directory — what Cedefop carries","description":"**What it does**\nReturns European Centre for the Development of Vocational Training (Cedefop) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cedefop\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cedefop_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cedefop Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/news":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — news items (newest first)","description":"**What it does**\nLists European Centre for the Development of Vocational Training's news items, newest first. News from Cedefop on vocational education and training, skills and the labour market.\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Cedefop news feed..","operationId":"list_ep_api_v2_cedefop_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/news/{item_id}":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — one news item (full body)","description":"**What it does**\nReturns one European Centre for the Development of Vocational Training news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Cedefop news feed..","operationId":"detail_ep_api_v2_cedefop_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/events":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — events (newest first)","description":"**What it does**\nLists European Centre for the Development of Vocational Training's events, newest first. Conferences, webinars and meetings hosted or co-hosted by Cedefop.\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Cedefop events listing..","operationId":"list_ep_api_v2_cedefop_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/events/{item_id}":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — one event (full body)","description":"**What it does**\nReturns one European Centre for the Development of Vocational Training event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Cedefop events listing..","operationId":"detail_ep_api_v2_cedefop_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/publications":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — publications (newest first)","description":"**What it does**\nLists European Centre for the Development of Vocational Training's publications, newest first. Cedefop reports, briefing notes, country reports and research on skills and vocational training. Filter with q (e.g. a topic such as 'apprenticeship' or 'skills forecast').\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Cedefop publications and reports..","operationId":"list_ep_api_v2_cedefop_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/publications/{item_id}":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — one publication (full body)","description":"**What it does**\nReturns one European Centre for the Development of Vocational Training publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Cedefop publications and reports..","operationId":"detail_ep_api_v2_cedefop_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/topics":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — topic pages (newest first)","description":"**What it does**\nLists European Centre for the Development of Vocational Training's topic pages, newest first. Snapshots of Cedefop's who-we-are and what-we-do pages, its themes (skills and labour market, VET knowledge centre, delivering VET and qualifications, statistics) and its flagship tools (European Skills Index, VET policy dashboard, skills forecast and intelligence, matching skills, skills and jobs survey, apprenticeship schemes, validation of non-formal learning, mobility scoreboard, VET glossary, key indicators on VET, online job vacancies).\n\n**When to use it**\nTrack what Cedefop is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Cedefop about, theme and tool pages..","operationId":"list_ep_api_v2_cedefop_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cedefop/topics/{item_id}":{"get":{"tags":["v2-cedefop","v2-cedefop"],"summary":"European Centre for the Development of Vocational Training — one topic page (full body)","description":"**What it does**\nReturns one European Centre for the Development of Vocational Training topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Cedefop about, theme and tool pages..","operationId":"detail_ep_api_v2_cedefop_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euaa":{"get":{"tags":["v2-euaa","v2-euaa"],"summary":"EUAA folder directory — what EUAA carries","description":"**What it does**\nReturns European Union Agency for Asylum (EUAA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euaa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euaa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euaa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euaa/news":{"get":{"tags":["v2-euaa","v2-euaa"],"summary":"European Union Agency for Asylum — news items (newest first)","description":"**What it does**\nLists European Union Agency for Asylum's news items, newest first. News and press releases from the EU Agency for Asylum on the asylum situation, country reports and operations.\n\n**When to use it**\nTrack what EUAA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUAA press releases and news..","operationId":"list_ep_api_v2_euaa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euaa/news/{item_id}":{"get":{"tags":["v2-euaa","v2-euaa"],"summary":"European Union Agency for Asylum — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Asylum news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUAA press releases and news..","operationId":"detail_ep_api_v2_euaa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euaa/topics":{"get":{"tags":["v2-euaa","v2-euaa"],"summary":"European Union Agency for Asylum — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Asylum's topic pages, newest first. Snapshots of EUAA's about pages, its asylum-knowledge work (the asylum report, country guidance, courts and tribunals, the Dublin procedure, MedCOI, monitoring of the CEAS, reception, vulnerability), country of origin information, operations (country operations, operational assistance, resettlement) and the fundamental-rights and complaints mechanisms.\n\n**When to use it**\nTrack what EUAA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EUAA about, asylum-knowledge and operations pages..","operationId":"list_ep_api_v2_euaa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euaa/topics/{item_id}":{"get":{"tags":["v2-euaa","v2-euaa"],"summary":"European Union Agency for Asylum — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Asylum topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EUAA about, asylum-knowledge and operations pages..","operationId":"detail_ep_api_v2_euaa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra":{"get":{"tags":["v2-fra","v2-fra"],"summary":"FRA folder directory — what FRA carries","description":"**What it does**\nReturns European Union Agency for Fundamental Rights (FRA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/fra\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_fra_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Fra Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/case-law":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — case-law entries (newest first)","description":"**What it does**\nLists European Union Agency for Fundamental Rights's case-law entries, newest first. Court decisions on EU fundamental rights from the FRA case-law database — CJEU, ECtHR and national court rulings, each with the court, case reference and decision type, linking to the FRA case-law page. Filter with q (e.g. a court such as 'CJEU' or a case number).\n\n**When to use it**\nTrack what FRA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /case-law?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the FRA case-law database..","operationId":"list_ep_api_v2_fra_case_law_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/case-law/{item_id}":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — one case-law entrie (full body)","description":"**What it does**\nReturns one European Union Agency for Fundamental Rights case-law entrie in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /case-law/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the FRA case-law database..","operationId":"detail_ep_api_v2_fra_case_law__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/charterpedia":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — Charter articles (newest first)","description":"**What it does**\nLists European Union Agency for Fundamental Rights's Charter articles, newest first. The EU Charter of Fundamental Rights article by article (Charterpedia): each article with its FRA page collecting the explanations, related EU and national case-law and constitutional provisions. Filter with q (e.g. 'data protection' or 'asylum').\n\n**When to use it**\nTrack what FRA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /charterpedia?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from FRA Charterpedia..","operationId":"list_ep_api_v2_fra_charterpedia_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/charterpedia/{item_id}":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — one Charter article (full body)","description":"**What it does**\nReturns one European Union Agency for Fundamental Rights Charter article in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /charterpedia/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from FRA Charterpedia..","operationId":"detail_ep_api_v2_fra_charterpedia__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/topics":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Fundamental Rights's topic pages, newest first. Snapshots of FRA's about pages and its fundamental-rights themes: access to asylum, AI and big data, borders and information systems, business and human rights, child protection, data protection, hate crime, the rule of law, Roma, racial and ethnic origin, people with disabilities, victims' rights, trafficking and labour exploitation, and more.\n\n**When to use it**\nTrack what FRA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of FRA about and fundamental-rights theme pages..","operationId":"list_ep_api_v2_fra_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/fra/topics/{item_id}":{"get":{"tags":["v2-fra","v2-fra"],"summary":"European Union Agency for Fundamental Rights — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Fundamental Rights topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of FRA about and fundamental-rights theme pages..","operationId":"detail_ep_api_v2_fra_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"EU-OSHA folder directory — what EU-OSHA carries","description":"**What it does**\nReturns European Agency for Safety and Health at Work (EU-OSHA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eu-osha\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eu_osha_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eu Osha Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/news":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — news items (newest first)","description":"**What it does**\nLists European Agency for Safety and Health at Work's news items, newest first. News highlights from the European Agency for Safety and Health at Work.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU-OSHA highlights listing plus the detail pages..","operationId":"list_ep_api_v2_eu_osha_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/news/{item_id}":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — one news item (full body)","description":"**What it does**\nReturns one European Agency for Safety and Health at Work news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU-OSHA highlights listing plus the detail pages..","operationId":"detail_ep_api_v2_eu_osha_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/publications":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — publications (newest first)","description":"**What it does**\nLists European Agency for Safety and Health at Work's publications, newest first. Reports, reviews and guidance on occupational safety and health.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU-OSHA publications listing..","operationId":"list_ep_api_v2_eu_osha_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/publications/{item_id}":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — one publication (full body)","description":"**What it does**\nReturns one European Agency for Safety and Health at Work publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU-OSHA publications listing..","operationId":"detail_ep_api_v2_eu_osha_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/events":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — events (newest first)","description":"**What it does**\nLists European Agency for Safety and Health at Work's events, newest first. Seminars, campaign events and exchange meetings, with their dates.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU-OSHA events listing..","operationId":"list_ep_api_v2_eu_osha_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/events/{item_id}":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — one event (full body)","description":"**What it does**\nReturns one European Agency for Safety and Health at Work event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU-OSHA events listing..","operationId":"detail_ep_api_v2_eu_osha_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/topics":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — topic pages (newest first)","description":"**What it does**\nLists European Agency for Safety and Health at Work's topic pages, newest first. Snapshots of EU-OSHA's governance and focal-point pages, its surveys (ESENER, OSH Pulse, the workers' exposure survey), the EU strategic framework and OSH legislation, and its themes: dangerous substances, musculoskeletal disorders, psychosocial risks and mental health, digitalisation, cancer and work, climate change, work-related diseases, young workers and more.\n\n**When to use it**\nTrack what EU-OSHA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EU-OSHA about, facts-and-figures, legislation and theme pages..","operationId":"list_ep_api_v2_eu_osha_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eu-osha/topics/{item_id}":{"get":{"tags":["v2-eu-osha","v2-eu-osha"],"summary":"European Agency for Safety and Health at Work — one topic page (full body)","description":"**What it does**\nReturns one European Agency for Safety and Health at Work topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EU-OSHA about, facts-and-figures, legislation and theme pages..","operationId":"detail_ep_api_v2_eu_osha_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"EEAS folder directory — what EEAS carries","description":"**What it does**\nReturns European External Action Service (EEAS) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eeas\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eeas_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eeas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/news":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — press material (newest first)","description":"**What it does**\nLists European External Action Service's press material, newest first. Press releases, statements by the Spokesperson, declarations on behalf of the EU, speeches and op-eds from the European External Action Service and the EU delegations. Filter with q (e.g. a country or theme such as 'Ukraine' or 'sanctions').\n\n**When to use it**\nTrack what EEAS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEAS press-material listing (press releases, statements, speeches and op-eds), rendered from eeas.europa.eu..","operationId":"list_ep_api_v2_eeas_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/news/{item_id}":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — one press material (full body)","description":"**What it does**\nReturns one European External Action Service press material in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEAS press-material listing (press releases, statements, speeches and op-eds), rendered from eeas.europa.eu..","operationId":"detail_ep_api_v2_eeas_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/publications":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — publications (newest first)","description":"**What it does**\nLists European External Action Service's publications, newest first. Reports, fact-sheets, infographics, strategy papers and annual reports published by the EEAS, including the activities reports on countering foreign information manipulation.\n\n**When to use it**\nTrack what EEAS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEAS publications listing (documents, research and reports)..","operationId":"list_ep_api_v2_eeas_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/publications/{item_id}":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — one publication (full body)","description":"**What it does**\nReturns one European External Action Service publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEAS publications listing (documents, research and reports)..","operationId":"detail_ep_api_v2_eeas_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/events":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — events (newest first)","description":"**What it does**\nLists European External Action Service's events, newest first. Summits, dialogues, ministerial meetings, conferences and other events hosted or attended by the EEAS and the EU delegations.\n\n**When to use it**\nTrack what EEAS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEAS events / agenda listing..","operationId":"list_ep_api_v2_eeas_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/events/{item_id}":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — one event (full body)","description":"**What it does**\nReturns one European External Action Service event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEAS events / agenda listing..","operationId":"detail_ep_api_v2_eeas_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/tenders":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — tenders (newest first)","description":"**What it does**\nLists European External Action Service's tenders, newest first. Ongoing EEAS calls for tenders and grants — procurement contracts for services, supplies or works at headquarters and in the EU delegations worldwide.\n\n**When to use it**\nTrack what EEAS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EEAS calls-for-tenders listing (ongoing procurement and grants)..","operationId":"list_ep_api_v2_eeas_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/tenders/{item_id}":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — one tender (full body)","description":"**What it does**\nReturns one European External Action Service tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EEAS calls-for-tenders listing (ongoing procurement and grants)..","operationId":"detail_ep_api_v2_eeas_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/topics":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — topic pages (newest first)","description":"**What it does**\nLists European External Action Service's topic pages, newest first. Snapshots of the EEAS reference pages — its structure and organisation, the High Representative / Vice-President, missions and operations, the regional desks (Africa, Asia, the neighbourhood, the Western Balkans and more) and the thematic priorities (security and defence, sanctions, Global Gateway, digital diplomacy, crisis response). Each item is the standing text of one page.\n\n**When to use it**\nTrack what EEAS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EEAS thematic and geographic reference pages..","operationId":"list_ep_api_v2_eeas_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eeas/topics/{item_id}":{"get":{"tags":["v2-eeas","v2-eeas"],"summary":"European External Action Service — one topic page (full body)","description":"**What it does**\nReturns one European External Action Service topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EEAS thematic and geographic reference pages..","operationId":"detail_ep_api_v2_eeas_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa":{"get":{"tags":["v2-easa","v2-easa"],"summary":"EASA folder directory — what EASA carries","description":"**What it does**\nReturns European Union Aviation Safety Agency (EASA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/easa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_easa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Easa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/news":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — news items (newest first)","description":"**What it does**\nLists European Union Aviation Safety Agency's news items, newest first. News and press releases from the EU Aviation Safety Agency, covering airworthiness, drones, air operations, certification and international cooperation.\n\n**When to use it**\nTrack what EASA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EASA newsroom (news and press releases)..","operationId":"list_ep_api_v2_easa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/news/{item_id}":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — one news item (full body)","description":"**What it does**\nReturns one European Union Aviation Safety Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EASA newsroom (news and press releases)..","operationId":"detail_ep_api_v2_easa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/publications":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — research reports (newest first)","description":"**What it does**\nLists European Union Aviation Safety Agency's research reports, newest first. Research reports and studies published by EASA on aviation safety, sustainability and emerging technologies.\n\n**When to use it**\nTrack what EASA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EASA document library (research reports)..","operationId":"list_ep_api_v2_easa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/publications/{item_id}":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — one research report (full body)","description":"**What it does**\nReturns one European Union Aviation Safety Agency research report in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EASA document library (research reports)..","operationId":"detail_ep_api_v2_easa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/events":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — events (newest first)","description":"**What it does**\nLists European Union Aviation Safety Agency's events, newest first. Committee and expert-group meetings, stakeholder advisory bodies, workshops and conferences hosted by EASA.\n\n**When to use it**\nTrack what EASA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EASA events listing..","operationId":"list_ep_api_v2_easa_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/events/{item_id}":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — one event (full body)","description":"**What it does**\nReturns one European Union Aviation Safety Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EASA events listing..","operationId":"detail_ep_api_v2_easa_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/topics":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — topic pages (newest first)","description":"**What it does**\nLists European Union Aviation Safety Agency's topic pages, newest first. Snapshots of the EASA reference pages: the regulatory domains (aerodromes, air operations, air traffic management, aircraft products, aircrew, civil drones, cybersecurity, environment, safety management and more) and the EASA Light topic hub.\n\n**When to use it**\nTrack what EASA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EASA regulatory-domain and topic-hub pages..","operationId":"list_ep_api_v2_easa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/easa/topics/{item_id}":{"get":{"tags":["v2-easa","v2-easa"],"summary":"European Union Aviation Safety Agency — one topic page (full body)","description":"**What it does**\nReturns one European Union Aviation Safety Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EASA regulatory-domain and topic-hub pages..","operationId":"detail_ep_api_v2_easa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"EMSA folder directory — what EMSA carries","description":"**What it does**\nReturns European Maritime Safety Agency (EMSA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/emsa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_emsa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Emsa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/news":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — news items (newest first)","description":"**What it does**\nLists European Maritime Safety Agency's news items, newest first. News from the European Maritime Safety Agency on ship safety, pollution response, maritime surveillance and the digitalisation of shipping.\n\n**When to use it**\nTrack what EMSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMSA newsroom (latest news)..","operationId":"list_ep_api_v2_emsa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/news/{item_id}":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — one news item (full body)","description":"**What it does**\nReturns one European Maritime Safety Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMSA newsroom (latest news)..","operationId":"detail_ep_api_v2_emsa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/publications":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — reports (newest first)","description":"**What it does**\nLists European Maritime Safety Agency's reports, newest first. Reports and studies published by EMSA, including seafarer statistics, pollution-response activity reports and technical studies on maritime safety and sustainability.\n\n**When to use it**\nTrack what EMSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EMSA publications listing (reports)..","operationId":"list_ep_api_v2_emsa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/publications/{item_id}":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — one report (full body)","description":"**What it does**\nReturns one European Maritime Safety Agency report in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EMSA publications listing (reports)..","operationId":"detail_ep_api_v2_emsa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/topics":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — topic pages (newest first)","description":"**What it does**\nLists European Maritime Safety Agency's topic pages, newest first. Snapshots of EMSA's reference pages: its work areas (ship safety, accident investigation, pollution response, maritime surveillance, earth observation and RPAS) and its operational systems (SafeSeaNet, LRIT, the European Maritime Single Window, Copernicus, CISE).\n\n**When to use it**\nTrack what EMSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EMSA thematic and operational-system pages..","operationId":"list_ep_api_v2_emsa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/emsa/topics/{item_id}":{"get":{"tags":["v2-emsa","v2-emsa"],"summary":"European Maritime Safety Agency — one topic page (full body)","description":"**What it does**\nReturns one European Maritime Safety Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EMSA thematic and operational-system pages..","operationId":"detail_ep_api_v2_emsa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era":{"get":{"tags":["v2-era","v2-era"],"summary":"ERA folder directory — what ERA carries","description":"**What it does**\nReturns European Union Agency for Railways (ERA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/era\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_era_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Era Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/news":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — news items (newest first)","description":"**What it does**\nLists European Union Agency for Railways's news items, newest first. News from the EU Agency for Railways on interoperability, safety certification, ERTMS, the single European railway area and vehicle authorisation.\n\n**When to use it**\nTrack what ERA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ERA news listing..","operationId":"list_ep_api_v2_era_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/news/{item_id}":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Railways news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ERA news listing..","operationId":"detail_ep_api_v2_era_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/publications":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — documents (newest first)","description":"**What it does**\nLists European Union Agency for Railways's documents, newest first. ERA recommendations, opinions and technical advices, work programmes and activity reports.\n\n**When to use it**\nTrack what ERA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ERA library (recommendations, opinions and technical advice, work programmes and activity reports)..","operationId":"list_ep_api_v2_era_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/publications/{item_id}":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — one document (full body)","description":"**What it does**\nReturns one European Union Agency for Railways document in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ERA library (recommendations, opinions and technical advice, work programmes and activity reports)..","operationId":"detail_ep_api_v2_era_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/events":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — events (newest first)","description":"**What it does**\nLists European Union Agency for Railways's events, newest first. Training courses, workshops and events organised by the EU Agency for Railways.\n\n**When to use it**\nTrack what ERA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ERA events and training listing..","operationId":"list_ep_api_v2_era_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/events/{item_id}":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — one event (full body)","description":"**What it does**\nReturns one European Union Agency for Railways event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ERA events and training listing..","operationId":"detail_ep_api_v2_era_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/topics":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Railways's topic pages, newest first. Snapshots of ERA's reference pages: the regulatory domains (technical specifications for interoperability, ERTMS, safety management, accidents and incidents, dangerous goods, rail environment, railway cybersecurity, train drivers, conformity assessment and national rules).\n\n**When to use it**\nTrack what ERA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ERA regulatory-domain pages..","operationId":"list_ep_api_v2_era_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/era/topics/{item_id}":{"get":{"tags":["v2-era","v2-era"],"summary":"European Union Agency for Railways — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Railways topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ERA regulatory-domain pages..","operationId":"detail_ep_api_v2_era_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"EUSPA folder directory — what EUSPA carries","description":"**What it does**\nReturns European Union Agency for the Space Programme (EUSPA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euspa\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euspa_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euspa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/news":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — news items (newest first)","description":"**What it does**\nLists European Union Agency for the Space Programme's news items, newest first. News and press releases from the EU Agency for the Space Programme, covering Galileo, EGNOS, Copernicus, secure connectivity and the EU space market.\n\n**When to use it**\nTrack what EUSPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUSPA newsroom (news and press releases)..","operationId":"list_ep_api_v2_euspa_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/news/{item_id}":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for the Space Programme news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUSPA newsroom (news and press releases)..","operationId":"detail_ep_api_v2_euspa_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/publications":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — resources (newest first)","description":"**What it does**\nLists European Union Agency for the Space Programme's resources, newest first. Reports, brochures, market reports and other resources published by EUSPA.\n\n**When to use it**\nTrack what EUSPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUSPA publications and multimedia resources..","operationId":"list_ep_api_v2_euspa_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/publications/{item_id}":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — one resource (full body)","description":"**What it does**\nReturns one European Union Agency for the Space Programme resource in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUSPA publications and multimedia resources..","operationId":"detail_ep_api_v2_euspa_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/events":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — events (newest first)","description":"**What it does**\nLists European Union Agency for the Space Programme's events, newest first. Conferences, forums, webinars and user-consultation events organised or attended by EUSPA.\n\n**When to use it**\nTrack what EUSPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUSPA events listing..","operationId":"list_ep_api_v2_euspa_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/events/{item_id}":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — one event (full body)","description":"**What it does**\nReturns one European Union Agency for the Space Programme event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUSPA events listing..","operationId":"detail_ep_api_v2_euspa_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/topics":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for the Space Programme's topic pages, newest first. Snapshots of EUSPA's reference pages: the EU space-programme components (Galileo, EGNOS, Copernicus, secure SatCom, space situational awareness) and the industry sectors it serves (agriculture, aviation and drones, maritime, rail, energy, emergency management, insurance and finance and more).\n\n**When to use it**\nTrack what EUSPA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EUSPA space-programme and industry-sector pages..","operationId":"list_ep_api_v2_euspa_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euspa/topics/{item_id}":{"get":{"tags":["v2-euspa","v2-euspa"],"summary":"European Union Agency for the Space Programme — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for the Space Programme topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EUSPA space-programme and industry-sector pages..","operationId":"detail_ep_api_v2_euspa_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ela":{"get":{"tags":["v2-ela","v2-ela"],"summary":"ELA folder directory — what ELA carries","description":"**What it does**\nReturns European Labour Authority (ELA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ela\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ela_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ela Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ela/news":{"get":{"tags":["v2-ela","v2-ela"],"summary":"European Labour Authority — news items (newest first)","description":"**What it does**\nLists European Labour Authority's news items, newest first. News from the European Labour Authority on labour mobility, posting of workers, social-security coordination, EURES and joint inspections.\n\n**When to use it**\nTrack what ELA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ELA news listing..","operationId":"list_ep_api_v2_ela_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ela/news/{item_id}":{"get":{"tags":["v2-ela","v2-ela"],"summary":"European Labour Authority — one news item (full body)","description":"**What it does**\nReturns one European Labour Authority news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ELA news listing..","operationId":"detail_ep_api_v2_ela_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ela/topics":{"get":{"tags":["v2-ela","v2-ela"],"summary":"European Labour Authority — topic pages (newest first)","description":"**What it does**\nLists European Labour Authority's topic pages, newest first. Snapshots of ELA's reference pages: its policy topics (posting of workers, social-security coordination, international road transport, undeclared work) and its activities (EURES, concerted and joint inspections, cooperation between member states, mediation, analysis and risk assessment).\n\n**When to use it**\nTrack what ELA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ELA policy-topic and activity pages..","operationId":"list_ep_api_v2_ela_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ela/topics/{item_id}":{"get":{"tags":["v2-ela","v2-ela"],"summary":"European Labour Authority — one topic page (full body)","description":"**What it does**\nReturns one European Labour Authority topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ELA policy-topic and activity pages..","operationId":"detail_ep_api_v2_ela_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efca":{"get":{"tags":["v2-efca","v2-efca"],"summary":"EFCA folder directory — what EFCA carries","description":"**What it does**\nReturns European Fisheries Control Agency (EFCA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/efca\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_efca_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Efca Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efca/news":{"get":{"tags":["v2-efca","v2-efca"],"summary":"European Fisheries Control Agency — news items (newest first)","description":"**What it does**\nLists European Fisheries Control Agency's news items, newest first. News from the European Fisheries Control Agency on joint deployment plans, real-time closures, inspections, coast-guard cooperation and fisheries-control operations.\n\n**When to use it**\nTrack what EFCA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EFCA latest-news listing..","operationId":"list_ep_api_v2_efca_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efca/news/{item_id}":{"get":{"tags":["v2-efca","v2-efca"],"summary":"European Fisheries Control Agency — one news item (full body)","description":"**What it does**\nReturns one European Fisheries Control Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EFCA latest-news listing..","operationId":"detail_ep_api_v2_efca_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efca/topics":{"get":{"tags":["v2-efca","v2-efca"],"summary":"European Fisheries Control Agency — topic pages (newest first)","description":"**What it does**\nLists European Fisheries Control Agency's topic pages, newest first. Snapshots of EFCA's reference pages: its activities (EU operations, fisheries data and systems, training, real-time closures, international operations) and the sea-basin joint deployment plans (Mediterranean, Baltic Sea, North Sea, Black Sea, western waters).\n\n**When to use it**\nTrack what EFCA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EFCA activity and sea-basin operation pages..","operationId":"list_ep_api_v2_efca_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/efca/topics/{item_id}":{"get":{"tags":["v2-efca","v2-efca"],"summary":"European Fisheries Control Agency — one topic page (full body)","description":"**What it does**\nReturns one European Fisheries Control Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EFCA activity and sea-basin operation pages..","operationId":"detail_ep_api_v2_efca_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurofound":{"get":{"tags":["v2-eurofound","v2-eurofound"],"summary":"Eurofound folder directory — what Eurofound carries","description":"**What it does**\nReturns European Foundation for the Improvement of Living and Working Conditions (Eurofound) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eurofound\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eurofound_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eurofound Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurofound/publications":{"get":{"tags":["v2-eurofound","v2-eurofound"],"summary":"European Foundation for the Improvement of Living and Working Conditions — surveys and data tools (newest first)","description":"**What it does**\nLists European Foundation for the Improvement of Living and Working Conditions's surveys and data tools, newest first. Eurofound's flagship surveys and data products: the European Company Survey, European Quality of Life Survey, European Working Conditions Survey, the European Restructuring Monitor, EU PolicyWatch, the minimum-wage database and the data catalogue.\n\n**When to use it**\nTrack what Eurofound is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Eurofound surveys-and-data pages..","operationId":"list_ep_api_v2_eurofound_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurofound/publications/{item_id}":{"get":{"tags":["v2-eurofound","v2-eurofound"],"summary":"European Foundation for the Improvement of Living and Working Conditions — one surveys and data tool (full body)","description":"**What it does**\nReturns one European Foundation for the Improvement of Living and Working Conditions surveys and data tool in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Eurofound surveys-and-data pages..","operationId":"detail_ep_api_v2_eurofound_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurofound/topics":{"get":{"tags":["v2-eurofound","v2-eurofound"],"summary":"European Foundation for the Improvement of Living and Working Conditions — topic pages (newest first)","description":"**What it does**\nLists European Foundation for the Improvement of Living and Working Conditions's topic pages, newest first. Snapshots of Eurofound's policy-topic pages: digitalisation, minimum wages, gender equality, housing, restructuring, job quality, working conditions, quality of life and industrial relations.\n\n**When to use it**\nTrack what Eurofound is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Eurofound policy-topic pages..","operationId":"list_ep_api_v2_eurofound_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurofound/topics/{item_id}":{"get":{"tags":["v2-eurofound","v2-eurofound"],"summary":"European Foundation for the Improvement of Living and Working Conditions — one topic page (full body)","description":"**What it does**\nReturns one European Foundation for the Improvement of Living and Working Conditions topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Eurofound policy-topic pages..","operationId":"detail_ep_api_v2_eurofound_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf":{"get":{"tags":["v2-etf","v2-etf"],"summary":"ETF folder directory — what ETF carries","description":"**What it does**\nReturns European Training Foundation (ETF) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/etf\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_etf_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Etf Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/news":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — news items (newest first)","description":"**What it does**\nLists European Training Foundation's news items, newest first. News from the European Training Foundation on vocational education and training, skills, lifelong learning and human-capital development in the EU's partner countries.\n\n**When to use it**\nTrack what ETF is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ETF news listing..","operationId":"list_ep_api_v2_etf_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/news/{item_id}":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — one news item (full body)","description":"**What it does**\nReturns one European Training Foundation news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ETF news listing..","operationId":"detail_ep_api_v2_etf_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/events":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — events (newest first)","description":"**What it does**\nLists European Training Foundation's events, newest first. Conferences, policy labs, symposia and other events organised by the European Training Foundation.\n\n**When to use it**\nTrack what ETF is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ETF events listing..","operationId":"list_ep_api_v2_etf_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/events/{item_id}":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — one event (full body)","description":"**What it does**\nReturns one European Training Foundation event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ETF events listing..","operationId":"detail_ep_api_v2_etf_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/topics":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — topic pages (newest first)","description":"**What it does**\nLists European Training Foundation's topic pages, newest first. Snapshots of ETF's thematic pages: career guidance, digital skills and learning, green skills, qualifications systems, quality assurance, skills analysis and vocational excellence.\n\n**When to use it**\nTrack what ETF is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ETF 'what we do' thematic pages..","operationId":"list_ep_api_v2_etf_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/etf/topics/{item_id}":{"get":{"tags":["v2-etf","v2-etf"],"summary":"European Training Foundation — one topic page (full body)","description":"**What it does**\nReturns one European Training Foundation topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ETF 'what we do' thematic pages..","operationId":"detail_ep_api_v2_etf_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurojust":{"get":{"tags":["v2-eurojust","v2-eurojust"],"summary":"Eurojust folder directory — what Eurojust carries","description":"**What it does**\nReturns European Union Agency for Criminal Justice Cooperation (Eurojust) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eurojust\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eurojust_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eurojust Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurojust/news":{"get":{"tags":["v2-eurojust","v2-eurojust"],"summary":"European Union Agency for Criminal Justice Cooperation — news items (newest first)","description":"**What it does**\nLists European Union Agency for Criminal Justice Cooperation's news items, newest first. News from Eurojust on joint investigation teams, coordinated actions against terrorism, cybercrime, drug trafficking, migrant smuggling and other serious cross-border crime.\n\n**When to use it**\nTrack what Eurojust is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Eurojust press releases and news listing..","operationId":"list_ep_api_v2_eurojust_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurojust/news/{item_id}":{"get":{"tags":["v2-eurojust","v2-eurojust"],"summary":"European Union Agency for Criminal Justice Cooperation — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Criminal Justice Cooperation news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Eurojust press releases and news listing..","operationId":"detail_ep_api_v2_eurojust_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurojust/topics":{"get":{"tags":["v2-eurojust","v2-eurojust"],"summary":"European Union Agency for Criminal Justice Cooperation — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Criminal Justice Cooperation's topic pages, newest first. Snapshots of Eurojust's crime-area pages (terrorism, cybercrime, drug trafficking, economic crime, migrant smuggling, trafficking in human beings, core international crimes, crimes against children, PIF crimes, CBRN-E) and judicial-cooperation instruments (European Arrest Warrant, European Investigation Order, joint investigation teams, asset recovery, extradition, electronic evidence).\n\n**When to use it**\nTrack what Eurojust is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Eurojust crime-type and judicial-cooperation instrument pages..","operationId":"list_ep_api_v2_eurojust_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurojust/topics/{item_id}":{"get":{"tags":["v2-eurojust","v2-eurojust"],"summary":"European Union Agency for Criminal Justice Cooperation — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Criminal Justice Cooperation topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Eurojust crime-type and judicial-cooperation instrument pages..","operationId":"detail_ep_api_v2_eurojust_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cepol":{"get":{"tags":["v2-cepol","v2-cepol"],"summary":"CEPOL folder directory — what CEPOL carries","description":"**What it does**\nReturns European Union Agency for Law Enforcement Training (CEPOL) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cepol\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cepol_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cepol Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cepol/news":{"get":{"tags":["v2-cepol","v2-cepol"],"summary":"European Union Agency for Law Enforcement Training — news items (newest first)","description":"**What it does**\nLists European Union Agency for Law Enforcement Training's news items, newest first. News from CEPOL on law-enforcement training courses, the exchange programme, joint operations support, research conferences and cooperation with EU agencies and partner countries.\n\n**When to use it**\nTrack what CEPOL is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CEPOL newsroom listing..","operationId":"list_ep_api_v2_cepol_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cepol/news/{item_id}":{"get":{"tags":["v2-cepol","v2-cepol"],"summary":"European Union Agency for Law Enforcement Training — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Law Enforcement Training news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CEPOL newsroom listing..","operationId":"detail_ep_api_v2_cepol_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cepol/topics":{"get":{"tags":["v2-cepol","v2-cepol"],"summary":"European Union Agency for Law Enforcement Training — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Law Enforcement Training's topic pages, newest first. Snapshots of CEPOL's thematic areas (counter-terrorism, cybercrime, serious and organised crime, fundamental rights and data protection, public order, leadership), its training and education portfolio (learning portfolio, LEEd, knowledge centres, EMPACT, quality standards) and its international-cooperation programmes (CT INFLOW, EuroMed, TOPCOP, WB PaCT, EU4SEC Moldova).\n\n**When to use it**\nTrack what CEPOL is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CEPOL thematic-area, training and international-cooperation pages..","operationId":"list_ep_api_v2_cepol_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cepol/topics/{item_id}":{"get":{"tags":["v2-cepol","v2-cepol"],"summary":"European Union Agency for Law Enforcement Training — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Law Enforcement Training topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CEPOL thematic-area, training and international-cooperation pages..","operationId":"detail_ep_api_v2_cepol_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europol":{"get":{"tags":["v2-europol","v2-europol"],"summary":"Europol folder directory — what Europol carries","description":"**What it does**\nReturns European Union Agency for Law Enforcement Cooperation (Europol) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/europol\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_europol_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Europol Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europol/news":{"get":{"tags":["v2-europol","v2-europol"],"summary":"European Union Agency for Law Enforcement Cooperation — news items (newest first)","description":"**What it does**\nLists European Union Agency for Law Enforcement Cooperation's news items, newest first. News from Europol on cross-border operations against drug trafficking, cybercrime, terrorism, money laundering and organised crime, plus partnership and threat-assessment announcements.\n\n**When to use it**\nTrack what Europol is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Europol newsroom listing..","operationId":"list_ep_api_v2_europol_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europol/news/{item_id}":{"get":{"tags":["v2-europol","v2-europol"],"summary":"European Union Agency for Law Enforcement Cooperation — one news item (full body)","description":"**What it does**\nReturns one European Union Agency for Law Enforcement Cooperation news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Europol newsroom listing..","operationId":"detail_ep_api_v2_europol_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europol/topics":{"get":{"tags":["v2-europol","v2-europol"],"summary":"European Union Agency for Law Enforcement Cooperation — topic pages (newest first)","description":"**What it does**\nLists European Union Agency for Law Enforcement Cooperation's topic pages, newest first. Snapshots of Europol's crime areas (child sexual exploitation, corruption, criminal finances and money laundering, currency counterfeiting, cyber attacks, illicit drugs), its specialist centres (ESOCC, EC3, ECTC, EFECC, the operational and analysis centre), how-we-work hubs (operations, SIRIUS, innovation lab, analysis projects, EMPACT) and its flagship reports (SOCTA, IOCTA).\n\n**When to use it**\nTrack what Europol is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Europol crime-area, specialist-centre and flagship-report pages..","operationId":"list_ep_api_v2_europol_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europol/topics/{item_id}":{"get":{"tags":["v2-europol","v2-europol"],"summary":"European Union Agency for Law Enforcement Cooperation — one topic page (full body)","description":"**What it does**\nReturns one European Union Agency for Law Enforcement Cooperation topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Europol crime-area, specialist-centre and flagship-report pages..","operationId":"detail_ep_api_v2_europol_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/frontex":{"get":{"tags":["v2-frontex","v2-frontex"],"summary":"Frontex folder directory — what Frontex carries","description":"**What it does**\nReturns European Border and Coast Guard Agency (Frontex) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/frontex\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_frontex_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Frontex Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/frontex/news":{"get":{"tags":["v2-frontex","v2-frontex"],"summary":"European Border and Coast Guard Agency — news items (newest first)","description":"**What it does**\nLists European Border and Coast Guard Agency's news items, newest first. News releases from Frontex on joint operations, border-crossing trends, the standing corps, returns, search and rescue and cooperation with Member States and third countries.\n\n**When to use it**\nTrack what Frontex is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Frontex news-release listing..","operationId":"list_ep_api_v2_frontex_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/frontex/news/{item_id}":{"get":{"tags":["v2-frontex","v2-frontex"],"summary":"European Border and Coast Guard Agency — one news item (full body)","description":"**What it does**\nReturns one European Border and Coast Guard Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Frontex news-release listing..","operationId":"detail_ep_api_v2_frontex_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/frontex/topics":{"get":{"tags":["v2-frontex","v2-frontex"],"summary":"European Border and Coast Guard Agency — topic pages (newest first)","description":"**What it does**\nLists European Border and Coast Guard Agency's topic pages, newest first. Snapshots of Frontex reference pages: tasks and mission, the management board, procurement and grants, the standing corps (about, training, profiles), accountability, data protection and public access to documents.\n\n**When to use it**\nTrack what Frontex is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Frontex about, careers and transparency pages..","operationId":"list_ep_api_v2_frontex_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/frontex/topics/{item_id}":{"get":{"tags":["v2-frontex","v2-frontex"],"summary":"European Border and Coast Guard Agency — one topic page (full body)","description":"**What it does**\nReturns one European Border and Coast Guard Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Frontex about, careers and transparency pages..","operationId":"detail_ep_api_v2_frontex_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"CINEA folder directory — what CINEA carries","description":"**What it does**\nReturns European Climate, Infrastructure and Environment Executive Agency (CINEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cinea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cinea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cinea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/news":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — news items (newest first)","description":"**What it does**\nLists European Climate, Infrastructure and Environment Executive Agency's news items, newest first. News from CINEA on the funding programmes it manages: the Connecting Europe Facility (energy and transport), Horizon Europe energy, the LIFE programme, the Innovation and Modernisation Funds and Green Assist.\n\n**When to use it**\nTrack what CINEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CINEA news listing..","operationId":"list_ep_api_v2_cinea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/news/{item_id}":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Climate, Infrastructure and Environment Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CINEA news listing..","operationId":"detail_ep_api_v2_cinea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/events":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — events (newest first)","description":"**What it does**\nLists European Climate, Infrastructure and Environment Executive Agency's events, newest first. Info days, webinars, calls briefings and conferences organised by CINEA, with their dates.\n\n**When to use it**\nTrack what CINEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CINEA events listing..","operationId":"list_ep_api_v2_cinea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/events/{item_id}":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Climate, Infrastructure and Environment Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CINEA events listing..","operationId":"detail_ep_api_v2_cinea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/topics":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Climate, Infrastructure and Environment Executive Agency's topic pages, newest first. Snapshots of CINEA's about, mission and key-documents pages, its programmes (CEF Energy, Horizon Europe energy supply, the Renewable Energy Financing Mechanism, LIFE clean-energy transition), its funding opportunities (calls for proposals and tenders, find your funding programme) and the Green Assist advisory service.\n\n**When to use it**\nTrack what CINEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CINEA about, programme and funding pages..","operationId":"list_ep_api_v2_cinea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cinea/topics/{item_id}":{"get":{"tags":["v2-cinea","v2-cinea"],"summary":"European Climate, Infrastructure and Environment Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Climate, Infrastructure and Environment Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CINEA about, programme and funding pages..","operationId":"detail_ep_api_v2_cinea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"EACEA folder directory — what EACEA carries","description":"**What it does**\nReturns European Education and Culture Executive Agency (EACEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eacea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eacea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eacea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/news":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — news items (newest first)","description":"**What it does**\nLists European Education and Culture Executive Agency's news items, newest first. News from EACEA on the programmes it manages: Erasmus+, Creative Europe, the European Solidarity Corps, CERV and Erasmus Mundus, plus calls, info sessions and vacancy notices.\n\n**When to use it**\nTrack what EACEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EACEA news listing..","operationId":"list_ep_api_v2_eacea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/news/{item_id}":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Education and Culture Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EACEA news listing..","operationId":"detail_ep_api_v2_eacea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/events":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — events (newest first)","description":"**What it does**\nLists European Education and Culture Executive Agency's events, newest first. Info sessions, webinars and events organised by EACEA, with their dates. EACEA is grants-led, so the events feed is sparse.\n\n**When to use it**\nTrack what EACEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EACEA events listing..","operationId":"list_ep_api_v2_eacea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/events/{item_id}":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Education and Culture Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EACEA events listing..","operationId":"detail_ep_api_v2_eacea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/publications":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — publications (newest first)","description":"**What it does**\nLists European Education and Culture Executive Agency's publications, newest first. EACEA's annual work programmes and activity reports, by year.\n\n**When to use it**\nTrack what EACEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EACEA document register (annual work programmes and activity reports); bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eacea_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/publications/{item_id}":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — one publication (full body)","description":"**What it does**\nReturns one European Education and Culture Executive Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EACEA document register (annual work programmes and activity reports); bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eacea_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/topics":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Education and Culture Executive Agency's topic pages, newest first. Snapshots of EACEA's about, platforms, transparency and document register pages, its grants pages (how to get a grant, the 2021-2027 programmes, managing your grant) and its scholarships pages (the Erasmus Mundus catalogue, Intra-Africa scholarships).\n\n**When to use it**\nTrack what EACEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EACEA about, grants and scholarships pages..","operationId":"list_ep_api_v2_eacea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eacea/topics/{item_id}":{"get":{"tags":["v2-eacea","v2-eacea"],"summary":"European Education and Culture Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Education and Culture Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EACEA about, grants and scholarships pages..","operationId":"detail_ep_api_v2_eacea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"HaDEA folder directory — what HaDEA carries","description":"**What it does**\nReturns European Health and Digital Executive Agency (HaDEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/hadea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_hadea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Hadea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/news":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — news items (newest first)","description":"**What it does**\nLists European Health and Digital Executive Agency's news items, newest first. News from HaDEA on the programmes it manages: EU4Health, the Single Market Programme (food), Horizon Europe health and digital, the Connecting Europe Facility (digital) and the Digital Europe Programme.\n\n**When to use it**\nTrack what HaDEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the HaDEA news listing..","operationId":"list_ep_api_v2_hadea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/news/{item_id}":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Health and Digital Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the HaDEA news listing..","operationId":"detail_ep_api_v2_hadea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/events":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — events (newest first)","description":"**What it does**\nLists European Health and Digital Executive Agency's events, newest first. Info days, webinars and events organised by HaDEA, with their dates.\n\n**When to use it**\nTrack what HaDEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the HaDEA events listing..","operationId":"list_ep_api_v2_hadea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/events/{item_id}":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Health and Digital Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the HaDEA events listing..","operationId":"detail_ep_api_v2_hadea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/calls":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — calls for proposals (newest first)","description":"**What it does**\nLists European Health and Digital Executive Agency's calls for proposals, newest first. Open EU funding calls for proposals managed by HaDEA across its programmes, with their deadlines where published.\n\n**When to use it**\nTrack what HaDEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the HaDEA calls-for-proposals listing..","operationId":"list_ep_api_v2_hadea_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/calls/{item_id}":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — one calls for proposal (full body)","description":"**What it does**\nReturns one European Health and Digital Executive Agency calls for proposal in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the HaDEA calls-for-proposals listing..","operationId":"detail_ep_api_v2_hadea_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/tenders":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — calls for tenders (newest first)","description":"**What it does**\nLists European Health and Digital Executive Agency's calls for tenders, newest first. HaDEA procurement calls for tenders and prior information notices, with their deadlines where published.\n\n**When to use it**\nTrack what HaDEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /tenders?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the HaDEA calls-for-tenders listing..","operationId":"list_ep_api_v2_hadea_tenders_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/tenders/{item_id}":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — one calls for tender (full body)","description":"**What it does**\nReturns one European Health and Digital Executive Agency calls for tender in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /tenders/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the HaDEA calls-for-tenders listing..","operationId":"detail_ep_api_v2_hadea_tenders__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/topics":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Health and Digital Executive Agency's topic pages, newest first. Snapshots of HaDEA's about, legal-base, programmes-and-funding and staff pages, and its programme pages (EU4Health, Single Market Programme food, Horizon Europe, the Connecting Europe Facility and the Digital Europe Programme).\n\n**When to use it**\nTrack what HaDEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of HaDEA about and programme pages..","operationId":"list_ep_api_v2_hadea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/hadea/topics/{item_id}":{"get":{"tags":["v2-hadea","v2-hadea"],"summary":"European Health and Digital Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Health and Digital Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of HaDEA about and programme pages..","operationId":"detail_ep_api_v2_hadea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"EISMEA folder directory — what EISMEA carries","description":"**What it does**\nReturns European Innovation Council and SMEs Executive Agency (EISMEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eismea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eismea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eismea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/news":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — news items (newest first)","description":"**What it does**\nLists European Innovation Council and SMEs Executive Agency's news items, newest first. News from EISMEA on the European Innovation Council, the European Innovation Ecosystems, the Single Market Programme and the I3 instrument, plus calls and project announcements.\n\n**When to use it**\nTrack what EISMEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EISMEA news listing..","operationId":"list_ep_api_v2_eismea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/news/{item_id}":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Innovation Council and SMEs Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EISMEA news listing..","operationId":"detail_ep_api_v2_eismea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/events":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — events (newest first)","description":"**What it does**\nLists European Innovation Council and SMEs Executive Agency's events, newest first. Forums, info days and events organised by EISMEA, with their dates.\n\n**When to use it**\nTrack what EISMEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EISMEA events listing..","operationId":"list_ep_api_v2_eismea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/events/{item_id}":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Innovation Council and SMEs Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EISMEA events listing..","operationId":"detail_ep_api_v2_eismea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/publications":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — publications (newest first)","description":"**What it does**\nLists European Innovation Council and SMEs Executive Agency's publications, newest first. EISMEA work programmes, annual activity reports, annual accounts and other corporate documents, by date.\n\n**When to use it**\nTrack what EISMEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EISMEA documents library; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_eismea_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/publications/{item_id}":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — one publication (full body)","description":"**What it does**\nReturns one European Innovation Council and SMEs Executive Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EISMEA documents library; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_eismea_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/calls":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — calls for proposals (newest first)","description":"**What it does**\nLists European Innovation Council and SMEs Executive Agency's calls for proposals, newest first. Open EU funding calls for proposals managed by EISMEA across the European Innovation Council, European Innovation Ecosystems, Single Market Programme and I3 instrument.\n\n**When to use it**\nTrack what EISMEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EISMEA calls-for-proposals listing..","operationId":"list_ep_api_v2_eismea_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/calls/{item_id}":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — one calls for proposal (full body)","description":"**What it does**\nReturns one European Innovation Council and SMEs Executive Agency calls for proposal in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EISMEA calls-for-proposals listing..","operationId":"detail_ep_api_v2_eismea_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/topics":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Innovation Council and SMEs Executive Agency's topic pages, newest first. Snapshots of EISMEA's about page, its programmes (European Innovation Council, European Innovation Ecosystems, Single Market Programme, the I3 instrument), its funding-opportunities page and the legacy EASME documents.\n\n**When to use it**\nTrack what EISMEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EISMEA about, programme and funding pages..","operationId":"list_ep_api_v2_eismea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eismea/topics/{item_id}":{"get":{"tags":["v2-eismea","v2-eismea"],"summary":"European Innovation Council and SMEs Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Innovation Council and SMEs Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EISMEA about, programme and funding pages..","operationId":"detail_ep_api_v2_eismea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"ERCEA folder directory — what ERCEA carries","description":"**What it does**\nReturns European Research Council Executive Agency (ERCEA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ercea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ercea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ercea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/news":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — news items (newest first)","description":"**What it does**\nLists European Research Council Executive Agency's news items, newest first. News from the ERC on its frontier-research grant competitions, Scientific Council decisions, results and grantee achievements.\n\n**When to use it**\nTrack what ERCEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the European Research Council news listing..","operationId":"list_ep_api_v2_ercea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/news/{item_id}":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Research Council Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the European Research Council news listing..","operationId":"detail_ep_api_v2_ercea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/events":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — events (newest first)","description":"**What it does**\nLists European Research Council Executive Agency's events, newest first. Conferences, info sessions and events organised by or featuring the ERC, with their dates.\n\n**When to use it**\nTrack what ERCEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the European Research Council events listing..","operationId":"list_ep_api_v2_ercea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/events/{item_id}":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Research Council Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the European Research Council events listing..","operationId":"detail_ep_api_v2_ercea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/publications":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — publications (newest first)","description":"**What it does**\nLists European Research Council Executive Agency's publications, newest first. ERC annual reports, statistics, frontier-research booklets and other publications, by date.\n\n**When to use it**\nTrack what ERCEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ERC publications library; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_ercea_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/publications/{item_id}":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — one publication (full body)","description":"**What it does**\nReturns one European Research Council Executive Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ERC publications library; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_ercea_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/topics":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Research Council Executive Agency's topic pages, newest first. Snapshots of the ERC's about pages (ERC at a glance, the President and Scientific Council, thematic working groups, standing committees, the executive agency, the legal basis) and its grant schemes (Starting, Consolidator, Advanced, Proof of Concept, Synergy), plus managing your project and projects and statistics.\n\n**When to use it**\nTrack what ERCEA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of about-ERC and apply-grant pages..","operationId":"list_ep_api_v2_ercea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ercea/topics/{item_id}":{"get":{"tags":["v2-ercea","v2-ercea"],"summary":"European Research Council Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Research Council Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of about-ERC and apply-grant pages..","operationId":"detail_ep_api_v2_ercea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea":{"get":{"tags":["v2-rea","v2-rea"],"summary":"REA folder directory — what REA carries","description":"**What it does**\nReturns European Research Executive Agency (REA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/rea\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_rea_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Rea Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/news":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — news items (newest first)","description":"**What it does**\nLists European Research Executive Agency's news items, newest first. News from REA on the Horizon Europe grants it manages: cluster 2 (culture, creativity and inclusive society), cluster 3 (civil security for society), the EU Soil Mission and the agricultural products promotion programme.\n\n**When to use it**\nTrack what REA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the REA news listing..","operationId":"list_ep_api_v2_rea_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/news/{item_id}":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — one news item (full body)","description":"**What it does**\nReturns one European Research Executive Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the REA news listing..","operationId":"detail_ep_api_v2_rea_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/events":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — events (newest first)","description":"**What it does**\nLists European Research Executive Agency's events, newest first. Info days, forums and events organised by REA, with their dates.\n\n**When to use it**\nTrack what REA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the REA events listing..","operationId":"list_ep_api_v2_rea_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/events/{item_id}":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — one event (full body)","description":"**What it does**\nReturns one European Research Executive Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the REA events listing..","operationId":"detail_ep_api_v2_rea_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/publications":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — publications (newest first)","description":"**What it does**\nLists European Research Executive Agency's publications, newest first. REA reports, handbooks, CORDIS results packs and other publications from the research programmes it manages.\n\n**When to use it**\nTrack what REA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the REA publications listing..","operationId":"list_ep_api_v2_rea_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/publications/{item_id}":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — one publication (full body)","description":"**What it does**\nReturns one European Research Executive Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the REA publications listing..","operationId":"detail_ep_api_v2_rea_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/topics":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — topic pages (newest first)","description":"**What it does**\nLists European Research Executive Agency's topic pages, newest first. Snapshots of REA's about page, its funding-and-grants tree (the EU Soil Mission, Horizon Europe cluster 2 with democracy and governance, cultural heritage and social transformations, cluster 3 with disaster resilience, crime and terrorism, external borders and resilient infrastructures, plus agricultural products promotion) and its applicant guidance pages.\n\n**When to use it**\nTrack what REA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of REA about, funding-and-grants and guidance pages..","operationId":"list_ep_api_v2_rea_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/rea/topics/{item_id}":{"get":{"tags":["v2-rea","v2-rea"],"summary":"European Research Executive Agency — one topic page (full body)","description":"**What it does**\nReturns one European Research Executive Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of REA about, funding-and-grants and guidance pages..","operationId":"detail_ep_api_v2_rea_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/epso":{"get":{"tags":["v2-epso","v2-epso"],"summary":"EPSO folder directory — what EPSO carries","description":"**What it does**\nReturns European Personnel Selection Office (EPSO) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/epso\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_epso_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Epso Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/epso/news":{"get":{"tags":["v2-epso","v2-epso"],"summary":"European Personnel Selection Office — news items (newest first)","description":"**What it does**\nLists European Personnel Selection Office's news items, newest first. News from EPSO on open competitions and selection procedures: publication of results, test sessions, new competitions and candidate information, each with its EPSO reference number where published.\n\n**When to use it**\nTrack what EPSO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EPSO / EU Careers news listing..","operationId":"list_ep_api_v2_epso_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/epso/news/{item_id}":{"get":{"tags":["v2-epso","v2-epso"],"summary":"European Personnel Selection Office — one news item (full body)","description":"**What it does**\nReturns one European Personnel Selection Office news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EPSO / EU Careers news listing..","operationId":"detail_ep_api_v2_epso_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/epso/topics":{"get":{"tags":["v2-epso","v2-epso"],"summary":"European Personnel Selection Office — topic pages (newest first)","description":"**What it does**\nLists European Personnel Selection Office's topic pages, newest first. Snapshots of EPSO's about, mission, vision and values pages, the why-an-EU-career and salary/benefits pages, the selection process (permanent competitions, contract-staff procedures, EPSO tests, how to apply), equal opportunities, traineeships and the CAST permanent job profiles (law, finance, ICT, translation, human resources and more).\n\n**When to use it**\nTrack what EPSO is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EPSO about, EU-careers, selection-process and job-profile pages..","operationId":"list_ep_api_v2_epso_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/epso/topics/{item_id}":{"get":{"tags":["v2-epso","v2-epso"],"summary":"European Personnel Selection Office — one topic page (full body)","description":"**What it does**\nReturns one European Personnel Selection Office topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EPSO about, EU-careers, selection-process and job-profile pages..","operationId":"detail_ep_api_v2_epso_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eas":{"get":{"tags":["v2-eas","v2-eas"],"summary":"EUSA folder directory — what EUSA carries","description":"**What it does**\nReturns European School of Administration (EUSA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eas\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eas_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eas/publications":{"get":{"tags":["v2-eas","v2-eas"],"summary":"European School of Administration — publications (newest first)","description":"**What it does**\nLists European School of Administration's publications, newest first. The European School of Administration's annual activity reports and management plans, by year.\n\n**When to use it**\nTrack what EUSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission strategy-documents pages filtered by the EAS corporate body (annual activity reports and management plans)..","operationId":"list_ep_api_v2_eas_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eas/publications/{item_id}":{"get":{"tags":["v2-eas","v2-eas"],"summary":"European School of Administration — one publication (full body)","description":"**What it does**\nReturns one European School of Administration publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission strategy-documents pages filtered by the EAS corporate body (annual activity reports and management plans)..","operationId":"detail_ep_api_v2_eas_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eas/topics":{"get":{"tags":["v2-eas","v2-eas"],"summary":"European School of Administration — topic pages (newest first)","description":"**What it does**\nLists European School of Administration's topic pages, newest first. Snapshots of the European School of Administration's Commission department page (mission, role and contact) and its leadership pages.\n\n**When to use it**\nTrack what EUSA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Commission department page and the EUSA leadership pages..","operationId":"list_ep_api_v2_eas_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eas/topics/{item_id}":{"get":{"tags":["v2-eas","v2-eas"],"summary":"European School of Administration — one topic page (full body)","description":"**What it does**\nReturns one European School of Administration topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Commission department page and the EUSA leadership pages..","operationId":"detail_ep_api_v2_eas_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cdt":{"get":{"tags":["v2-cdt","v2-cdt"],"summary":"CdT folder directory — what CdT carries","description":"**What it does**\nReturns Translation Centre for the Bodies of the European Union (CdT) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cdt\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cdt_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cdt Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cdt/news":{"get":{"tags":["v2-cdt","v2-cdt"],"summary":"Translation Centre for the Bodies of the European Union — news items (newest first)","description":"**What it does**\nLists Translation Centre for the Bodies of the European Union's news items, newest first. News from the Translation Centre on its services, client network, IATE terminology releases, management board meetings and multilingualism initiatives.\n\n**When to use it**\nTrack what CdT is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CdT news listing..","operationId":"list_ep_api_v2_cdt_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cdt/news/{item_id}":{"get":{"tags":["v2-cdt","v2-cdt"],"summary":"Translation Centre for the Bodies of the European Union — one news item (full body)","description":"**What it does**\nReturns one Translation Centre for the Bodies of the European Union news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CdT news listing..","operationId":"detail_ep_api_v2_cdt_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cdt/topics":{"get":{"tags":["v2-cdt","v2-cdt"],"summary":"Translation Centre for the Bodies of the European Union — topic pages (newest first)","description":"**What it does**\nLists Translation Centre for the Bodies of the European Union's topic pages, newest first. Snapshots of CdT's services (translation, terminology, audiovisual and other language services), IATE, its story and client cooperation, interinstitutional cooperation, the EU Agencies Network, external language service providers, documentation and procurement.\n\n**When to use it**\nTrack what CdT is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CdT services, about and cooperation pages..","operationId":"list_ep_api_v2_cdt_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cdt/topics/{item_id}":{"get":{"tags":["v2-cdt","v2-cdt"],"summary":"Translation Centre for the Bodies of the European Union — one topic page (full body)","description":"**What it does**\nReturns one Translation Centre for the Bodies of the European Union topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CdT services, about and cooperation pages..","operationId":"detail_ep_api_v2_cdt_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"CERT-EU folder directory — what CERT-EU carries","description":"**What it does**\nReturns Cybersecurity Service for the Union institutions, bodies, offices and agencies (CERT-EU) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cert-eu\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cert_eu_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cert Eu Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/news":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — news items (newest first)","description":"**What it does**\nLists Cybersecurity Service for the Union institutions, bodies, offices and agencies's news items, newest first. Blog posts from CERT-EU on cyber threats, incidents, defensive practices and analysis affecting the EU institutions.\n\n**When to use it**\nTrack what CERT-EU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CERT-EU blog..","operationId":"list_ep_api_v2_cert_eu_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/news/{item_id}":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — one news item (full body)","description":"**What it does**\nReturns one Cybersecurity Service for the Union institutions, bodies, offices and agencies news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CERT-EU blog..","operationId":"detail_ep_api_v2_cert_eu_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/advisories":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — security advisories (newest first)","description":"**What it does**\nLists Cybersecurity Service for the Union institutions, bodies, offices and agencies's security advisories, newest first. CERT-EU security advisories on vulnerabilities, each with its advisory id (e.g. 2026-008), the affected product and the severity, with the publication date. Filter with q (e.g. a vendor or product name).\n\n**When to use it**\nTrack what CERT-EU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /advisories?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CERT-EU security advisories archive (current and previous year)..","operationId":"list_ep_api_v2_cert_eu_advisories_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/advisories/{item_id}":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — one security advisorie (full body)","description":"**What it does**\nReturns one Cybersecurity Service for the Union institutions, bodies, offices and agencies security advisorie in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /advisories/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CERT-EU security advisories archive (current and previous year)..","operationId":"detail_ep_api_v2_cert_eu_advisories__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/publications":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — publications (newest first)","description":"**What it does**\nLists Cybersecurity Service for the Union institutions, bodies, offices and agencies's publications, newest first. CERT-EU Cyber Briefs, Threat Landscape Reports, threat-intelligence frameworks and security guidance, with their publication dates.\n\n**When to use it**\nTrack what CERT-EU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CERT-EU threat-intelligence and security-guidance libraries..","operationId":"list_ep_api_v2_cert_eu_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/publications/{item_id}":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — one publication (full body)","description":"**What it does**\nReturns one Cybersecurity Service for the Union institutions, bodies, offices and agencies publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CERT-EU threat-intelligence and security-guidance libraries..","operationId":"detail_ep_api_v2_cert_eu_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/topics":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — topic pages (newest first)","description":"**What it does**\nLists Cybersecurity Service for the Union institutions, bodies, offices and agencies's topic pages, newest first. Snapshots of CERT-EU's about page, the Interinstitutional Cybersecurity Board (IICB) and its annual reports, and the security advisories, security guidance and threat-intelligence hubs.\n\n**When to use it**\nTrack what CERT-EU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CERT-EU about, IICB and publication-hub pages..","operationId":"list_ep_api_v2_cert_eu_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cert-eu/topics/{item_id}":{"get":{"tags":["v2-cert-eu","v2-cert-eu"],"summary":"Cybersecurity Service for the Union institutions, bodies, offices and agencies — one topic page (full body)","description":"**What it does**\nReturns one Cybersecurity Service for the Union institutions, bodies, offices and agencies topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CERT-EU about, IICB and publication-hub pages..","operationId":"detail_ep_api_v2_cert_eu_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"CJEU folder directory — what CJEU carries","description":"**What it does**\nReturns Court of Justice of the European Union (CJEU) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cjeu\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cjeu_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cjeu Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/press-releases":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — press releases (newest first)","description":"**What it does**\nLists Court of Justice of the European Union's press releases, newest first. Court of Justice and General Court press releases, each on a judgment, Advocate General opinion or order, with its PR number, the case reference (e.g. Case C-277/25) and the date. Filter with q (e.g. a case number or a party name).\n\n**When to use it**\nTrack what CJEU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /press-releases?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CJEU press-releases archive (current year); bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_cjeu_press_releases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/press-releases/{item_id}":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — one press release (full body)","description":"**What it does**\nReturns one Court of Justice of the European Union press release in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /press-releases/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CJEU press-releases archive (current year); bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_cjeu_press_releases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/case-law":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — case-law documents (newest first)","description":"**What it does**\nLists Court of Justice of the European Union's case-law documents, newest first. Current-year CJEU case-law: every judgment, Advocate General opinion and order of the Court of Justice and the General Court, with its CELEX number, ECLI, date and title, linking to the EUR-Lex page. Filter with q (e.g. an ECLI, a CELEX number or a case title).\n\n**When to use it**\nTrack what CJEU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /case-law?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU case-law corpus (sector-6 CELEX) via the Publications Office Cellar SPARQL endpoint that backs InfoCuria and EUR-Lex..","operationId":"list_ep_api_v2_cjeu_case_law_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/case-law/{item_id}":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — one case-law document (full body)","description":"**What it does**\nReturns one Court of Justice of the European Union case-law document in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /case-law/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU case-law corpus (sector-6 CELEX) via the Publications Office Cellar SPARQL endpoint that backs InfoCuria and EUR-Lex..","operationId":"detail_ep_api_v2_cjeu_case_law__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/events":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — events (newest first)","description":"**What it does**\nLists Court of Justice of the European Union's events, newest first. Conferences, anniversaries and other events at the Court.\n\n**When to use it**\nTrack what CJEU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CJEU events listing..","operationId":"list_ep_api_v2_cjeu_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/events/{item_id}":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — one event (full body)","description":"**What it does**\nReturns one Court of Justice of the European Union event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CJEU events listing..","operationId":"detail_ep_api_v2_cjeu_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/topics":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — topic pages (newest first)","description":"**What it does**\nLists Court of Justice of the European Union's topic pages, newest first. Snapshots of the CJEU's about pages (the institution, history, the Court of Justice and the General Court, the Court in numbers, how the procedure works, e-Curia) and its documents-and-research pages (the case-law database, fact-sheets, the case-law digest, the EU judicial network, research notes, the annual report).\n\n**When to use it**\nTrack what CJEU is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CJEU about and documents-and-research pages..","operationId":"list_ep_api_v2_cjeu_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cjeu/topics/{item_id}":{"get":{"tags":["v2-cjeu","v2-cjeu"],"summary":"Court of Justice of the European Union — one topic page (full body)","description":"**What it does**\nReturns one Court of Justice of the European Union topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CJEU about and documents-and-research pages..","operationId":"detail_ep_api_v2_cjeu_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca":{"get":{"tags":["v2-eca","v2-eca"],"summary":"ECA folder directory — what ECA carries","description":"**What it does**\nReturns European Court of Auditors (ECA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eca\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eca_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eca Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/news":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — news items (newest first)","description":"**What it does**\nLists European Court of Auditors's news items, newest first. News from the European Court of Auditors on its audits, reports and institutional activity.\n\n**When to use it**\nTrack what ECA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECA all-news listing..","operationId":"list_ep_api_v2_eca_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/news/{item_id}":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — one news item (full body)","description":"**What it does**\nReturns one European Court of Auditors news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECA all-news listing..","operationId":"detail_ep_api_v2_eca_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/publications":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — publications (newest first)","description":"**What it does**\nLists European Court of Auditors's publications, newest first. The ECA's audit output: special reports, reviews, opinions and the annual reports on the EU budget, each with its number, title and publication date. Filter with q (e.g. a policy area or a report number).\n\n**When to use it**\nTrack what ECA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECA publications search..","operationId":"list_ep_api_v2_eca_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/publications/{item_id}":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — one publication (full body)","description":"**What it does**\nReturns one European Court of Auditors publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECA publications search..","operationId":"detail_ep_api_v2_eca_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/events":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — events (newest first)","description":"**What it does**\nLists European Court of Auditors's events, newest first. Conferences, panel discussions and other events hosted by the ECA.\n\n**When to use it**\nTrack what ECA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECA events listing..","operationId":"list_ep_api_v2_eca_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/events/{item_id}":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — one event (full body)","description":"**What it does**\nReturns one European Court of Auditors event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECA events listing..","operationId":"detail_ep_api_v2_eca_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/topics":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — topic pages (newest first)","description":"**What it does**\nLists European Court of Auditors's topic pages, newest first. Snapshots of the ECA's about pages (mission, governance, organisation, legal framework, history, what we do, the EU finances, international and institutional relations) and its documents-and-research pages (topics, multiple reports, annual activity reports, the journal).\n\n**When to use it**\nTrack what ECA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ECA about and documents-and-research pages..","operationId":"list_ep_api_v2_eca_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eca/topics/{item_id}":{"get":{"tags":["v2-eca","v2-eca"],"summary":"European Court of Auditors — one topic page (full body)","description":"**What it does**\nReturns one European Court of Auditors topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ECA about and documents-and-research pages..","operationId":"detail_ep_api_v2_eca_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"EESC folder directory — what EESC carries","description":"**What it does**\nReturns European Economic and Social Committee (EESC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eesc\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eesc_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eesc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/news":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — news items (newest first)","description":"**What it does**\nLists European Economic and Social Committee's news items, newest first. News from the European Economic and Social Committee on its opinions, plenary sessions and civil-society initiatives.\n\n**When to use it**\nTrack what EESC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EESC news listing..","operationId":"list_ep_api_v2_eesc_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/news/{item_id}":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — one news item (full body)","description":"**What it does**\nReturns one European Economic and Social Committee news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EESC news listing..","operationId":"detail_ep_api_v2_eesc_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/press-releases":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — press releases (newest first)","description":"**What it does**\nLists European Economic and Social Committee's press releases, newest first. Press releases from the EESC on adopted opinions, resolutions and positions.\n\n**When to use it**\nTrack what EESC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /press-releases?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EESC press-releases listing..","operationId":"list_ep_api_v2_eesc_press_releases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/press-releases/{item_id}":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — one press release (full body)","description":"**What it does**\nReturns one European Economic and Social Committee press release in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /press-releases/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EESC press-releases listing..","operationId":"detail_ep_api_v2_eesc_press_releases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/opinions":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — opinions (newest first)","description":"**What it does**\nLists European Economic and Social Committee's opinions, newest first. The EESC's adopted opinions and information reports on EU legislative proposals and own-initiative topics. Filter with q (e.g. a policy area or a file name).\n\n**When to use it**\nTrack what EESC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /opinions?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EESC opinions listing..","operationId":"list_ep_api_v2_eesc_opinions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/opinions/{item_id}":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — one opinion (full body)","description":"**What it does**\nReturns one European Economic and Social Committee opinion in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /opinions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EESC opinions listing..","operationId":"detail_ep_api_v2_eesc_opinions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/events":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — events (newest first)","description":"**What it does**\nLists European Economic and Social Committee's events, newest first. Conferences, hearings, webinars and other events organised by the EESC.\n\n**When to use it**\nTrack what EESC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EESC events listing..","operationId":"list_ep_api_v2_eesc_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/events/{item_id}":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — one event (full body)","description":"**What it does**\nReturns one European Economic and Social Committee event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EESC events listing..","operationId":"detail_ep_api_v2_eesc_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/topics":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — topic pages (newest first)","description":"**What it does**\nLists European Economic and Social Committee's topic pages, newest first. Snapshots of the EESC's about and members-groups pages (employers, workers, civil-society groups), its sections (ECO, INT, TEN, SOC, NAT, REX, CCMI) and observatories, and its 25 policy areas.\n\n**When to use it**\nTrack what EESC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EESC about, members, sections and policy-area pages..","operationId":"list_ep_api_v2_eesc_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eesc/topics/{item_id}":{"get":{"tags":["v2-eesc","v2-eesc"],"summary":"European Economic and Social Committee — one topic page (full body)","description":"**What it does**\nReturns one European Economic and Social Committee topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EESC about, members, sections and policy-area pages..","operationId":"detail_ep_api_v2_eesc_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor":{"get":{"tags":["v2-cor","v2-cor"],"summary":"CoR folder directory — what CoR carries","description":"**What it does**\nReturns European Committee of the Regions (CoR) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cor\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cor_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cor Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/news":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — news items (newest first)","description":"**What it does**\nLists European Committee of the Regions's news items, newest first. News and press releases from the European Committee of the Regions on its opinions, plenary sessions and regional and local initiatives.\n\n**When to use it**\nTrack what CoR is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CoR all-news-and-press-releases listing..","operationId":"list_ep_api_v2_cor_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/news/{item_id}":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — one news item (full body)","description":"**What it does**\nReturns one European Committee of the Regions news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CoR all-news-and-press-releases listing..","operationId":"detail_ep_api_v2_cor_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/opinions":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — opinions (newest first)","description":"**What it does**\nLists European Committee of the Regions's opinions, newest first. The CoR's adopted opinions on EU legislation with a territorial impact. Filter with q (e.g. a policy area or a file name).\n\n**When to use it**\nTrack what CoR is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /opinions?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CoR opinions listing..","operationId":"list_ep_api_v2_cor_opinions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/opinions/{item_id}":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — one opinion (full body)","description":"**What it does**\nReturns one European Committee of the Regions opinion in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /opinions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CoR opinions listing..","operationId":"detail_ep_api_v2_cor_opinions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/topics":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — topic pages (newest first)","description":"**What it does**\nLists European Committee of the Regions's topic pages, newest first. Snapshots of the CoR's about and members pages, its six commissions (CIVEX, COTER, ECON, ENVE, NAT, SEDEC), its 2025-2030 priorities (cohesion, resilience, proximity) and its studies, networks and working groups.\n\n**When to use it**\nTrack what CoR is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CoR about, members, commission and priority pages..","operationId":"list_ep_api_v2_cor_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cor/topics/{item_id}":{"get":{"tags":["v2-cor","v2-cor"],"summary":"European Committee of the Regions — one topic page (full body)","description":"**What it does**\nReturns one European Committee of the Regions topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CoR about, members, commission and priority pages..","operationId":"detail_ep_api_v2_cor_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ombudsman":{"get":{"tags":["v2-ombudsman","v2-ombudsman"],"summary":"Ombudsman folder directory — what Ombudsman carries","description":"**What it does**\nReturns European Ombudsman (Ombudsman) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ombudsman\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ombudsman_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ombudsman Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ombudsman/news":{"get":{"tags":["v2-ombudsman","v2-ombudsman"],"summary":"European Ombudsman — news items (newest first)","description":"**What it does**\nLists European Ombudsman's news items, newest first. News, press releases and decisions from the European Ombudsman on inquiries into maladministration, transparency, access to documents and ethics in the EU institutions.\n\n**When to use it**\nTrack what Ombudsman is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the European Ombudsman news-and-documents listing..","operationId":"list_ep_api_v2_ombudsman_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ombudsman/news/{item_id}":{"get":{"tags":["v2-ombudsman","v2-ombudsman"],"summary":"European Ombudsman — one news item (full body)","description":"**What it does**\nReturns one European Ombudsman news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the European Ombudsman news-and-documents listing..","operationId":"detail_ep_api_v2_ombudsman_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ombudsman/topics":{"get":{"tags":["v2-ombudsman","v2-ombudsman"],"summary":"European Ombudsman — topic pages (newest first)","description":"**What it does**\nLists European Ombudsman's topic pages, newest first. Snapshots of the Ombudsman's pages on the office holder, strategy, history, how it works, its areas of work and impact, the legal basis, the European Network of Ombudsmen, how to make a complaint, the strategic inquiries and top inquiries, and publications.\n\n**When to use it**\nTrack what Ombudsman is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of European Ombudsman about and work pages..","operationId":"list_ep_api_v2_ombudsman_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ombudsman/topics/{item_id}":{"get":{"tags":["v2-ombudsman","v2-ombudsman"],"summary":"European Ombudsman — one topic page (full body)","description":"**What it does**\nReturns one European Ombudsman topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of European Ombudsman about and work pages..","operationId":"detail_ep_api_v2_ombudsman_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps":{"get":{"tags":["v2-edps","v2-edps"],"summary":"EDPS folder directory — what EDPS carries","description":"**What it does**\nReturns European Data Protection Supervisor (EDPS) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/edps\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_edps_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Edps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/news":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — news items (newest first)","description":"**What it does**\nLists European Data Protection Supervisor's news items, newest first. News from the European Data Protection Supervisor on supervision, opinions, technology monitoring and data-protection events.\n\n**When to use it**\nTrack what EDPS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPS news listing..","operationId":"list_ep_api_v2_edps_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/news/{item_id}":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — one news item (full body)","description":"**What it does**\nReturns one European Data Protection Supervisor news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPS news listing..","operationId":"detail_ep_api_v2_edps_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/press-releases":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — press releases (newest first)","description":"**What it does**\nLists European Data Protection Supervisor's press releases, newest first. Press releases from the EDPS on its opinions, decisions and positions.\n\n**When to use it**\nTrack what EDPS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /press-releases?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPS press-releases listing; bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_edps_press_releases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/press-releases/{item_id}":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — one press release (full body)","description":"**What it does**\nReturns one European Data Protection Supervisor press release in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /press-releases/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPS press-releases listing; bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_edps_press_releases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/publications":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — publications (newest first)","description":"**What it does**\nLists European Data Protection Supervisor's publications, newest first. EDPS annual activity reports, factsheets and other publications.\n\n**When to use it**\nTrack what EDPS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPS publications (annual activity reports and factsheets); bodies are extracted from the source PDFs..","operationId":"list_ep_api_v2_edps_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/publications/{item_id}":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — one publication (full body)","description":"**What it does**\nReturns one European Data Protection Supervisor publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPS publications (annual activity reports and factsheets); bodies are extracted from the source PDFs..","operationId":"detail_ep_api_v2_edps_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/topics":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — topic pages (newest first)","description":"**What it does**\nLists European Data Protection Supervisor's topic pages, newest first. Snapshots of the EDPS's about pages, its supervisor and advisor roles, its work (audits, complaints, guidelines), technology monitoring (TechDispatch, TechSonar), the EU-institutions DPO network and its AI work (the AI Act and artificial intelligence).\n\n**When to use it**\nTrack what EDPS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EDPS about, supervisory-role, work and technology pages..","operationId":"list_ep_api_v2_edps_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edps/topics/{item_id}":{"get":{"tags":["v2-edps","v2-edps"],"summary":"European Data Protection Supervisor — one topic page (full body)","description":"**What it does**\nReturns one European Data Protection Supervisor topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EDPS about, supervisory-role, work and technology pages..","operationId":"detail_ep_api_v2_edps_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"EDPB folder directory — what EDPB carries","description":"**What it does**\nReturns European Data Protection Board (EDPB) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/edpb\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_edpb_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Edpb Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/news":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — news items (newest first)","description":"**What it does**\nLists European Data Protection Board's news items, newest first. News from the European Data Protection Board on GDPR guidance, decisions and coordination of the national data-protection authorities.\n\n**When to use it**\nTrack what EDPB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPB news listing..","operationId":"list_ep_api_v2_edpb_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/news/{item_id}":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — one news item (full body)","description":"**What it does**\nReturns one European Data Protection Board news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPB news listing..","operationId":"detail_ep_api_v2_edpb_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/documents":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — documents (newest first)","description":"**What it does**\nLists European Data Protection Board's documents, newest first. The EDPB's adopted opinions, guidelines, recommendations and binding decisions on the GDPR. Filter with q (e.g. a topic or a document number).\n\n**When to use it**\nTrack what EDPB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /documents?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPB documents listing..","operationId":"list_ep_api_v2_edpb_documents_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/documents/{item_id}":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — one document (full body)","description":"**What it does**\nReturns one European Data Protection Board document in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /documents/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPB documents listing..","operationId":"detail_ep_api_v2_edpb_documents__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/public-consultations":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — public consultations (newest first)","description":"**What it does**\nLists European Data Protection Board's public consultations, newest first. Open EDPB public consultations on draft guidelines and recommendations, with their deadlines where published.\n\n**When to use it**\nTrack what EDPB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /public-consultations?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDPB public-consultations listing..","operationId":"list_ep_api_v2_edpb_public_consultations_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/public-consultations/{item_id}":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — one public consultation (full body)","description":"**What it does**\nReturns one European Data Protection Board public consultation in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /public-consultations/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDPB public-consultations listing..","operationId":"detail_ep_api_v2_edpb_public_consultations__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/topics":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — topic pages (newest first)","description":"**What it does**\nLists European Data Protection Board's topic pages, newest first. Snapshots of the EDPB's about page, its GDPR topics (key concepts, accountability tools, cooperation and enforcement, AI and technology, international transfers, security and data breaches, police and justice, specific domains) and its registers.\n\n**When to use it**\nTrack what EDPB is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EDPB about, GDPR-topic and register pages..","operationId":"list_ep_api_v2_edpb_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edpb/topics/{item_id}":{"get":{"tags":["v2-edpb","v2-edpb"],"summary":"European Data Protection Board — one topic page (full body)","description":"**What it does**\nReturns one European Data Protection Board topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EDPB about, GDPR-topic and register pages..","operationId":"detail_ep_api_v2_edpb_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"ECCC folder directory — what ECCC carries","description":"**What it does**\nReturns European Cybersecurity Competence Centre (ECCC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eccc\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eccc_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eccc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/news":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — news items (newest first)","description":"**What it does**\nLists European Cybersecurity Competence Centre's news items, newest first. News from the European Cybersecurity Competence Centre on funding, the National Coordination Centres and the cybersecurity community.\n\n**When to use it**\nTrack what ECCC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECCC news listing..","operationId":"list_ep_api_v2_eccc_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/news/{item_id}":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — one news item (full body)","description":"**What it does**\nReturns one European Cybersecurity Competence Centre news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECCC news listing..","operationId":"detail_ep_api_v2_eccc_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/calls":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — calls (newest first)","description":"**What it does**\nLists European Cybersecurity Competence Centre's calls, newest first. Open ECCC funding calls under Digital Europe and Horizon Europe cybersecurity.\n\n**When to use it**\nTrack what ECCC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /calls?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECCC funding-opportunities listings (calls for proposals and calls for expressions of interest)..","operationId":"list_ep_api_v2_eccc_calls_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/calls/{item_id}":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — one call (full body)","description":"**What it does**\nReturns one European Cybersecurity Competence Centre call in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /calls/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECCC funding-opportunities listings (calls for proposals and calls for expressions of interest)..","operationId":"detail_ep_api_v2_eccc_calls__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/governing-board":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — Governing Board members (newest first)","description":"**What it does**\nLists European Cybersecurity Competence Centre's Governing Board members, newest first. The members and alternates of the ECCC Governing Board, by Member State, with their role. Filter with q (e.g. a country).\n\n**When to use it**\nTrack what ECCC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /governing-board?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECCC Governing Board membership table..","operationId":"list_ep_api_v2_eccc_governing_board_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/governing-board/{item_id}":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — one Governing Board member (full body)","description":"**What it does**\nReturns one European Cybersecurity Competence Centre Governing Board member in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /governing-board/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECCC Governing Board membership table..","operationId":"detail_ep_api_v2_eccc_governing_board__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/nccs":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — National Coordination Centres (newest first)","description":"**What it does**\nLists European Cybersecurity Competence Centre's National Coordination Centres, newest first. The designated National Coordination Centre in each Member State (the national body that channels ECCC funding and coordinates the community). Filter with q (e.g. a country or an organisation name).\n\n**When to use it**\nTrack what ECCC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /nccs?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ECCC list of confirmed National Coordination Centres..","operationId":"list_ep_api_v2_eccc_nccs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/nccs/{item_id}":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — one National Coordination Centre (full body)","description":"**What it does**\nReturns one European Cybersecurity Competence Centre National Coordination Centre in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /nccs/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ECCC list of confirmed National Coordination Centres..","operationId":"detail_ep_api_v2_eccc_nccs__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/topics":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — topic pages (newest first)","description":"**What it does**\nLists European Cybersecurity Competence Centre's topic pages, newest first. Snapshots of the ECCC's about-us, strategic-agenda and funding-opportunities pages.\n\n**When to use it**\nTrack what ECCC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ECCC about, strategic-agenda and funding pages..","operationId":"list_ep_api_v2_eccc_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eccc/topics/{item_id}":{"get":{"tags":["v2-eccc","v2-eccc"],"summary":"European Cybersecurity Competence Centre — one topic page (full body)","description":"**What it does**\nReturns one European Cybersecurity Competence Centre topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ECCC about, strategic-agenda and funding pages..","operationId":"detail_ep_api_v2_eccc_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"EUISS folder directory — what EUISS carries","description":"**What it does**\nReturns European Union Institute for Security Studies (EUISS) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euiss\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euiss_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euiss Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/news":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — news items (newest first)","description":"**What it does**\nLists European Union Institute for Security Studies's news items, newest first. News from the EU Institute for Security Studies on its research, projects and events.\n\n**When to use it**\nTrack what EUISS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUISS news listing..","operationId":"list_ep_api_v2_euiss_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/news/{item_id}":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — one news item (full body)","description":"**What it does**\nReturns one European Union Institute for Security Studies news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUISS news listing..","operationId":"detail_ep_api_v2_euiss_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/publications":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — publications (newest first)","description":"**What it does**\nLists European Union Institute for Security Studies's publications, newest first. EUISS research output: briefs, Chaillot Papers, analyses, commentary and books on EU foreign policy, security and defence. Filter with q (e.g. a topic or a region).\n\n**When to use it**\nTrack what EUISS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUISS publications (briefs, Chaillot Papers, analysis, commentary)..","operationId":"list_ep_api_v2_euiss_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/publications/{item_id}":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — one publication (full body)","description":"**What it does**\nReturns one European Union Institute for Security Studies publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUISS publications (briefs, Chaillot Papers, analysis, commentary)..","operationId":"detail_ep_api_v2_euiss_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/events":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — events (newest first)","description":"**What it does**\nLists European Union Institute for Security Studies's events, newest first. Conferences, webinars and roundtables organised by the EUISS.\n\n**When to use it**\nTrack what EUISS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EUISS events listing..","operationId":"list_ep_api_v2_euiss_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/events/{item_id}":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — one event (full body)","description":"**What it does**\nReturns one European Union Institute for Security Studies event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EUISS events listing..","operationId":"detail_ep_api_v2_euiss_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/topics":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — topic pages (newest first)","description":"**What it does**\nLists European Union Institute for Security Studies's topic pages, newest first. Snapshots of the EUISS's about page, its thematic topics (EU foreign policy, global governance, security and defence, transnational challenges, strategic foresight), its regional focuses and its projects (EU Cyber Direct, countering foreign interference, ChipDiplo, SCOPE).\n\n**When to use it**\nTrack what EUISS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EUISS about, topic, region and project pages..","operationId":"list_ep_api_v2_euiss_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euiss/topics/{item_id}":{"get":{"tags":["v2-euiss","v2-euiss"],"summary":"European Union Institute for Security Studies — one topic page (full body)","description":"**What it does**\nReturns one European Union Institute for Security Studies topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EUISS about, topic, region and project pages..","operationId":"detail_ep_api_v2_euiss_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda":{"get":{"tags":["v2-eda","v2-eda"],"summary":"EDA folder directory — what EDA carries","description":"**What it does**\nReturns European Defence Agency (EDA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eda\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eda_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eda Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/news":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — news items (newest first)","description":"**What it does**\nLists European Defence Agency's news items, newest first. News from the European Defence Agency on capability development, defence research, industry engagement and the EU defence initiatives.\n\n**When to use it**\nTrack what EDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDA news listing..","operationId":"list_ep_api_v2_eda_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/news/{item_id}":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — one news item (full body)","description":"**What it does**\nReturns one European Defence Agency news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDA news listing..","operationId":"detail_ep_api_v2_eda_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/publications":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — publications (newest first)","description":"**What it does**\nLists European Defence Agency's publications, newest first. EDA factsheets, reports and the defence-data publications. Filter with q (e.g. a capability area).\n\n**When to use it**\nTrack what EDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDA publications listing..","operationId":"list_ep_api_v2_eda_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/publications/{item_id}":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — one publication (full body)","description":"**What it does**\nReturns one European Defence Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDA publications listing..","operationId":"detail_ep_api_v2_eda_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/events":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — events (newest first)","description":"**What it does**\nLists European Defence Agency's events, newest first. Workshops, conferences and community events organised by the EDA, with their dates.\n\n**When to use it**\nTrack what EDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EDA events listing..","operationId":"list_ep_api_v2_eda_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/events/{item_id}":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — one event (full body)","description":"**What it does**\nReturns one European Defence Agency event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EDA events listing..","operationId":"detail_ep_api_v2_eda_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/topics":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — topic pages (newest first)","description":"**What it does**\nLists European Defence Agency's topic pages, newest first. Snapshots of the EDA's what-we-do pages (EU defence initiatives, capability development, research and technology, industry engagement, EU policies, training and exercises, enablers, support to operations) and its who-we-are pages.\n\n**When to use it**\nTrack what EDA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EDA what-we-do and who-we-are pages..","operationId":"list_ep_api_v2_eda_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eda/topics/{item_id}":{"get":{"tags":["v2-eda","v2-eda"],"summary":"European Defence Agency — one topic page (full body)","description":"**What it does**\nReturns one European Defence Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EDA what-we-do and who-we-are pages..","operationId":"detail_ep_api_v2_eda_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/satcen":{"get":{"tags":["v2-satcen","v2-satcen"],"summary":"SatCen folder directory — what SatCen carries","description":"**What it does**\nReturns European Union Satellite Centre (SatCen) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/satcen\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_satcen_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Satcen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/satcen/news":{"get":{"tags":["v2-satcen","v2-satcen"],"summary":"European Union Satellite Centre — news items (newest first)","description":"**What it does**\nLists European Union Satellite Centre's news items, newest first. News from the EU Satellite Centre on its geospatial-intelligence work, partnerships and visits.\n\n**When to use it**\nTrack what SatCen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SatCen news listing..","operationId":"list_ep_api_v2_satcen_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/satcen/news/{item_id}":{"get":{"tags":["v2-satcen","v2-satcen"],"summary":"European Union Satellite Centre — one news item (full body)","description":"**What it does**\nReturns one European Union Satellite Centre news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SatCen news listing..","operationId":"detail_ep_api_v2_satcen_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/satcen/topics":{"get":{"tags":["v2-satcen","v2-satcen"],"summary":"European Union Satellite Centre — topic pages (newest first)","description":"**What it does**\nLists European Union Satellite Centre's topic pages, newest first. Snapshots of SatCen's mission and centre pages, its structure, its services (geospatial intelligence, Copernicus, humanitarian aid, contingency planning, critical infrastructure, military capabilities, weapons of mass destruction), training, capability development and key documents.\n\n**When to use it**\nTrack what SatCen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of SatCen who-we-are, what-we-do and services pages..","operationId":"list_ep_api_v2_satcen_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/satcen/topics/{item_id}":{"get":{"tags":["v2-satcen","v2-satcen"],"summary":"European Union Satellite Centre — one topic page (full body)","description":"**What it does**\nReturns one European Union Satellite Centre topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of SatCen who-we-are, what-we-do and services pages..","operationId":"detail_ep_api_v2_satcen_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esdc":{"get":{"tags":["v2-esdc","v2-esdc"],"summary":"ESDC folder directory — what ESDC carries","description":"**What it does**\nReturns European Security and Defence College (ESDC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/esdc\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_esdc_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Esdc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esdc/news":{"get":{"tags":["v2-esdc","v2-esdc"],"summary":"European Security and Defence College — news items (newest first)","description":"**What it does**\nLists European Security and Defence College's news items, newest first. News from the European Security and Defence College on its courses, training activities and the CSDP training network.\n\n**When to use it**\nTrack what ESDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the ESDC news RSS feed..","operationId":"list_ep_api_v2_esdc_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esdc/news/{item_id}":{"get":{"tags":["v2-esdc","v2-esdc"],"summary":"European Security and Defence College — one news item (full body)","description":"**What it does**\nReturns one European Security and Defence College news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the ESDC news RSS feed..","operationId":"detail_ep_api_v2_esdc_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esdc/topics":{"get":{"tags":["v2-esdc","v2-esdc"],"summary":"European Security and Defence College — topic pages (newest first)","description":"**What it does**\nLists European Security and Defence College's topic pages, newest first. Snapshots of the ESDC's about, mission, history, structure and network pages, its training and education and course catalogue, and its configurations (climate and security, cyber, doctoral school, missions and operations training, military Erasmus, war colleges initiative).\n\n**When to use it**\nTrack what ESDC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of ESDC about, network and training-configuration pages..","operationId":"list_ep_api_v2_esdc_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/esdc/topics/{item_id}":{"get":{"tags":["v2-esdc","v2-esdc"],"summary":"European Security and Defence College — one topic page (full body)","description":"**What it does**\nReturns one European Security and Defence College topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of ESDC about, network and training-configuration pages..","operationId":"detail_ep_api_v2_esdc_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen folder directory — what Clean Hydrogen carries","description":"**What it does**\nReturns Clean Hydrogen Joint Undertaking (Clean Hydrogen) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/clean-hydrogen\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_clean_hydrogen_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Clean Hydrogen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/news":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Clean Hydrogen Joint Undertaking's news items, newest first. News from the Clean Hydrogen JU on its calls, projects, hydrogen valleys and the European Hydrogen Observatory.\n\n**When to use it**\nTrack what Clean Hydrogen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU news and project updates..","operationId":"list_ep_api_v2_clean_hydrogen_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/news/{item_id}":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Clean Hydrogen Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU news and project updates..","operationId":"detail_ep_api_v2_clean_hydrogen_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/events":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — events (newest first)","description":"**What it does**\nLists Clean Hydrogen Joint Undertaking's events, newest first. Info days, the European Hydrogen Week and other events.\n\n**When to use it**\nTrack what Clean Hydrogen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU events listing..","operationId":"list_ep_api_v2_clean_hydrogen_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/events/{item_id}":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — one event (full body)","description":"**What it does**\nReturns one Clean Hydrogen Joint Undertaking event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU events listing..","operationId":"detail_ep_api_v2_clean_hydrogen_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/publications":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — publications (newest first)","description":"**What it does**\nLists Clean Hydrogen Joint Undertaking's publications, newest first. Reports, programme reviews and key documents from the Clean Hydrogen JU.\n\n**When to use it**\nTrack what Clean Hydrogen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU publications..","operationId":"list_ep_api_v2_clean_hydrogen_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/publications/{item_id}":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — one publication (full body)","description":"**What it does**\nReturns one Clean Hydrogen Joint Undertaking publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Clean Hydrogen JU publications..","operationId":"detail_ep_api_v2_clean_hydrogen_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/topics":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Clean Hydrogen Joint Undertaking's topic pages, newest first. Snapshots of the JU's about, mission, organisation, get-involved (hydrogen valleys, international collaboration), funding and knowledge-management pages.\n\n**When to use it**\nTrack what Clean Hydrogen is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Clean Hydrogen JU about, get-involved and knowledge pages..","operationId":"list_ep_api_v2_clean_hydrogen_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-hydrogen/topics/{item_id}":{"get":{"tags":["v2-hydrogen","v2-hydrogen"],"summary":"Clean Hydrogen Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Clean Hydrogen Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Clean Hydrogen JU about, get-involved and knowledge pages..","operationId":"detail_ep_api_v2_clean_hydrogen_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"EDCTP3 folder directory — what EDCTP3 carries","description":"**What it does**\nReturns Global Health EDCTP3 Joint Undertaking (EDCTP3) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/edctp3\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_edctp3_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Edctp3 Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/news":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Global Health EDCTP3 Joint Undertaking's news items, newest first. News from the Global Health EDCTP3 JU on its calls, funded clinical research and EU-Africa partnership.\n\n**When to use it**\nTrack what EDCTP3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Global Health EDCTP3 JU news listing..","operationId":"list_ep_api_v2_edctp3_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/news/{item_id}":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Global Health EDCTP3 Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Global Health EDCTP3 JU news listing..","operationId":"detail_ep_api_v2_edctp3_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/events":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — events (newest first)","description":"**What it does**\nLists Global Health EDCTP3 Joint Undertaking's events, newest first. Conferences, the EDCTP Forum and other events.\n\n**When to use it**\nTrack what EDCTP3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Global Health EDCTP3 JU events listing..","operationId":"list_ep_api_v2_edctp3_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/events/{item_id}":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — one event (full body)","description":"**What it does**\nReturns one Global Health EDCTP3 Joint Undertaking event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Global Health EDCTP3 JU events listing..","operationId":"detail_ep_api_v2_edctp3_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/topics":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Global Health EDCTP3 Joint Undertaking's topic pages, newest first. Snapshots of the JU's who-we-are, what-we-do, what-we-fund, governance, funding (calls, research priorities, prizes), projects and results-and-insights pages.\n\n**When to use it**\nTrack what EDCTP3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EDCTP3 about, funding and results pages..","operationId":"list_ep_api_v2_edctp3_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/edctp3/topics/{item_id}":{"get":{"tags":["v2-edctp3","v2-edctp3"],"summary":"Global Health EDCTP3 Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Global Health EDCTP3 Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EDCTP3 about, funding and results pages..","operationId":"detail_ep_api_v2_edctp3_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"EuroHPC folder directory — what EuroHPC carries","description":"**What it does**\nReturns European High Performance Computing Joint Undertaking (EuroHPC) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eurohpc\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eurohpc_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eurohpc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/news":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — news items (newest first)","description":"**What it does**\nLists European High Performance Computing Joint Undertaking's news items, newest first. News and press releases from the EuroHPC JU on its supercomputers, AI factories, quantum computers and calls.\n\n**When to use it**\nTrack what EuroHPC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EuroHPC JU press releases..","operationId":"list_ep_api_v2_eurohpc_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/news/{item_id}":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one European High Performance Computing Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EuroHPC JU press releases..","operationId":"detail_ep_api_v2_eurohpc_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/events":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — events (newest first)","description":"**What it does**\nLists European High Performance Computing Joint Undertaking's events, newest first. Events organised by the EuroHPC JU.\n\n**When to use it**\nTrack what EuroHPC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EuroHPC JU events listing..","operationId":"list_ep_api_v2_eurohpc_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/events/{item_id}":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — one event (full body)","description":"**What it does**\nReturns one European High Performance Computing Joint Undertaking event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EuroHPC JU events listing..","operationId":"detail_ep_api_v2_eurohpc_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/topics":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists European High Performance Computing Joint Undertaking's topic pages, newest first. Snapshots of the JU's about and governance pages, its AI factories and AI gigafactories, its supercomputers (access calls, awarded projects), quantum technologies and research-innovation calls.\n\n**When to use it**\nTrack what EuroHPC is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of EuroHPC about, AI-factories, supercomputers and quantum pages..","operationId":"list_ep_api_v2_eurohpc_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eurohpc/topics/{item_id}":{"get":{"tags":["v2-eurohpc","v2-eurohpc"],"summary":"European High Performance Computing Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one European High Performance Computing Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of EuroHPC about, AI-factories, supercomputers and quantum pages..","operationId":"detail_ep_api_v2_eurohpc_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euratom":{"get":{"tags":["v2-euratom","v2-euratom"],"summary":"Euratom-SA folder directory — what Euratom-SA carries","description":"**What it does**\nReturns Euratom Supply Agency (Euratom-SA) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/euratom\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_euratom_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Euratom Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euratom/publications":{"get":{"tags":["v2-euratom","v2-euratom"],"summary":"Euratom Supply Agency — publications (newest first)","description":"**What it does**\nLists Euratom Supply Agency's publications, newest first. ESA annual reports, quarterly reports and other publications on the nuclear-materials market.\n\n**When to use it**\nTrack what Euratom-SA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Euratom Supply Agency publications (annual and quarterly reports)..","operationId":"list_ep_api_v2_euratom_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euratom/publications/{item_id}":{"get":{"tags":["v2-euratom","v2-euratom"],"summary":"Euratom Supply Agency — one publication (full body)","description":"**What it does**\nReturns one Euratom Supply Agency publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Euratom Supply Agency publications (annual and quarterly reports)..","operationId":"detail_ep_api_v2_euratom_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euratom/topics":{"get":{"tags":["v2-euratom","v2-euratom"],"summary":"Euratom Supply Agency — topic pages (newest first)","description":"**What it does**\nLists Euratom Supply Agency's topic pages, newest first. Snapshots of the ESA's activities (contract management, the market observatory, supply of medical radioisotopes) and its about pages (legal basis, governance, organisation, planning and reporting).\n\n**When to use it**\nTrack what Euratom-SA is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Euratom Supply Agency activities and about pages..","operationId":"list_ep_api_v2_euratom_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/euratom/topics/{item_id}":{"get":{"tags":["v2-euratom","v2-euratom"],"summary":"Euratom Supply Agency — one topic page (full body)","description":"**What it does**\nReturns one Euratom Supply Agency topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Euratom Supply Agency activities and about pages..","operationId":"detail_ep_api_v2_euratom_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-aviation":{"get":{"tags":["v2-clean-aviation","v2-clean-aviation"],"summary":"Clean Aviation folder directory — what Clean Aviation carries","description":"**What it does**\nReturns Clean Aviation Joint Undertaking (Clean Aviation) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/clean-aviation\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_clean_aviation_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Clean Aviation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-aviation/news":{"get":{"tags":["v2-clean-aviation","v2-clean-aviation"],"summary":"Clean Aviation Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Clean Aviation Joint Undertaking's news items, newest first. News, articles and podcasts from the Clean Aviation JU on low-emission aircraft research, calls, members and projects.\n\n**When to use it**\nTrack what Clean Aviation is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Clean Aviation JU news-and-events listing..","operationId":"list_ep_api_v2_clean_aviation_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-aviation/news/{item_id}":{"get":{"tags":["v2-clean-aviation","v2-clean-aviation"],"summary":"Clean Aviation Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Clean Aviation Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Clean Aviation JU news-and-events listing..","operationId":"detail_ep_api_v2_clean_aviation_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-aviation/topics":{"get":{"tags":["v2-clean-aviation","v2-clean-aviation"],"summary":"Clean Aviation Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Clean Aviation Joint Undertaking's topic pages, newest first. Snapshots of the JU's about and who-we-are pages, governance, members, calls (for proposals), research and innovation, projects, energy-efficiency and emission-reduction work, reference documents and success stories.\n\n**When to use it**\nTrack what Clean Aviation is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Clean Aviation about, members, calls and research pages..","operationId":"list_ep_api_v2_clean_aviation_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/clean-aviation/topics/{item_id}":{"get":{"tags":["v2-clean-aviation","v2-clean-aviation"],"summary":"Clean Aviation Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Clean Aviation Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Clean Aviation about, members, calls and research pages..","operationId":"detail_ep_api_v2_clean_aviation_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cbe":{"get":{"tags":["v2-cbe","v2-cbe"],"summary":"CBE folder directory — what CBE carries","description":"**What it does**\nReturns Circular Bio-based Europe Joint Undertaking (CBE) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/cbe\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_cbe_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Cbe Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cbe/news":{"get":{"tags":["v2-cbe","v2-cbe"],"summary":"Circular Bio-based Europe Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Circular Bio-based Europe Joint Undertaking's news items, newest first. News from the Circular Bio-based Europe JU on its calls, bio-based projects and the circular bioeconomy.\n\n**When to use it**\nTrack what CBE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the CBE JU news listing..","operationId":"list_ep_api_v2_cbe_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cbe/news/{item_id}":{"get":{"tags":["v2-cbe","v2-cbe"],"summary":"Circular Bio-based Europe Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Circular Bio-based Europe Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the CBE JU news listing..","operationId":"detail_ep_api_v2_cbe_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cbe/topics":{"get":{"tags":["v2-cbe","v2-cbe"],"summary":"Circular Bio-based Europe Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Circular Bio-based Europe Joint Undertaking's topic pages, newest first. Snapshots of the JU's organisation, mission and objectives, governance, team and values, about-bioeconomy, why-a-joint-undertaking, projects, achievements, open calls, how to apply for funding and reference documents.\n\n**When to use it**\nTrack what CBE is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of CBE about, governance, bioeconomy and funding pages..","operationId":"list_ep_api_v2_cbe_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cbe/topics/{item_id}":{"get":{"tags":["v2-cbe","v2-cbe"],"summary":"Circular Bio-based Europe Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Circular Bio-based Europe Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of CBE about, governance, bioeconomy and funding pages..","operationId":"detail_ep_api_v2_cbe_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ihi":{"get":{"tags":["v2-ihi","v2-ihi"],"summary":"IHI folder directory — what IHI carries","description":"**What it does**\nReturns Innovative Health Initiative Joint Undertaking (IHI) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/ihi\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_ihi_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Ihi Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ihi/topics":{"get":{"tags":["v2-ihi","v2-ihi"],"summary":"Innovative Health Initiative Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Innovative Health Initiative Joint Undertaking's topic pages, newest first. Snapshots of the JU's about pages (mission and objectives, research and innovation agenda, funding model, who we are, history, IMI-IHI, plans and finances), apply-for-funding (open calls, future opportunities) and projects and results pages.\n\n**When to use it**\nTrack what IHI is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of IHI about, funding and projects pages..","operationId":"list_ep_api_v2_ihi_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/ihi/topics/{item_id}":{"get":{"tags":["v2-ihi","v2-ihi"],"summary":"Innovative Health Initiative Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Innovative Health Initiative Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of IHI about, funding and projects pages..","operationId":"detail_ep_api_v2_ihi_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips folder directory — what Chips carries","description":"**What it does**\nReturns Chips Joint Undertaking (Chips) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/chips\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_chips_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Chips Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/news":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Chips Joint Undertaking's news items, newest first. News from the Chips JU on its calls, pilot lines and Europes semiconductor ecosystem under the Chips Act.\n\n**When to use it**\nTrack what Chips is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Chips JU news listing..","operationId":"list_ep_api_v2_chips_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/news/{item_id}":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Chips Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Chips JU news listing..","operationId":"detail_ep_api_v2_chips_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/events":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — events (newest first)","description":"**What it does**\nLists Chips Joint Undertaking's events, newest first. Info days, workshops and symposia organised by the Chips JU.\n\n**When to use it**\nTrack what Chips is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Chips JU events listing..","operationId":"list_ep_api_v2_chips_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/events/{item_id}":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — one event (full body)","description":"**What it does**\nReturns one Chips Joint Undertaking event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Chips JU events listing..","operationId":"detail_ep_api_v2_chips_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/topics":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Chips Joint Undertaking's topic pages, newest first. Snapshots of the JU's about, governance and members, multiannual work programme (MAWP), Chips for Europe initiative, the ECS programme, general documents and publications.\n\n**When to use it**\nTrack what Chips is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Chips JU about, governance and documents pages..","operationId":"list_ep_api_v2_chips_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/chips/topics/{item_id}":{"get":{"tags":["v2-chips","v2-chips"],"summary":"Chips Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Chips Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Chips JU about, governance and documents pages..","operationId":"detail_ep_api_v2_chips_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 folder directory — what SESAR 3 carries","description":"**What it does**\nReturns SESAR 3 Joint Undertaking (SESAR 3) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/sesar\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_sesar_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Sesar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/news":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — news items (newest first)","description":"**What it does**\nLists SESAR 3 Joint Undertaking's news items, newest first. News from the SESAR 3 JU on air-traffic-management research, the digital European sky, U-space and its calls.\n\n**When to use it**\nTrack what SESAR 3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU news listing..","operationId":"list_ep_api_v2_sesar_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/news/{item_id}":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one SESAR 3 Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU news listing..","operationId":"detail_ep_api_v2_sesar_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/publications":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — publications (newest first)","description":"**What it does**\nLists SESAR 3 Joint Undertaking's publications, newest first. SESAR 3 JU policy briefs, brochures, reports and other documents. Filter with q (e.g. a topic).\n\n**When to use it**\nTrack what SESAR 3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU documents listing..","operationId":"list_ep_api_v2_sesar_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/publications/{item_id}":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — one publication (full body)","description":"**What it does**\nReturns one SESAR 3 Joint Undertaking publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU documents listing..","operationId":"detail_ep_api_v2_sesar_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/events":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — events (newest first)","description":"**What it does**\nLists SESAR 3 Joint Undertaking's events, newest first. Conferences, dissemination events and the SESAR Innovation Days.\n\n**When to use it**\nTrack what SESAR 3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU events listing..","operationId":"list_ep_api_v2_sesar_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/events/{item_id}":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — one event (full body)","description":"**What it does**\nReturns one SESAR 3 Joint Undertaking event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SESAR 3 JU events listing..","operationId":"detail_ep_api_v2_sesar_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/topics":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists SESAR 3 Joint Undertaking's topic pages, newest first. Snapshots of the JU's discover-SESAR and approach pages, the ATM Master Plan, smart ATM, sustainability, the innovation pipeline, digitalisation, U-space, AI, virtual centres, RTS, CNS and smart airports.\n\n**When to use it**\nTrack what SESAR 3 is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of SESAR 3 about and thematic pages..","operationId":"list_ep_api_v2_sesar_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sesar/topics/{item_id}":{"get":{"tags":["v2-sesar","v2-sesar"],"summary":"SESAR 3 Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one SESAR 3 Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of SESAR 3 about and thematic pages..","operationId":"detail_ep_api_v2_sesar_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"F4E folder directory — what F4E carries","description":"**What it does**\nReturns Fusion for Energy (F4E) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/f4e\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_f4e_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 F4E Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/press-releases":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — press releases (newest first)","description":"**What it does**\nLists Fusion for Energy's press releases, newest first. Fusion for Energy press releases on ITER components, contracts, milestones and the European fusion supply chain (English copies; the PDF is linked). Filter with q (e.g. ITER or a component).\n\n**When to use it**\nTrack what F4E is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /press-releases?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the F4E press-releases archive (PDF list)..","operationId":"list_ep_api_v2_f4e_press_releases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/press-releases/{item_id}":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — one press release (full body)","description":"**What it does**\nReturns one Fusion for Energy press release in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /press-releases/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the F4E press-releases archive (PDF list)..","operationId":"detail_ep_api_v2_f4e_press_releases__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/publications":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — publications (newest first)","description":"**What it does**\nLists Fusion for Energy's publications, newest first. F4E factsheets, posters, brochures and reports on ITER and fusion (the PDF is linked).\n\n**When to use it**\nTrack what F4E is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the F4E publications archive (PDF list)..","operationId":"list_ep_api_v2_f4e_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/publications/{item_id}":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — one publication (full body)","description":"**What it does**\nReturns one Fusion for Energy publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the F4E publications archive (PDF list)..","operationId":"detail_ep_api_v2_f4e_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/topics":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — topic pages (newest first)","description":"**What it does**\nLists Fusion for Energy's topic pages, newest first. Snapshots of F4E's mission and values, what-is-fusion and merits-of-fusion explainers, developing fusion, ITER and the device, the story so far, governance and committees, and how to get involved.\n\n**When to use it**\nTrack what F4E is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of F4E about, fusion-explainer, ITER and governance pages..","operationId":"list_ep_api_v2_f4e_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/f4e/topics/{item_id}":{"get":{"tags":["v2-f4e","v2-f4e"],"summary":"Fusion for Energy — one topic page (full body)","description":"**What it does**\nReturns one Fusion for Energy topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of F4E about, fusion-explainer, ITER and governance pages..","operationId":"detail_ep_api_v2_f4e_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europes-rail":{"get":{"tags":["v2-europes-rail","v2-europes-rail"],"summary":"Europe's Rail folder directory — what Europe's Rail carries","description":"**What it does**\nReturns Europe's Rail Joint Undertaking (Europe's Rail) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/europes-rail\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_europes_rail_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Europes Rail Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europes-rail/news":{"get":{"tags":["v2-europes-rail","v2-europes-rail"],"summary":"Europe's Rail Joint Undertaking — news items (newest first)","description":"**What it does**\nLists Europe's Rail Joint Undertaking's news items, newest first. News from the Europe's Rail JU on railway research and innovation, its flagship projects, deliverables and calls.\n\n**When to use it**\nTrack what Europe's Rail is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the Europe's Rail JU news listing..","operationId":"list_ep_api_v2_europes_rail_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europes-rail/news/{item_id}":{"get":{"tags":["v2-europes-rail","v2-europes-rail"],"summary":"Europe's Rail Joint Undertaking — one news item (full body)","description":"**What it does**\nReturns one Europe's Rail Joint Undertaking news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the Europe's Rail JU news listing..","operationId":"detail_ep_api_v2_europes_rail_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europes-rail/topics":{"get":{"tags":["v2-europes-rail","v2-europes-rail"],"summary":"Europe's Rail Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Europe's Rail Joint Undertaking's topic pages, newest first. Snapshots of the JU's about, members and governance pages, its rail projects and solutions catalogue, the Shift2Rail projects, the innovation and system pillars, the deployment group, calls for proposals and reference documents (key documents, annual activity report, annual work plan and budget).\n\n**When to use it**\nTrack what Europe's Rail is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of Europe's Rail about, projects and reference-document pages..","operationId":"list_ep_api_v2_europes_rail_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/europes-rail/topics/{item_id}":{"get":{"tags":["v2-europes-rail","v2-europes-rail"],"summary":"Europe's Rail Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Europe's Rail Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of Europe's Rail about, projects and reference-document pages..","operationId":"detail_ep_api_v2_europes_rail_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sns":{"get":{"tags":["v2-sns","v2-sns"],"summary":"SNS folder directory — what SNS carries","description":"**What it does**\nReturns Smart Networks and Services Joint Undertaking (SNS) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/sns\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_sns_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Sns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sns/publications":{"get":{"tags":["v2-sns","v2-sns"],"summary":"Smart Networks and Services Joint Undertaking — publications (newest first)","description":"**What it does**\nLists Smart Networks and Services Joint Undertaking's publications, newest first. SNS JU white papers, brochures, the SNS journals and other publications on 5G/6G smart networks and services (the PDF is linked). Filter with q (e.g. 6G).\n\n**When to use it**\nTrack what SNS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the SNS JU publications and journals (PDF list)..","operationId":"list_ep_api_v2_sns_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sns/publications/{item_id}":{"get":{"tags":["v2-sns","v2-sns"],"summary":"Smart Networks and Services Joint Undertaking — one publication (full body)","description":"**What it does**\nReturns one Smart Networks and Services Joint Undertaking publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the SNS JU publications and journals (PDF list)..","operationId":"detail_ep_api_v2_sns_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sns/topics":{"get":{"tags":["v2-sns","v2-sns"],"summary":"Smart Networks and Services Joint Undertaking — topic pages (newest first)","description":"**What it does**\nLists Smart Networks and Services Joint Undertaking's topic pages, newest first. Snapshots of the SNS JU's missions and objectives, governance, team, procurement, integrity, current and open calls for proposals, proposing a project, the interactive project map, key achievements and reference documents.\n\n**When to use it**\nTrack what SNS is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from a curated set of SNS JU about, governance and funding pages..","operationId":"list_ep_api_v2_sns_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/sns/topics/{item_id}":{"get":{"tags":["v2-sns","v2-sns"],"summary":"Smart Networks and Services Joint Undertaking — one topic page (full body)","description":"**What it does**\nReturns one Smart Networks and Services Joint Undertaking topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from a curated set of SNS JU about, governance and funding pages..","operationId":"detail_ep_api_v2_sns_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/events":{"get":{"tags":["v2-events","v2-events"],"summary":"Events folder directory — every EU body's events, aggregated","description":"**What it does**\nOne-call overview of the cross-body events feed: total events, how many are upcoming vs past vs undated, how many bodies and policy families are covered, and the date span.\n\n**When to use it**\nBefore querying the feed, to see the shape of what is there.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/events\n```\n\n**You get back**\nA summary object. Then call `/api/v2/events/all` to read the feed, `/api/v2/events/bodies` to see the pick-list, or `/api/v2/events/{id}` for one event.\n\n**Data freshness**\nLive from economy_items + eu_calendar_events.","operationId":"directory_api_v2_events_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsDirectory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/events/all":{"get":{"tags":["v2-events","v2-events"],"summary":"All events, all bodies (pick your scope)","description":"**What it does**\nThe unified events feed across every EU body, newest first.\n\n**When to use it**\nOne call for 'all events from the bodies I care about'. Scope it with `body` (comma-separated codes) and/or `family` (a Brubru policy family, e.g. `defence-security-borders`); omit both for every body.\n\n**Input**\n`body` (comma list of body codes), `family` (comma list of family slugs), `when` (upcoming | past | all), `from` / `to` (YYYY-MM-DD on the event date), `days` (shorthand window: the next N days when `when=upcoming`, otherwise the last N days), `q` (free text), `source` (economy | calendar | all), `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/events/all?when=upcoming&days=14\nGET /api/v2/events/all?family=defence-security-borders&when=upcoming\nGET /api/v2/events/all?body=commission,parliament,ecb&order=recent\n```\n\n**You get back**\nA paginated envelope of events. Each carries the 5 datapoints (`body_txt` / `body_html` null on the list — fetch the detail endpoint), plus body_code, body_name, the policy families, source and (for calendar events) event_type and venue. `published_from` / `published_to` echo the date window actually applied. Undated events sort last.\n\n**Data freshness**\nLive union of economy_items + eu_calendar_events.","operationId":"list_events_api_v2_events_all_get","parameters":[{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated body codes (e.g. commission,parliament,ecb,sesar).","title":"Body"},"description":"Comma-separated body codes (e.g. commission,parliament,ecb,sesar)."},{"name":"family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated Brubru policy family slugs (see /api/v2/events/bodies).","title":"Family"},"description":"Comma-separated Brubru policy family slugs (see /api/v2/events/bodies)."},{"name":"when","in":"query","required":false,"schema":{"type":"string","description":"upcoming | past | all.","default":"all","title":"When"},"description":"upcoming | past | all."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only events on/after this date (YYYY-MM-DD).","title":"From"},"description":"Only events on/after this date (YYYY-MM-DD)."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only events on/before this date (YYYY-MM-DD).","title":"To"},"description":"Only events on/before this date (YYYY-MM-DD)."},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"description":"Shorthand window: with when=upcoming, the next N days; otherwise the last N days. Ignored if `from`/`to` already bound that side.","title":"Days"},"description":"Shorthand window: with when=upcoming, the next N days; otherwise the last N days. Ignored if `from`/`to` already bound that side."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title and summary.","title":"Q"},"description":"Free-text search over title and summary."},{"name":"source","in":"query","required":false,"schema":{"type":"string","description":"economy | calendar | all.","default":"all","title":"Source"},"description":"economy | calendar | all."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EventItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/events/bodies":{"get":{"tags":["v2-events","v2-events"],"summary":"Pick-list: bodies and policy families with event counts","description":"**What it does**\nThe discovery endpoint for the `body` and `family` filters: every body that has events (with its count and families) and every Brubru policy family (with its bodies and total event count).\n\n**When to use it**\nTo build a body/family picker, or to see what `family=` expands to.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/events/bodies\n```\n\n**You get back**\n`{bodies: [...], families: [...]}`.\n\n**Data freshness**\nLive.","operationId":"bodies_facet_api_v2_events_bodies_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bodies Facet Api V2 Events Bodies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/events/{event_id}":{"get":{"tags":["v2-events","v2-events"],"summary":"One event (full body)","description":"**What it does**\nReturns one event in full, including `body_txt` / `body_html` where the source provides them.\n\n**When to use it**\nAfter finding an event id on `/api/v2/events/all`.\n\n**Input**\n`event_id` — the prefixed aggregator id (e.g. `e12345` or `c<uuid>`).\n\n**Try it**\n```\nGET /api/v2/events/e12345\n```\n\n**You get back**\nA single event with the full 5-datapoint contract.\n\n**Data freshness**\nLive.","operationId":"get_event_api_v2_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Prefixed aggregator id: 'e<n>' or 'c<uuid>'.","title":"Event Id"},"description":"Prefixed aggregator id: 'e<n>' or 'c<uuid>'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/news":{"get":{"tags":["v2-news","v2-news"],"summary":"News folder directory — every EU body's news, aggregated","description":"**What it does**\nOne-call overview of the cross-body news feed: totals by kind, bodies and policy families covered, and the date span.\n\n**When to use it**\nBefore querying, to see the shape of what is there.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/news\n```\n\n**You get back**\nA summary object. Then call `/api/v2/news/all`, `/api/v2/news/bodies`, or `/api/v2/news/{id}`.\n\n**Data freshness**\nLive, across both news stores.","operationId":"directory_api_v2_news_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsDirectory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/news/all":{"get":{"tags":["v2-news","v2-news"],"summary":"All news, all bodies (pick your scope)","description":"**What it does**\nThe unified news feed across every EU body, newest first. 'News' bundles latest news, press releases, stories, speeches and statements.\n\n**When to use it**\nOne call for 'all news from the bodies I care about'. Scope with `body` (comma-separated codes) and/or `family` (a Brubru policy family); omit both for every body.\n\n**Input**\n`body`, `family`, `kind` (news | press_release | all), `from` / `to` (YYYY-MM-DD), `days` (shorthand for the last N days; ignored when `from` is given), `q` (free text), `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/news/all?days=3\nGET /api/v2/news/all?family=finance-economy&order=recent\nGET /api/v2/news/all?body=commission,ecb&q=inflation\n```\n\n**You get back**\nA paginated envelope. Each item carries the 5 datapoints. **`body_txt` / `body_html` are null on the list by default — pass `include_body=true` to get them in bulk**, or call `/api/v2/news/{id}` for one item. Agency items carry the full scraped article; Commission / Parliament / Council items carry the summary the institutional feed publishes, which is the fullest text held for them. plus body_code, body_name, the policy families and kind. `published_from` / `published_to` echo the date window actually applied, so you can confirm your filter took effect.\n\n**Data freshness**\nLive. Agency news comes from Brubru's economy store; Commission, Parliament and Council news is unioned in from the institutional news store, so this feed covers both. Agency items keep their INTEGER `id`; institutional items carry a UUID STRING `id`. Either way, pass the id you were given through to `/api/v2/news/{id}` unchanged. Note `q` is full-text over the agency half and a substring match over the institutional half.","operationId":"list_news_api_v2_news_all_get","parameters":[{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated body codes (e.g. commission,ecb,cedefop).","title":"Body"},"description":"Comma-separated body codes (e.g. commission,ecb,cedefop)."},{"name":"family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated Brubru policy family slugs (see /api/v2/news/bodies).","title":"Family"},"description":"Comma-separated Brubru policy family slugs (see /api/v2/news/bodies)."},{"name":"kind","in":"query","required":false,"schema":{"type":"string","description":"news | press_release | all.","default":"all","title":"Kind"},"description":"news | press_release | all."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"From"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"To"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"description":"Shorthand for a recent window: only items from the last N days. Ignored if `from` is given.","title":"Days"},"description":"Shorthand for a recent window: only items from the last N days. Ignored if `from` is given."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because a page of full articles is large; there is no other way to get the body in bulk, so set it to true rather than calling the detail endpoint once per item.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because a page of full articles is large; there is no other way to get the body in bulk, so set it to true rather than calling the detail endpoint once per item."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_NewsItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/news/latest":{"get":{"tags":["v2-news","v2-news"],"summary":"How fresh is the news data?","description":"**What it does**\nReports the newest ingested news date, overall and per body, so you can tell whether the feed is current before you trust an empty result.\n\n**When to use it**\nWhen a date-filtered query on `/api/v2/news/all` comes back empty. An empty window plus a stale `latest_date` here means the ingestion is behind, not that nothing happened.\n\n**Input**\n`stale_after_days` (optional, default 3) - how many days old the newest item may be before this endpoint reports `stale: true`.\n\n**Try it**\n```\nGET /api/v2/news/latest\n```\n\n**You get back**\n`latest_date`, `age_days`, `stale`, `total_items`, and `by_body` (the ten most recently updated bodies with their newest date).\n\n**Data freshness**\nLive.","operationId":"latest_news_api_v2_news_latest_get","parameters":[{"name":"stale_after_days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"description":"Age in days beyond which the feed is reported as stale.","default":3,"title":"Stale After Days"},"description":"Age in days beyond which the feed is reported as stale."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Latest News Api V2 News Latest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/news/bodies":{"get":{"tags":["v2-news","v2-news"],"summary":"Pick-list: bodies and policy families with news counts","description":"**What it does**\nThe discovery endpoint for the `body` and `family` filters: every body with news (count + families) and every Brubru policy family (bodies + total count).\n\n**When to use it**\nTo build a picker, or to see what `family=` expands to.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/news/bodies\n```\n\n**You get back**\n`{bodies: [...], families: [...]}`.\n\n**Data freshness**\nLive, across both news stores.","operationId":"bodies_facet_api_v2_news_bodies_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bodies Facet Api V2 News Bodies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/news/{item_id}":{"get":{"tags":["v2-news","v2-news"],"summary":"One news item (full body)","description":"**What it does**\nReturns one news item in full, including `body_txt` / `body_html`.\n\n**When to use it**\nAfter finding an id on `/api/v2/news/all`.\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/news/12345\n```\n\n**You get back**\nA single item with the full 5-datapoint contract.\n\n**Data freshness**\nLive.","operationId":"get_news_api_v2_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","description":"Brubru item id from the list endpoint: an integer for an agency item, a UUID for a Commission / Parliament / Council item.","title":"Item Id"},"description":"Brubru item id from the list endpoint: an integer for an agency item, a UUID for a Commission / Parliament / Council item."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social":{"get":{"tags":["v2-social"],"summary":"Social folder directory — what's mapped and what carries content","description":"**What it does**: Overview of Brubru's EU social directory: how many accounts and posts, broken down by entity type and platform.\n\n**When to use it**: First call to understand coverage before querying posts or accounts.\n\n**Input**: none.\n\n**Try it**: `GET /api/v2/social`\n\n**You get back**: total accounts/posts, verified count, accounts by entity_type (mep, commissioner, institution, eu_agency, ec_official, eu_influencer), accounts and posts by platform, and a note on which platforms carry content vs mapping-only.","operationId":"directory_api_v2_social_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialDirectory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/posts":{"get":{"tags":["v2-social"],"summary":"Recent EU social posts (newest first)","description":"**What it does**: Lists recent posts from mapped EU accounts, newest first.\n\n**When to use it**: Monitor what EU institutions, MEPs, Commissioners and EU-affairs journalists are posting.\n\n**Input**: `platform`, `entity_type`, `entity_key`, `account_id`, `since` (ISO date), `q` (text search), `page`, `limit`.\n\n**Try it**: `GET /api/v2/social/posts?entity_type=commissioner&platform=x&limit=20`\n\n**You get back**: a `PaginatedResponse[SocialPost]`. Each item: entity, platform, engagement counts, and the 5 datapoints (post URL as public_url, body null on list, published date). Use the detail endpoint for the full text.","operationId":"list_posts_api_v2_social_posts_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}},{"name":"entity_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Key"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Account Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date; posts on/after this","title":"Since"},"description":"ISO date; posts on/after this"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"text search in post content","title":"Q"},"description":"text search in post content"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SocialPost_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/posts/{post_id}":{"get":{"tags":["v2-social"],"summary":"One post (full text)","description":"**What it does**: Returns a single post with its full body.\n\n**When to use it**: After finding a post in the list and you want the complete text.\n\n**Input**: `post_id` (path).\n\n**Try it**: `GET /api/v2/social/posts/12345`\n\n**You get back**: a `SocialPost` with all 5 datapoints populated: public_url, body_txt + body_html (full text), document_date (published), creation_date (fetched).","operationId":"get_post_api_v2_social_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPost"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/accounts":{"get":{"tags":["v2-social"],"summary":"The account directory (search by entity, platform, verified)","description":"**What it does**: Lists mapped social accounts across all platforms.\n\n**When to use it**: Find an entity's accounts, or browse who Brubru tracks on a platform.\n\n**Input**: `entity_type`, `platform`, `verified` (bool), `q` (name/handle search), `page`, `limit`.\n\n**Try it**: `GET /api/v2/social/accounts?entity_type=mep&platform=bluesky&verified=true`\n\n**You get back**: a `PaginatedResponse[SocialAccount]`. Each item: entity, platform, scope, handle, status/verified, discovery source, and the 5 datapoints (account URL as public_url, composed profile on detail, last-checked date).","operationId":"list_accounts_api_v2_social_accounts_get","parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verified"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SocialAccount_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/accounts/{account_id}":{"get":{"tags":["v2-social"],"summary":"One account (composed profile)","description":"**What it does**: Returns one account with its composed profile body.\n\n**When to use it**: Inspect a specific account's metadata.\n\n**Input**: `account_id` (path).\n\n**Try it**: `GET /api/v2/social/accounts/7145`\n\n**You get back**: a `SocialAccount` with all 5 datapoints: public_url, body_txt + body_html (composed profile), document_date (last checked), creation_date (first mapped).","operationId":"get_account_api_v2_social_accounts__account_id__get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialAccount"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/entity/{entity_type}/{entity_key}":{"get":{"tags":["v2-social"],"summary":"One entity's full social footprint (accounts + recent posts)","description":"**What it does**: Returns every mapped account for one entity plus its most recent posts.\n\n**When to use it**: 'Show me everything X says' — one MEP, Commissioner, institution, agency or journalist.\n\n**Input**: `entity_type` (path), `entity_key` (path; the official id/slug), `posts_limit`.\n\n**Try it**: `GET /api/v2/social/entity/commissioner/maros_sefcovic`\n\n**You get back**: `{entity_type, entity_key, entity_name, accounts: [SocialAccount], recent_posts: [SocialPost]}` — accounts with composed profiles, posts with full body.","operationId":"entity_footprint_api_v2_social_entity__entity_type___entity_key__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"entity_key","in":"path","required":true,"schema":{"type":"string","title":"Entity Key"}},{"name":"posts_limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Posts Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/social/platforms":{"get":{"tags":["v2-social"],"summary":"Platform pick-list + content-fetch feasibility","description":"**What it does**: Lists the social platforms Brubru recognises, each with its content-fetch tier and how many accounts/posts it holds.\n\n**When to use it**: To know which platforms carry post content (open) vs mapping-only.\n\n**Input**: none.\n\n**Try it**: `GET /api/v2/social/platforms`\n\n**You get back**: a list of `SocialPlatform`: code, name, fetch_tier (open/gated/hard/none), notes, account_count, post_count.","operationId":"platforms_api_v2_social_platforms_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SocialPlatform"},"title":"Response Platforms Api V2 Social Platforms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable":{"get":{"tags":["v2-interoperable"],"summary":"EU Interoperable folder directory — what it carries","description":"**What it does**\nOverview of the EU Interoperable folder: stored item counts per resource type and the number of thematic collections.\n\n**When to use it**\nA one-call overview before drilling into news, events, solutions or a specific collection.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/interoperable\n```\n\n**You get back**\nThe body record (name, website), an `item_counts` map (news / event / solution / collection) and the collections count.\n\n**Data freshness**\nCounts are live from the database.","operationId":"directory_api_v2_interoperable_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_Directory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/news":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — news (newest first, filter by collection)","description":"**What it does**\nLists the Interoperable Europe Portal's news, newest first, drawn from across every thematic collection.\n\n**When to use it**\nTrack what the EU interoperability community is publishing without scraping the portal. Filter to one collection with `collection` (e.g. `osor`, `eugovtech`, `semic-support-centre`), or by free text / date.\n\n**Input**\n`collection` (a collection slug, e.g. `open-source-observatory-osor`), `q` free-text, `since` / `until` (YYYY-MM-DD), `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/interoperable/news?collection=eugovtech&limit=10\n```\n\n**You get back**\nA paginated envelope. Each item carries the 5 datapoints (`public_url`, `document_date`, `creation_date` populated; `body_txt` / `body_html` null on the list — use the detail endpoint).\n\n**Data freshness**\nRendered from interoperable-europe.ec.europa.eu with a headless browser, refreshed regularly.","operationId":"list_ep_api_v2_interoperable_news_get","parameters":[{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre).","title":"Collection"},"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/news/{item_id}":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — one news item (full body)","description":"**What it does**\nReturns one Interoperable Europe news item in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record.\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/interoperable/news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRendered from the item's own page on interoperable-europe.ec.europa.eu.","operationId":"detail_ep_api_v2_interoperable_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/events":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — events (newest first, filter by collection)","description":"**What it does**\nLists the Interoperable Europe Portal's events, newest first, drawn from across every thematic collection.\n\n**When to use it**\nTrack what the EU interoperability community is hosting without scraping the portal. Filter to one collection with `collection` (e.g. `osor`, `eugovtech`, `semic-support-centre`), or by free text / date.\n\n**Input**\n`collection` (a collection slug, e.g. `open-source-observatory-osor`), `q` free-text, `since` / `until` (YYYY-MM-DD), `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/interoperable/events?collection=eugovtech&limit=10\n```\n\n**You get back**\nA paginated envelope. Each item carries the 5 datapoints (`public_url`, `document_date`, `creation_date` populated; `body_txt` / `body_html` null on the list — use the detail endpoint).\n\n**Data freshness**\nRendered from interoperable-europe.ec.europa.eu with a headless browser, refreshed regularly.","operationId":"list_ep_api_v2_interoperable_events_get","parameters":[{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre).","title":"Collection"},"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/events/{item_id}":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — one event (full body)","description":"**What it does**\nReturns one Interoperable Europe event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record.\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/interoperable/events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRendered from the item's own page on interoperable-europe.ec.europa.eu.","operationId":"detail_ep_api_v2_interoperable_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/solutions":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — reusable solutions (newest first, filter by collection)","description":"**What it does**\nLists the Interoperable Europe Portal's reusable solutions, newest first, drawn from across every thematic collection.\n\n**When to use it**\nTrack what the EU interoperability community is sharing without scraping the portal. Filter to one collection with `collection` (e.g. `osor`, `eugovtech`, `semic-support-centre`), or by free text / date.\n\n**Input**\n`collection` (a collection slug, e.g. `open-source-observatory-osor`), `q` free-text, `since` / `until` (YYYY-MM-DD), `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/interoperable/solutions?collection=eugovtech&limit=10\n```\n\n**You get back**\nA paginated envelope. Each item carries the 5 datapoints (`public_url`, `document_date`, `creation_date` populated; `body_txt` / `body_html` null on the list — use the detail endpoint).\n\n**Data freshness**\nRendered from interoperable-europe.ec.europa.eu with a headless browser, refreshed regularly.","operationId":"list_ep_api_v2_interoperable_solutions_get","parameters":[{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre).","title":"Collection"},"description":"Filter to one thematic collection (its slug, e.g. open-source-observatory-osor, eugovtech, semic-support-centre)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/solutions/{item_id}":{"get":{"tags":["v2-interoperable","v2-interoperable"],"summary":"Interoperable Europe — one solution (full body)","description":"**What it does**\nReturns one Interoperable Europe solution in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record.\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /api/v2/interoperable/solutions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRendered from the item's own page on interoperable-europe.ec.europa.eu.","operationId":"detail_ep_api_v2_interoperable_solutions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/collections":{"get":{"tags":["v2-interoperable"],"summary":"Interoperable Europe — the thematic collections directory","description":"**What it does**\nLists the portal's thematic collections (OSOR, SEMIC, EU GovTech, EIF/Monitoring, Public Sector Tech Watch, EUPL, CAMSS/EIRA, Digital-Ready Policymaking, Regulatory Sandboxes, Guidelines, the Academy), each a snapshot with its standing description.\n\n**When to use it**\nTo discover the hubs you can then filter on (`?collection=`) or open with the per-collection endpoint.\n\n**Input**\n`q` free-text, `order`, `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/interoperable/collections\n```\n\n**You get back**\nA paginated envelope of collection snapshots, each with the 5 datapoints (`public_url` is the hub's page; full description on the per-collection endpoint).\n\n**Data freshness**\nRendered from the portal, refreshed regularly.","operationId":"list_collections_api_v2_interoperable_collections_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"title","title":"Order"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/interoperable/collections/{collection_key}":{"get":{"tags":["v2-interoperable"],"summary":"Interoperable Europe — one collection's footprint (description + its recent items)","description":"**What it does**\nReturns one thematic collection's snapshot plus its most recent news, events and reusable solutions.\n\n**When to use it**\n'Show me everything in OSOR / EU GovTech / SEMIC' in one call.\n\n**Input**\n`collection_key` (path; the collection slug, e.g. `open-source-observatory-osor`, `eugovtech`, `semic-support-centre`), `limit` (items per resource, max 50).\n\n**Try it**\n```\nGET /api/v2/interoperable/collections/open-source-observatory-osor\n```\n\n**You get back**\n`{collection_key, collection, recent_news, recent_events, recent_solutions}` — the collection snapshot (full body) and lists of its recent items, each with the 5 datapoints.\n\n**Data freshness**\nRendered from the portal, refreshed regularly.","operationId":"collection_footprint_api_v2_interoperable_collections__collection_key__get","parameters":[{"name":"collection_key","in":"path","required":true,"schema":{"type":"string","description":"Collection slug.","title":"Collection Key"},"description":"Collection slug."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":15,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_CollectionFootprint"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech folder directory — what EU GovTech carries","description":"**What it does**\nReturns EU GovTech (EU GovTech) with a count of stored items per resource type.\n\n**When to use it**\nA one-call overview before drilling into a specific feed.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/eugovtech\n```\n\n**You get back**\nOne body record with acronym, name, mandate, website and an `item_counts` map.\n\n**Data freshness**\nCounts are live from the database.","operationId":"_directory_api_v2_eugovtech_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_AgencyBody"},"title":"Response  Directory Api V2 Eugovtech Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/news":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — news (newest first)","description":"**What it does**\nLists EU GovTech's news, newest first. News from the EU GovTech community, including the Startups' Corner digests and the GovTech4All public-sector-challenge updates. Filter with q (e.g. a country or theme).\n\n**When to use it**\nTrack what EU GovTech is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /news?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU GovTech news listing on the Interoperable Europe Portal..","operationId":"list_ep_api_v2_eugovtech_news_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/news/{item_id}":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — one new (full body)","description":"**What it does**\nReturns one EU GovTech new in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /news/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU GovTech news listing on the Interoperable Europe Portal..","operationId":"detail_ep_api_v2_eugovtech_news__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/events":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — events (newest first)","description":"**What it does**\nLists EU GovTech's events, newest first. Conferences, webinars, hackathons and matchmaking events for the govtech ecosystem (VivaTech, Techsylvania and the community's own sessions).\n\n**When to use it**\nTrack what EU GovTech is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /events?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU GovTech events listing..","operationId":"list_ep_api_v2_eugovtech_events_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/events/{item_id}":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — one event (full body)","description":"**What it does**\nReturns one EU GovTech event in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /events/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU GovTech events listing..","operationId":"detail_ep_api_v2_eugovtech_events__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/solutions":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — reusable solutions (newest first)","description":"**What it does**\nLists EU GovTech's reusable solutions, newest first. Reusable govtech solutions and toolkits shared by the community (e.g. civic-intelligence platforms and assessment toolkits).\n\n**When to use it**\nTrack what EU GovTech is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /solutions?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU GovTech solutions listing..","operationId":"list_ep_api_v2_eugovtech_solutions_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/solutions/{item_id}":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — one reusable solution (full body)","description":"**What it does**\nReturns one EU GovTech reusable solution in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /solutions/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU GovTech solutions listing..","operationId":"detail_ep_api_v2_eugovtech_solutions__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/publications":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — publications (newest first)","description":"**What it does**\nLists EU GovTech's publications, newest first. GovTech reports, policy briefs and foresight studies from the Knowledge Centre: evidence on how govtech can modernise public administrations across the EU.\n\n**When to use it**\nTrack what EU GovTech is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /publications?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU GovTech Knowledge Centre..","operationId":"list_ep_api_v2_eugovtech_publications_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/publications/{item_id}":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — one publication (full body)","description":"**What it does**\nReturns one EU GovTech publication in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /publications/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU GovTech Knowledge Centre..","operationId":"detail_ep_api_v2_eugovtech_publications__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/topics":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — topic pages (newest first)","description":"**What it does**\nLists EU GovTech's topic pages, newest first. Standing snapshots of the EU GovTech hubs: the Welcome page, the GovTech Atlas (initiatives and startups), GovTech4All (public-sector challenges) and the Knowledge Centre landing.\n\n**When to use it**\nTrack what EU GovTech is publishing without scraping its website. Filter by free text or date, page through the archive, then call the detail endpoint for an item's full body.\n\n**Input**\n`q` free-text search, `since` / `until` (YYYY-MM-DD) on the item date, `order` (recent | oldest | title), `page`, `limit` (max 100).\n\n**Try it**\n```\nGET /topics?order=recent&limit=10\n```\n\n**You get back**\nA paginated envelope of items. Each carries the 5 datapoints. `body_txt` / `body_html` are null on the list by default — **pass `include_body=true` to get them in bulk**, or call the detail endpoint for a single item.\n\n**Data freshness**\nRefreshed from the EU GovTech hub pages (snapshots)..","operationId":"list_ep_api_v2_eugovtech_topics_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search over title, summary and body.","title":"Q"},"description":"Free-text search over title, summary and body."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/after this date (YYYY-MM-DD).","title":"Since"},"description":"Only items on/after this date (YYYY-MM-DD)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Only items on/before this date (YYYY-MM-DD).","title":"Until"},"description":"Only items on/before this date (YYYY-MM-DD)."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"recent | oldest | title.","default":"recent","title":"Order"},"description":"recent | oldest | title."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_body","in":"query","required":false,"schema":{"type":"boolean","description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed.","default":false,"title":"Include Body"},"description":"Return `body_txt` / `body_html` on every item in the list. Off by default because bodies dominate the payload, but without it the only route to the text is one detail call PER ITEM, which is not a usable way to ingest a feed."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EconomyItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/eugovtech/topics/{item_id}":{"get":{"tags":["v2-eugovtech","v2-eugovtech"],"summary":"EU GovTech — one topic page (full body)","description":"**What it does**\nReturns one EU GovTech topic page in full, including `body_txt` and `body_html`.\n\n**When to use it**\nAfter finding an item id on the list endpoint, fetch the complete record (full body + all 5 datapoints).\n\n**Input**\n`item_id` — the Brubru item id from the list endpoint.\n\n**Try it**\n```\nGET /topics/{item_id}\n```\n\n**You get back**\nA single item with the full 5-datapoint contract populated.\n\n**Data freshness**\nRefreshed from the EU GovTech hub pages (snapshots)..","operationId":"detail_ep_api_v2_eugovtech_topics__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","description":"Brubru item id from the list endpoint.","title":"Item Id"},"description":"Brubru item id from the list endpoint."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EconomyItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/programmes":{"get":{"tags":["v2-programmes","v2-programmes"],"summary":"Funding programmes directory — the whole EU funding universe at a glance","description":"**What it does**\nOne-call overview of every EU funding programme: totals and budget by managing institution, MFF heading, programme type and Brubru coverage.\n\n**When to use it**\nBefore picking a scope.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/programmes\n```\n\n**You get back**\nA summary. Then `/api/v2/programmes/all` to list/filter, `/api/v2/programmes/institutions` for the pick-list, `/api/v2/programmes/{acronym}` for one programme.\n\n**Data freshness**\nFrom the curated EU funding programmes catalogue.","operationId":"directory_api_v2_programmes_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgrammesDirectory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/programmes/all":{"get":{"tags":["v2-programmes","v2-programmes"],"summary":"All funding programmes (pick programme / institution / body)","description":"**What it does**\nThe full catalogue, filterable. Largest budget first.\n\n**When to use it**\nPick exactly the slice you want: every programme run by an institution (`institution=Joint Undertaking`), by a specific body or DG (`body=cinea`, `dg=DG CLIMA`), in an MFF heading or cluster, of a given type, or just covered ones.\n\n**Input**\n`institution` (European Commission | Joint Undertaking | Member States | EEAS, substring ok), `body` (managing body or Brubru body code, e.g. cinea / hadea / hydrogen), `dg`, `heading`, `cluster`, `type` (grants | financial-instrument | blended | procurement | prize), `coverage` (covered | gap | skipped), `q` (free text), `order` (budget | name | heading), `page`, `limit`.\n\n**Try it**\n```\nGET /api/v2/programmes/all?institution=Joint Undertaking\nGET /api/v2/programmes/all?body=cinea\nGET /api/v2/programmes/all?heading=Cohesion&type=grants\n```\n\n**You get back**\nA paginated envelope of programmes, each with institution, managing body, DG, type, period, indicative budget, the apply portal and Brubru's data endpoint where covered.\n\n**Data freshness**\nCurated catalogue; budgets are indicative 2021-2027 headline allocations.","operationId":"list_programmes_api_v2_programmes_all_get","parameters":[{"name":"institution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Managing institution (substring).","title":"Institution"},"description":"Managing institution (substring)."},{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Managing body or Brubru body code (substring).","title":"Body"},"description":"Managing body or Brubru body code (substring)."},{"name":"dg","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Responsible Directorate-General (substring).","title":"Dg"},"description":"Responsible Directorate-General (substring)."},{"name":"heading","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MFF heading (substring).","title":"Heading"},"description":"MFF heading (substring)."},{"name":"cluster","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cluster (substring).","title":"Cluster"},"description":"Cluster (substring)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Programme type.","title":"Type"},"description":"Programme type."},{"name":"coverage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"covered | gap | skipped.","title":"Coverage"},"description":"covered | gap | skipped."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search.","title":"Q"},"description":"Free-text search."},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"budget | name | heading.","default":"budget","title":"Order"},"description":"budget | name | heading."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Programme_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/programmes/institutions":{"get":{"tags":["v2-programmes","v2-programmes"],"summary":"Pick-list: institutions, managing bodies and DGs with programme counts","description":"**What it does**\nThe discovery endpoint for the `institution`, `body` and `dg` filters: every managing institution, body and DG that runs a programme, with counts and total budget.\n\n**When to use it**\nTo build an institution/body picker, or to see who runs what.\n\n**Input**\nNo parameters.\n\n**Try it**\n```\nGET /api/v2/programmes/institutions\n```\n\n**You get back**\n`{institutions: [...], bodies: [...], dgs: [...]}`.\n\n**Data freshness**\nCurated catalogue.","operationId":"institutions_facet_api_v2_programmes_institutions_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Institutions Facet Api V2 Programmes Institutions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/programmes/{acronym}":{"get":{"tags":["v2-programmes","v2-programmes"],"summary":"One funding programme (full record)","description":"**What it does**\nReturns one programme in full: managing institution/body, DG, type, period, indicative budget, the apply portal and Brubru's data endpoint.\n\n**When to use it**\nAfter finding an acronym on `/api/v2/programmes/all`.\n\n**Input**\n`acronym` — the programme acronym (e.g. `Horizon Europe`, `LIFE`, `Clean Hydrogen`).\n\n**Try it**\n```\nGET /api/v2/programmes/LIFE\n```\n\n**You get back**\nA single programme record.\n\n**Data freshness**\nCurated catalogue.","operationId":"get_programme_api_v2_programmes__acronym__get","parameters":[{"name":"acronym","in":"path","required":true,"schema":{"type":"string","description":"Programme acronym.","title":"Acronym"},"description":"Programme acronym."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Programme"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/extract":{"get":{"tags":["v2-extract","v2-extract"],"summary":"Extract structured items from any EU URL","description":"**What it does**\nGive it any EU institutional listing URL (news, events, publications, consultations). It detects which of the 8 EU web platforms the page is built on, fetches it through the matching anti-bot path (plain request, or a headless browser for JS-rendered / walled sites), and returns structured 5-datapoint items.\n\n**When to use it**\nWhen you want the structured data behind an EU page without writing a scraper for it. One endpoint covers the whole EU estate.\n\n**Input**\n`url` (required), `item_type` (news | event | publication | topic | consultation | tender; default news), `limit` (max 100).\n\n**Try it**\n```\nGET /api/v2/extract?url=https://cinea.ec.europa.eu/news-events/news_en\n```\n\n**You get back**\nThe detected platform, how it was fetched, and the extracted items (title, public_url, document_date, summary, the 5-datapoint shape).\n\n**Data freshness**\nLive — fetched at request time.","operationId":"extract_url_api_v2_extract_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The EU URL to extract.","title":"Url"},"description":"The EU URL to extract."},{"name":"item_type","in":"query","required":false,"schema":{"type":"string","description":"news | event | publication | topic | consultation | tender.","default":"news","title":"Item Type"},"description":"news | event | publication | topic | consultation | tender."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"description":"Max items (<=60 so every returned item is fully enriched in the default full-contract mode).","default":30,"title":"Limit"},"description":"Max items (<=60 so every returned item is fully enriched in the default full-contract mode)."},{"name":"classify","in":"query","required":false,"schema":{"type":"boolean","description":"Also tag each item with EuroVoc subject descriptors (slower).","default":false,"title":"Classify"},"description":"Also tag each item with EuroVoc subject descriptors (slower)."},{"name":"shallow","in":"query","required":false,"schema":{"type":"boolean","description":"Fast listing-only: skip the per-item detail fetches, so body_txt/body_html and some dates are left empty. Default is the full contract (each item's body + date filled from its detail page).","default":false,"title":"Shallow"},"description":"Fast listing-only: skip the per-item detail fetches, so body_txt/body_html and some dates are left empty. Default is the full contract (each item's body + date filled from its detail page)."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language for EuroVoc classification (en|es|fr|it|nl; ca->es).","default":"en","title":"Lang"},"description":"Language for EuroVoc classification (en|es|fr|it|nl; ca->es)."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"format","in":"query","required":false,"description":"Response format. Omit or 'json' for JSON; 'csv' or 'xlsx' downloads the list as a CSV / Excel spreadsheet (all fields auto-flattened).","schema":{"type":"string","enum":["json","csv","xlsx"],"default":"json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActionLinkResponse":{"properties":{"label":{"type":"string","title":"Label"},"path":{"type":"string","title":"Path"},"rationale":{"type":"string","title":"Rationale","default":""}},"type":"object","required":["label","path"],"title":"ActionLinkResponse"},"AdminTenderStats":{"properties":{"total_tenders":{"type":"integer","title":"Total Tenders"},"open_tenders":{"type":"integer","title":"Open Tenders"},"closed_tenders":{"type":"integer","title":"Closed Tenders"},"awarded_tenders":{"type":"integer","title":"Awarded Tenders"},"tenders_this_week":{"type":"integer","title":"Tenders This Week"},"tenders_by_country":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tenders By Country"},"tenders_by_sector":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tenders By Sector"},"average_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Value"},"total_profiles":{"type":"integer","title":"Total Profiles"},"active_profiles":{"type":"integer","title":"Active Profiles"},"total_matches":{"type":"integer","title":"Total Matches"},"saved_matches":{"type":"integer","title":"Saved Matches"},"fetch_jobs_count":{"type":"integer","title":"Fetch Jobs Count"},"last_fetch_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetch At"}},"type":"object","required":["total_tenders","open_tenders","closed_tenders","awarded_tenders","tenders_this_week","tenders_by_country","tenders_by_sector","average_value","total_profiles","active_profiles","total_matches","saved_matches","fetch_jobs_count","last_fetch_at"],"title":"AdminTenderStats","description":"Admin statistics response."},"AgendaItemOut":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing URL on commission.europa.eu for the event detail page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body of the event detail page. Typically null for this endpoint because commission.europa.eu calendar detail URLs 301-redirect to Drupal admin paths (/node/NNNN/edit_en) that return 403 to anonymous traffic. The title + location are the richest body-equivalent currently reachable; we publish them as separate fields rather than synthesising a fake body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body of the event detail page. Same upstream limit as body_text — typically null for this endpoint."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Start Date","description":"The event date (same value as the legacy `date` field, surfaced as the canonical meeting_start_date for the uniform v1 datapoint set)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first observed this agenda item (commission_calendar_urls.first_seen_at)."},"date":{"type":"string","format":"date","title":"Date"},"title":{"type":"string","title":"Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"detail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail Url"}},"type":"object","required":["date","title"],"title":"AgendaItemOut"},"AgreementTypeCount":{"properties":{"agreement_type":{"type":"string","title":"Agreement Type"},"in_force":{"type":"integer","title":"In Force"},"historical":{"type":"integer","title":"Historical"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["agreement_type","in_force","historical","total"],"title":"AgreementTypeCount"},"AiAssistRequest":{"properties":{"action":{"type":"string","title":"Action"},"text":{"type":"string","title":"Text"},"doc_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Title"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language"}},"type":"object","required":["action","text"],"title":"AiAssistRequest"},"AlertSubscriptionBase":{"properties":{"label":{"type":"string","maxLength":200,"minLength":1,"title":"Label"},"query_phrase":{"type":"string","maxLength":500,"minLength":1,"title":"Query Phrase"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"delivery":{"items":{"type":"string"},"type":"array","title":"Delivery"},"exclude_terms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Terms"},"language_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language Codes"},"priority_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority Override"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["label","query_phrase"],"title":"AlertSubscriptionBase"},"AlertSubscriptionResponse":{"properties":{"label":{"type":"string","maxLength":200,"minLength":1,"title":"Label"},"query_phrase":{"type":"string","maxLength":500,"minLength":1,"title":"Query Phrase"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"delivery":{"items":{"type":"string"},"type":"array","title":"Delivery"},"exclude_terms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Terms"},"language_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language Codes"},"priority_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority Override"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"last_match_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Match At"},"last_match_count":{"type":"integer","title":"Last Match Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["label","query_phrase","id","user_id","created_at","updated_at"],"title":"AlertSubscriptionResponse"},"AlignmentScoreItem":{"properties":{"mep_amendment_id":{"type":"string","format":"uuid","title":"Mep Amendment Id"},"score":{"type":"integer","maximum":2.0,"minimum":-2.0,"title":"Score"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"author_names":{"items":{"type":"string"},"type":"array","title":"Author Names"},"political_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group"},"element_reference":{"type":"string","title":"Element Reference"},"amendment_type":{"type":"string","title":"Amendment Type"}},"type":"object","required":["mep_amendment_id","score","element_reference","amendment_type"],"title":"AlignmentScoreItem","description":"A single alignment score with amendment metadata."},"AlignmentScoreRequest":{"properties":{"policy_position":{"type":"string","maxLength":5000,"minLength":10,"title":"Policy Position","description":"Natural language description of the user's policy position"}},"type":"object","required":["policy_position"],"title":"AlignmentScoreRequest","description":"Request to score MEP amendments against a policy position."},"AlignmentScoreResponse":{"properties":{"procedure_reference":{"type":"string","title":"Procedure Reference"},"policy_position_hash":{"type":"string","title":"Policy Position Hash"},"total_scored":{"type":"integer","title":"Total Scored"},"score_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Score Distribution","description":"Score counts: {'-2': 5, '-1': 10, '0': 50, '1': 30, '2': 15}"},"scores":{"items":{"$ref":"#/components/schemas/AlignmentScoreItem"},"type":"array","title":"Scores"}},"type":"object","required":["procedure_reference","policy_position_hash","total_scored","scores"],"title":"AlignmentScoreResponse","description":"Full alignment scoring result."},"AmendmentBatchCreate":{"properties":{"document_id":{"type":"string","title":"Document Id","description":"ID of the source document"},"document_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Filename","description":"Filename of the source document"},"amendments":{"items":{"$ref":"#/components/schemas/AmendmentCreate"},"type":"array","title":"Amendments","description":"List of amendments to create"}},"type":"object","required":["document_id","amendments"],"title":"AmendmentBatchCreate","description":"Schema for creating multiple amendments at once"},"AmendmentCreate":{"properties":{"document_id":{"type":"string","title":"Document Id","description":"ID of the source document"},"document_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Filename","description":"Filename of the source document"},"element_index":{"type":"integer","title":"Element Index","description":"Index of the element in the legislative structure"},"element_type":{"type":"string","title":"Element Type","description":"Type of legislative element (recital, article, etc.)"},"element_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Number","description":"Number or letter of the element"},"position_text":{"type":"string","title":"Position Text","description":"Human-readable position (e.g., 'Recital 15')"},"amendment_type":{"type":"string","title":"Amendment Type","description":"Type of amendment (suppression, addition, modification)"},"original_text":{"type":"string","title":"Original Text","description":"Original text of the element"},"proposed_text":{"type":"string","title":"Proposed Text","description":"Proposed text for the amendment"},"insert_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Insert After","description":"For additions: element index to insert after"},"justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Justification","description":"Justification for the amendment"},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Label","description":"Political group or committee label"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author","description":"Author of the amendment"},"amendment_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Number","description":"Amendment number (e.g., 'AM 1')"},"status":{"type":"string","title":"Status","description":"Status of the amendment","default":"draft"}},"type":"object","required":["document_id","element_index","element_type","position_text","amendment_type","original_text","proposed_text"],"title":"AmendmentCreate","description":"Schema for creating a new amendment"},"AmendmentDocumentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AmendmentDocumentResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"AmendmentDocumentListResponse","description":"List of amendment documents for a procedure."},"AmendmentDocumentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"procedure_reference":{"type":"string","title":"Procedure Reference"},"committee_code":{"type":"string","title":"Committee Code"},"pe_reference":{"type":"string","title":"Pe Reference"},"document_type":{"type":"string","title":"Document Type"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"doceo_url":{"type":"string","title":"Doceo Url"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"total_amendments":{"type":"integer","title":"Total Amendments","default":0},"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"}},"type":"object","required":["id","procedure_reference","committee_code","pe_reference","document_type","doceo_url","status"],"title":"AmendmentDocumentResponse","description":"Metadata about a parsed EP amendment document."},"AmendmentDrilldownResponse":{"properties":{"carriage_id":{"type":"string","format":"uuid","title":"Carriage Id"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"articles":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Articles"}},"type":"object","required":["carriage_id","procedure_ref","articles"],"title":"AmendmentDrilldownResponse"},"AmendmentFetchRequest":{"properties":{"force_refetch":{"type":"boolean","title":"Force Refetch","description":"Re-fetch and re-parse even if documents already exist","default":false}},"type":"object","title":"AmendmentFetchRequest","description":"Request to trigger amendment fetching for a procedure."},"AmendmentFetchResponse":{"properties":{"procedure_reference":{"type":"string","title":"Procedure Reference"},"documents_found":{"type":"integer","title":"Documents Found"},"documents_parsed":{"type":"integer","title":"Documents Parsed"},"amendments_stored":{"type":"integer","title":"Amendments Stored"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0.0}},"type":"object","required":["procedure_reference","documents_found","documents_parsed","amendments_stored"],"title":"AmendmentFetchResponse","description":"Response after triggering amendment fetch."},"AmendmentItem":{"properties":{"id":{"type":"string","title":"Id"},"procedure_reference":{"type":"string","title":"Procedure Reference"},"committee_code":{"type":"string","title":"Committee Code"},"pe_reference":{"type":"string","title":"Pe Reference"},"amendment_number":{"type":"integer","title":"Amendment Number"},"author_names":{"items":{},"type":"array","title":"Author Names"},"political_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group"},"on_behalf_of_group":{"type":"boolean","title":"On Behalf Of Group","default":false},"element_type":{"type":"string","title":"Element Type"},"element_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Number"},"element_reference":{"type":"string","title":"Element Reference"},"amendment_type":{"type":"string","title":"Amendment Type"},"original_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Text"},"proposed_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposed Text"},"justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Justification"},"source_url":{"type":"string","title":"Source Url"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"}},"type":"object","required":["id","procedure_reference","committee_code","pe_reference","amendment_number","element_type","element_reference","amendment_type","source_url"],"title":"AmendmentItem"},"AmendmentListResponse":{"properties":{"amendments":{"items":{"$ref":"#/components/schemas/AmendmentResponse"},"type":"array","title":"Amendments"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["amendments","total","page","page_size"],"title":"AmendmentListResponse","description":"Schema for listing amendments with pagination"},"AmendmentResponse":{"properties":{"document_id":{"type":"string","title":"Document Id","description":"ID of the source document"},"document_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Filename","description":"Filename of the source document"},"element_index":{"type":"integer","title":"Element Index","description":"Index of the element in the legislative structure"},"element_type":{"type":"string","title":"Element Type","description":"Type of legislative element (recital, article, etc.)"},"element_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Number","description":"Number or letter of the element"},"position_text":{"type":"string","title":"Position Text","description":"Human-readable position (e.g., 'Recital 15')"},"amendment_type":{"type":"string","title":"Amendment Type","description":"Type of amendment (suppression, addition, modification)"},"original_text":{"type":"string","title":"Original Text","description":"Original text of the element"},"proposed_text":{"type":"string","title":"Proposed Text","description":"Proposed text for the amendment"},"insert_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Insert After","description":"For additions: element index to insert after"},"justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Justification","description":"Justification for the amendment"},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Label","description":"Political group or committee label"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author","description":"Author of the amendment"},"amendment_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Number","description":"Amendment number (e.g., 'AM 1')"},"status":{"type":"string","title":"Status","description":"Status of the amendment","default":"draft"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["document_id","element_index","element_type","position_text","amendment_type","original_text","proposed_text","id","user_id","created_at","updated_at"],"title":"AmendmentResponse","description":"Schema for amendment API responses"},"AmendmentStats":{"properties":{"total":{"type":"integer","title":"Total"},"by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status"},"by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Type"},"by_document":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Document"}},"type":"object","required":["total","by_status","by_type","by_document"],"title":"AmendmentStats","description":"Statistics about user's amendments"},"AmendmentStatsResponse":{"properties":{"procedure_reference":{"type":"string","title":"Procedure Reference"},"total_amendments":{"type":"integer","title":"Total Amendments"},"total_documents":{"type":"integer","title":"Total Documents"},"committees":{"items":{"type":"string"},"type":"array","title":"Committees"},"rapporteur":{"anyOf":[{"$ref":"#/components/schemas/RapporteurInfo"},{"type":"null"}]},"by_group":{"items":{"$ref":"#/components/schemas/GroupAmendmentCount"},"type":"array","title":"By Group"},"by_element":{"items":{"$ref":"#/components/schemas/ElementAmendmentCount"},"type":"array","title":"By Element"},"by_type":{"items":{"$ref":"#/components/schemas/TypeAmendmentCount"},"type":"array","title":"By Type"},"top_authors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Authors","description":"Top MEPs by amendment count: [{name, group, count}]"}},"type":"object","required":["procedure_reference","total_amendments","total_documents","committees","by_group","by_element","by_type"],"title":"AmendmentStatsResponse","description":"Aggregated statistics for amendments on a procedure."},"AmendmentUpdate":{"properties":{"element_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Element Index"},"element_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Type"},"element_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Number"},"position_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Text"},"amendment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Type"},"original_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Text"},"proposed_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposed Text"},"insert_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Insert After"},"justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Justification"},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Label"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"amendment_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Number"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"AmendmentUpdate","description":"Schema for updating an existing amendment"},"AnalyseArticleRequest":{"properties":{"article_text":{"type":"string","minLength":1,"title":"Article Text","description":"Text of the article to analyse"},"article_position":{"type":"string","title":"Article Position","description":"Position reference, e.g. 'Article 5'"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX of the loaded law, for drafting context"}},"type":"object","required":["article_text","article_position"],"title":"AnalyseArticleRequest","description":"Request to analyse an article for amendment opportunities"},"AnalyseArticleResponse":{"properties":{"analysis":{"type":"string","title":"Analysis"},"ai_provider":{"type":"string","title":"Ai Provider"},"ai_model":{"type":"string","title":"Ai Model"}},"type":"object","required":["analysis","ai_provider","ai_model"],"title":"AnalyseArticleResponse","description":"Response containing an AI analysis of an article"},"AnalysisResponse":{"properties":{"consultation_id":{"type":"string","format":"uuid","title":"Consultation Id"},"executive_summary":{"type":"string","title":"Executive Summary"},"key_questions":{"items":{"type":"string"},"type":"array","title":"Key Questions"},"stakeholder_categories":{"items":{"type":"string"},"type":"array","title":"Stakeholder Categories"},"submission_requirements":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submission Requirements"},"legislation_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legislation Context"},"key_provisions_under_review":{"items":{"type":"string"},"type":"array","title":"Key Provisions Under Review","default":[]},"potential_impacts":{"items":{"type":"string"},"type":"array","title":"Potential Impacts","default":[]},"recommended_focus_areas":{"items":{"type":"string"},"type":"array","title":"Recommended Focus Areas","default":[]},"confidence_score":{"type":"number","title":"Confidence Score"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["consultation_id","executive_summary","key_questions","stakeholder_categories","confidence_score","generated_at"],"title":"AnalysisResponse","description":"AI analysis response model."},"AnnotateTextRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"texts":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Texts"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"include_aliases":{"type":"boolean","title":"Include Aliases","default":true}},"type":"object","title":"AnnotateTextRequest","description":"Annotate a paragraph (or list of paragraphs) with cross-references, law\naliases and defined-term spans.\n\n- If `celex` is provided, defined terms from that law are wrapped in\n  <span class=\"defined-term\" title=\"...\">.\n- Cross-references (\"Article 7 of Regulation (EU) 2024/1234\") and aliases\n  (GDPR, DSA, AI Act) are always wrapped unless `include_aliases=false`."},"ArchiveResponse":{"properties":{"archived":{"type":"boolean","title":"Archived"},"entity_type":{"type":"string","title":"Entity Type"},"track_id":{"type":"string","title":"Track Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"archived_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archived Reason"}},"type":"object","required":["archived","entity_type","track_id","archived_at","archived_reason"],"title":"ArchiveResponse"},"ArchivedItem":{"properties":{"track_id":{"type":"string","title":"Track Id"},"entity_type":{"type":"string","title":"Entity Type"},"archived_at":{"type":"string","format":"date-time","title":"Archived At"},"archived_reason":{"type":"string","title":"Archived Reason"}},"type":"object","required":["track_id","entity_type","archived_at","archived_reason"],"title":"ArchivedItem"},"AutoTopupRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold_eur":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":0.0},{"type":"null"}],"title":"Threshold Eur"},"amount_eur":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":1.0},{"type":"null"}],"title":"Amount Eur"}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"AutoTopupRequest"},"AutoTopupResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold Eur"},"amount_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Eur"}},"type":"object","required":["enabled","threshold_eur","amount_eur"],"title":"AutoTopupResponse"},"BalanceResponse":{"properties":{"balance_eur":{"type":"number","title":"Balance Eur"},"balance_eur_micro":{"type":"integer","title":"Balance Eur Micro"},"auto_topup":{"$ref":"#/components/schemas/AutoTopupResponse"},"recent_usage":{"items":{"$ref":"#/components/schemas/UsageRow"},"type":"array","title":"Recent Usage"},"recent_topups":{"items":{"$ref":"#/components/schemas/TopupRow"},"type":"array","title":"Recent Topups"}},"type":"object","required":["balance_eur","balance_eur_micro","auto_topup","recent_usage","recent_topups"],"title":"BalanceResponse"},"BatchSuggestionItem":{"properties":{"element_position":{"type":"string","title":"Element Position","description":"Which element this applies to, e.g. 'Article 5'"},"amendment_type":{"type":"string","title":"Amendment Type","description":"modification, suppression, or addition"},"original_text":{"type":"string","title":"Original Text","description":"Original text of the element"},"proposed_text":{"type":"string","title":"Proposed Text","description":"AI-proposed amended text"},"justification":{"type":"string","title":"Justification","description":"Why this amendment serves the policy goal"},"element_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Element Index","description":"Index of the target element in the full loaded document"},"validation":{"anyOf":[{"$ref":"#/components/schemas/SuggestionValidation"},{"type":"null"}],"description":"Deterministic fidelity check results"}},"type":"object","required":["element_position","amendment_type","original_text","proposed_text","justification"],"title":"BatchSuggestionItem","description":"A single AI-generated amendment suggestion"},"BatchSuggestionRequest":{"properties":{"policy_position":{"type":"string","title":"Policy Position","description":"User's policy goals or position"},"supporting_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supporting Context","description":"Extracted text from uploaded supporting documents"},"elements":{"items":{"$ref":"#/components/schemas/ElementSummary"},"type":"array","title":"Elements","description":"Key legislative elements to analyse"},"max_suggestions":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Suggestions","description":"Maximum suggestions (determined by subscription tier if not set)"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX of the loaded law, used to inject drafting context"},"known_article_numbers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Known Article Numbers","description":"All article numbers in the loaded document, for phantom-reference detection"}},"type":"object","required":["policy_position","elements"],"title":"BatchSuggestionRequest","description":"Request for document-wide AI amendment suggestions"},"BatchSuggestionResponse":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/BatchSuggestionItem"},"type":"array","title":"Suggestions"},"ai_provider":{"type":"string","title":"Ai Provider"},"ai_model":{"type":"string","title":"Ai Model"}},"type":"object","required":["suggestions","ai_provider","ai_model"],"title":"BatchSuggestionResponse","description":"Response containing multiple AI amendment suggestions"},"BlockedFileAlert":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"title":{"type":"string","title":"Title"},"train_name":{"type":"string","title":"Train Name"},"status":{"$ref":"#/components/schemas/CarriageStatus"},"days_blocked":{"type":"integer","title":"Days Blocked"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"blocking_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocking Reason"},"alert_severity":{"type":"string","title":"Alert Severity","description":"low, medium, high"}},"type":"object","required":["carriage_id","title","train_name","status","days_blocked","alert_severity"],"title":"BlockedFileAlert","description":"Alert for blocked legislative file"},"BlockingCoalitionResponse":{"properties":{"has_blocking_minority":{"type":"boolean","title":"Has Blocking Minority"},"risk_level":{"type":"string","title":"Risk Level"},"current_blocking_states":{"items":{"type":"string"},"type":"array","title":"Current Blocking States"},"current_blocking_population_pct":{"type":"number","title":"Current Blocking Population Pct"},"potential_coalitions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Potential Coalitions"},"swing_states":{"items":{"type":"string"},"type":"array","title":"Swing States"}},"type":"object","required":["has_blocking_minority","risk_level","current_blocking_states","current_blocking_population_pct","potential_coalitions","swing_states"],"title":"BlockingCoalitionResponse","description":"Blocking coalition analysis."},"Body_create_compliance_analysis_api_eu_law_comply_analyze_post":{"properties":{"cluster_id":{"type":"integer","title":"Cluster Id"},"documents":{"items":{"type":"string","format":"binary"},"type":"array","title":"Documents","default":[]},"reuse_document_ids":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reuse Document Ids"},"analysis_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analysis Name"}},"type":"object","required":["cluster_id"],"title":"Body_create_compliance_analysis_api_eu_law_comply_analyze_post"},"Body_generate_minutes_summary_api_transcripts_minutes_summary_post":{"properties":{"pdf_url":{"type":"string","title":"Pdf Url","description":"The minutes PDF URL"}},"type":"object","required":["pdf_url"],"title":"Body_generate_minutes_summary_api_transcripts_minutes_summary_post"},"Body_login_api_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"password"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_auth_login_post"},"Body_unsubscribe_daily_brief_api_daily_brief_unsubscribe_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_unsubscribe_daily_brief_api_daily_brief_unsubscribe_post"},"Body_upload_asset_api_documents_assets_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_asset_api_documents_assets_post"},"Body_upload_document_api_documents_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_documents_upload_post"},"BrandingBlock":{"properties":{"organisation_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Organisation Name"},"organisation_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Organisation Url"},"contact_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Contact Phone"},"transparency_register_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Transparency Register Id"},"logo_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Logo Storage Id","description":"storage_document_id returned by /api/documents/upload"}},"type":"object","title":"BrandingBlock","description":"Organisation branding to render in DOCX/PDF/PPTX exports."},"BriefItem":{"properties":{"headline":{"type":"string","title":"Headline"},"url":{"type":"string","title":"Url"},"source":{"type":"string","title":"Source"},"category":{"type":"string","title":"Category"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"suggested_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Query"}},"type":"object","required":["headline","url","source","category"],"title":"BriefItem"},"BriefRequest":{"properties":{"opportunity_id":{"type":"string","title":"Opportunity Id"}},"type":"object","required":["opportunity_id"],"title":"BriefRequest","description":"Request body for the AI-generated tender brief."},"BrubruCuration":{"properties":{"curated":{"type":"boolean","title":"Curated","default":true},"as_of":{"type":"string","title":"As Of","description":"Date this overlay was last verified (ISO)."},"headline":{"type":"string","title":"Headline"},"editorial_summary":{"type":"string","title":"Editorial Summary"},"plain_status":{"type":"string","title":"Plain Status"},"deep_dive":{"additionalProperties":true,"type":"object","title":"Deep Dive","description":"Language-code -> Brubru deep-dive URL."},"key_facts":{"items":{"$ref":"#/components/schemas/CuratedKeyFact"},"type":"array","title":"Key Facts"},"lead_committee":{"anyOf":[{"$ref":"#/components/schemas/CuratedActor"},{"type":"null"}]},"opinion_committees":{"items":{"$ref":"#/components/schemas/CuratedActor"},"type":"array","title":"Opinion Committees"},"shadow_rapporteurs":{"items":{"$ref":"#/components/schemas/CuratedShadow"},"type":"array","title":"Shadow Rapporteurs"},"committee_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Notes"},"timeline_highlights":{"items":{"$ref":"#/components/schemas/CuratedEvent"},"type":"array","title":"Timeline Highlights"},"key_debates":{"items":{"$ref":"#/components/schemas/CuratedDebate"},"type":"array","title":"Key Debates"},"political_dynamics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Dynamics"},"related_procedures":{"items":{"$ref":"#/components/schemas/CuratedRelatedProcedure"},"type":"array","title":"Related Procedures"},"sources":{"items":{"$ref":"#/components/schemas/CuratedLink"},"type":"array","title":"Sources"},"attribution":{"type":"string","title":"Attribution"}},"type":"object","required":["as_of","headline","editorial_summary","plain_status","attribution"],"title":"BrubruCuration","description":"Hand-verified Brubru editorial overlay for a single procedure."},"BrusselsLobby":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"EU Transparency Register detail page for the organisation."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text profile composition."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML profile composition."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the organisation's most recent news item."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this profile row."},"identification_code":{"type":"string","title":"Identification Code","description":"EU Transparency Register identification code."},"original_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Name","description":"Registered organisation name."},"acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acronym"},"org_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Type","description":"Normalised type: ngo / trade_association / company / think_tank / consultancy / law_firm / trade_union / academic / religious / public_authority / third_country / self_employed / other."},"eutr_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eutr Section","description":"Official EUTR section (I–VI)."},"registration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Category","description":"Raw EUTR registration category."},"for_profit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"For Profit"},"is_global_corp":{"type":"boolean","title":"Is Global Corp","description":"Multinational whose website newsroom is likely global PR, not EU-affairs news.","default":false},"office_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office Basis","description":"Why it is Brussels-based: eu_office / head_office / both."},"head_office_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office City"},"head_office_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Country"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"has_org_data":{"type":"boolean","title":"Has Org Data","description":"Register profile data is present (always true).","default":true},"has_news_data":{"type":"boolean","title":"Has News Data","description":"The organisation publishes discoverable news/updates.","default":false},"news_status":{"type":"string","title":"News Status","description":"active / none / blocked / error / unknown.","default":"unknown"},"news_source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"News Source Kind","description":"rss / atom / sitemap / html."},"news_feed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"News Feed Url","description":"Discovered feed or news-index URL."},"last_item_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Item Date","description":"Timestamp of the most recent news item."},"item_count":{"type":"integer","title":"Item Count","description":"Number of news items stored for this org.","default":0},"ep_accredited_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ep Accredited Number"},"members_fte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Members Fte"},"costs_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Costs Max","description":"Upper bound of declared annual lobbying costs (EUR)."},"interests":{"items":{"type":"string"},"type":"array","title":"Interests","description":"Declared policy areas of interest."}},"type":"object","required":["identification_code"],"title":"BrusselsLobby"},"BulkSyncRequest":{"properties":{"years":{"items":{"type":"integer"},"type":"array","title":"Years","description":"Years to fetch documents for"},"work_types":{"items":{"type":"string"},"type":"array","title":"Work Types","description":"EP Open Data work types to fetch"},"force_refetch":{"type":"boolean","title":"Force Refetch","description":"Re-parse documents even if already parsed","default":false}},"type":"object","title":"BulkSyncRequest","description":"Request to trigger bulk amendment sync from EP Open Data API."},"CAPPaymentItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the fund's Cohesion Open Data page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The programme's status / adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the row."},"id":{"type":"integer","title":"Id","description":"Stable Brubru row id (use it on the detail endpoint)."},"fund":{"type":"string","title":"Fund"},"ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ms"},"planned_eu_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Planned Eu Amount"},"net_pre_financing":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Pre Financing"},"net_interim_payments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Interim Payments"},"total_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Eur"},"payment_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Payment Rate"},"fy_2023":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fy 2023"},"fy_2024":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fy 2024"},"fy_2025":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fy 2025"},"fy_2026":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fy 2026"},"fy_2027":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fy 2027"}},"type":"object","required":["id","fund"],"title":"CAPPaymentItem"},"CalendarEventListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"events":{"items":{"$ref":"#/components/schemas/CalendarEventResponse"},"type":"array","title":"Events"}},"type":"object","required":["total","events"],"title":"CalendarEventListResponse","description":"Paginated list of calendar events."},"CalendarEventResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"institution":{"$ref":"#/components/schemas/InstitutionType"},"event_type":{"$ref":"#/components/schemas/EventType"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"start_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"End Time"},"all_day":{"type":"boolean","title":"All Day","default":true},"council_configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"},"ep_activity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Activity Type"},"ep_committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Committee Code"},"commission_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commission Dg"},"policy_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Policy Areas","default":[]},"status":{"$ref":"#/components/schemas/EventStatus","default":"scheduled"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"agenda_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Url"},"procedure_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Procedure Refs","default":[]},"related_documents":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Related Documents","default":{}},"source":{"type":"string","title":"Source"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"emeeting_agendas":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Emeeting Agendas"}},"type":"object","required":["id","institution","event_type","title","start_date","source"],"title":"CalendarEventResponse","description":"Full calendar event for API responses."},"CalendarEventV2":{"properties":{"id":{"type":"string","title":"Id"},"institution":{"type":"string","title":"Institution"},"event_type":{"type":"string","title":"Event Type"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"all_day":{"type":"boolean","title":"All Day","default":true},"council_configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"},"ep_activity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Activity Type"},"ep_committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Committee Code"},"commission_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commission Dg"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"procedure_refs":{"items":{},"type":"array","title":"Procedure Refs"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"agenda_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Url"},"webstream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webstream Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","institution","event_type","title","start_date"],"title":"CalendarEventV2"},"CalendarRangeResponse":{"properties":{"date_from":{"type":"string","format":"date","title":"Date From"},"date_to":{"type":"string","format":"date","title":"Date To"},"total":{"type":"integer","title":"Total"},"events":{"items":{"$ref":"#/components/schemas/CalendarEventResponse"},"type":"array","title":"Events"}},"type":"object","required":["date_from","date_to","total","events"],"title":"CalendarRangeResponse","description":"All events in a date range (no pagination, for calendar views)."},"CandidateItem":{"properties":{"id":{"type":"string","title":"Id"},"source_id":{"type":"string","title":"Source Id"},"institution":{"type":"string","title":"Institution"},"bucket":{"type":"string","title":"Bucket"},"kind":{"type":"string","title":"Kind"},"item_url":{"type":"string","title":"Item Url"},"item_title":{"type":"string","title":"Item Title"},"item_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Summary"},"item_published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Item Published At"},"scraped_at":{"type":"string","format":"date-time","title":"Scraped At"},"relevance_score":{"type":"integer","title":"Relevance Score"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","default":{}}},"type":"object","required":["id","source_id","institution","bucket","kind","item_url","item_title","scraped_at","relevance_score"],"title":"CandidateItem"},"CandidatesResponse":{"properties":{"audience":{"type":"string","title":"Audience"},"window_hours":{"type":"integer","title":"Window Hours"},"bucket":{"type":"string","title":"Bucket"},"min_relevance":{"type":"integer","title":"Min Relevance"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/CandidateItem"},"type":"array","title":"Items"}},"type":"object","required":["audience","window_hours","bucket","min_relevance","total","items"],"title":"CandidatesResponse"},"CanonReport":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical report URL (the English/index page)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — null on lists; populated on detail when include_body=true."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body — null on lists; populated on detail when include_body=true."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The underlying act's publication date (canon only); null for deep-dives."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated this report (null — reports are not per-row timestamped)."},"slug":{"type":"string","title":"Slug","description":"Stable report slug (e.g. '2024-1689_aiact', 'biotech-act')."},"report_type":{"type":"string","title":"Report Type","description":"'canon' (EU Canon, /eucanon/) or 'deep_dive' (law deep-dive)."},"title":{"type":"string","title":"Title","description":"Report title (English)."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"One-paragraph summary (the page meta description)."},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX of the act the report explains (canon entries; null for thematic deep-dives)."},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type","description":"Document type of the underlying act (e.g. Regulation)."},"legal_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Family","description":"Brubru legal-family cluster tag (drives cross-linking)."},"languages":{"items":{"type":"string"},"type":"array","title":"Languages","description":"Languages this report is published in (en/es/ca/fr/it/nl)."},"lang_urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Lang Urls","description":"Per-language public URL map."},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url","description":"EUR-Lex landing page for the underlying act (canon entries)."}},"type":"object","required":["slug","report_type","title"],"title":"CanonReport","description":"One Brubru deep-dive report (EU Canon entry or law deep-dive)."},"CarriageListResponse":{"properties":{"carriages":{"items":{"$ref":"#/components/schemas/LegislativeCarriage"},"type":"array","title":"Carriages"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"$ref":"#/components/schemas/CarriageSearchFilters"}},"type":"object","required":["carriages","total","limit","offset","filters_applied"],"title":"CarriageListResponse","description":"Response for carriage list endpoint"},"CarriageSearchFilters":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"train_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Train Id"},"package_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Slug"},"status":{"anyOf":[{"$ref":"#/components/schemas/CarriageStatus"},{"type":"null"}]},"committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"},"text_type":{"anyOf":[{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TextType"},{"type":"null"}]},"is_blocked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Blocked"},"is_recently_updated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Recently Updated"},"has_eprs_briefings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Eprs Briefings"},"ec_priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ec Priority"},"limit":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Limit","default":50},"offset":{"type":"integer","minimum":0.0,"title":"Offset","default":0}},"type":"object","title":"CarriageSearchFilters","description":"Filters for carriage search"},"CarriageStatus":{"type":"string","enum":["announced","legislative_initiative","tabled","close_to_adoption","completed","adopted","blocked","withdrawn"],"title":"CarriageStatus","description":"Legislative file status categories"},"CarriageStatusEnum":{"type":"string","enum":["announced","legislative_initiative","tabled","close_to_adoption","completed","adopted","blocked","withdrawn"],"title":"CarriageStatusEnum","description":"Legislative file status categories"},"CatalanAcquisItem":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"date":{"type":"null","title":"Date"},"catalan_url":{"type":"string","title":"Catalan Url"}},"type":"object","required":["celex","catalan_url"],"title":"CatalanAcquisItem"},"CatalanAcquisResponse":{"properties":{"total_published":{"type":"integer","title":"Total Published"},"recent":{"items":{"$ref":"#/components/schemas/CatalanAcquisItem"},"type":"array","title":"Recent"}},"type":"object","required":["total_published","recent"],"title":"CatalanAcquisResponse"},"CatalanActConcept":{"properties":{"notation":{"type":"string","title":"Notation"},"concept_uri":{"type":"string","title":"Concept Uri"},"public_url":{"type":"string","title":"Public Url"},"label_ca":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label Ca"},"label_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label En"},"concept_type":{"type":"string","title":"Concept Type"},"relation":{"type":"string","title":"Relation","description":"'gold' (act's own EuroVoc) or 'inherited' (from parent act)"}},"type":"object","required":["notation","concept_uri","public_url","concept_type","relation"],"title":"CatalanActConcept"},"CatalanLinkedAct":{"properties":{"celex":{"type":"string","title":"Celex"},"title_ca":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Ca"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"relation":{"type":"string","title":"Relation"}},"type":"object","required":["celex","relation"],"title":"CatalanLinkedAct"},"CatalanStats":{"properties":{"total":{"type":"integer","title":"Total","description":"Total binding-law translations available."},"target":{"type":"integer","title":"Target","description":"Canonical EU binding-law count we converge to.","default":8710},"coverage_pct":{"type":"number","title":"Coverage Pct","description":"100 * total / target, capped at 100."},"by_doc_type":{"items":{"$ref":"#/components/schemas/DocTypeCount"},"type":"array","title":"By Doc Type"},"by_category":{"items":{"$ref":"#/components/schemas/api__v1__catalan_translations__CategoryCount"},"type":"array","title":"By Category"},"by_engine":{"items":{"$ref":"#/components/schemas/EngineCount"},"type":"array","title":"By Engine"},"last_translated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Translated At"},"licence":{"type":"string","title":"Licence","description":"Translations are MIT-licensed; redistribution permitted with attribution.","default":"MIT"}},"type":"object","required":["total","coverage_pct","by_doc_type","by_category","by_engine"],"title":"CatalanStats","description":"Aggregate counts over the binding-law subset."},"CatalanTranslationDetail":{"properties":{"celex":{"type":"string","title":"Celex","description":"CELEX identifier (sector 3, form R/L/D)."},"oj_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Reference","description":"Official Journal reference (L-series)."},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type","description":"regulation | directive | decision | delegated | implementing | treaty"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name","description":"Common short name where known (GDPR, AI Act, MiFID II...)."},"title_ca":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Ca","description":"Title in Catalan."},"title_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title En","description":"Title in English (source)."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Brubru top-level category (Catalan)."},"category_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category En","description":"Brubru top-level category (English)."},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory","description":"More granular tag where assigned."},"articles_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Articles Count"},"recitals_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recitals Count"},"html_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Html Size Bytes"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine","description":"Translation engine: softcatala (NMT) or sonnet (Claude)."},"source_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Format","description":"Source XML format — currently 'formex' (Formex V4)."},"ca_url":{"type":"string","title":"Ca Url","description":"Canonical Catalan HTML rendering on brubru.beresol.eu."},"source_eurlex_url":{"type":"string","title":"Source Eurlex Url","description":"EUR-Lex landing page for the original act (multilingual)."},"translated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Translated At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"has_body":{"type":"boolean","title":"Has Body","description":"True if a Catalan-rendered body is available for this act (html_size_bytes >= body_threshold).","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Rendered Catalan HTML body. Populated only when `?body=html` is requested. May be null if the upstream file is unreachable — fall back to ca_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text rendering of body_html (HTML stripped). Populated only when `?body=html` is requested."}},"type":"object","required":["celex","ca_url","source_eurlex_url"],"title":"CatalanTranslationDetail","description":"Single-record response — extends the list item with optional body inlining.\n\nBody fields follow the v1 contract used across the rest of the API:\n  - has_body: bool — true iff a body is available upstream (>=\n    body_threshold chars). Computed from html_size_bytes so partners\n    can branch before requesting the body.\n  - body_html / body_text — populated only when ?body=html is requested\n    on this endpoint. body_html is the raw upstream HTML; body_text is\n    the stripped plain-text rendering."},"CatalanTranslationItem":{"properties":{"celex":{"type":"string","title":"Celex","description":"CELEX identifier (sector 3, form R/L/D)."},"oj_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Reference","description":"Official Journal reference (L-series)."},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type","description":"regulation | directive | decision | delegated | implementing | treaty"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name","description":"Common short name where known (GDPR, AI Act, MiFID II...)."},"title_ca":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Ca","description":"Title in Catalan."},"title_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title En","description":"Title in English (source)."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Brubru top-level category (Catalan)."},"category_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category En","description":"Brubru top-level category (English)."},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory","description":"More granular tag where assigned."},"articles_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Articles Count"},"recitals_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recitals Count"},"html_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Html Size Bytes"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine","description":"Translation engine: softcatala (NMT) or sonnet (Claude)."},"source_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Format","description":"Source XML format — currently 'formex' (Formex V4)."},"ca_url":{"type":"string","title":"Ca Url","description":"Canonical Catalan HTML rendering on brubru.beresol.eu."},"source_eurlex_url":{"type":"string","title":"Source Eurlex Url","description":"EUR-Lex landing page for the original act (multilingual)."},"translated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Translated At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["celex","ca_url","source_eurlex_url"],"title":"CatalanTranslationItem","description":"One translated EU legal act in Catalan."},"CatalogResponse":{"properties":{"columns":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Columns"}},"type":"object","required":["columns"],"title":"CatalogResponse"},"CellOut":{"properties":{"file_ref":{"type":"string","title":"File Ref"},"column_key":{"type":"string","title":"Column Key"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text"},"citation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Citation"},"computation_status":{"type":"string","title":"Computation Status"},"computation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Computation Error"},"computed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Computed At"}},"type":"object","required":["file_ref","column_key","computation_status"],"title":"CellOut"},"CellarMetadata":{"properties":{"celex":{"type":"string","title":"Celex"},"work_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Uri"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli"},"resource_type_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Uri"},"resource_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Label"},"in_force":{"type":"boolean","title":"In Force"},"date_in_force":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date In Force"},"date_end_validity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date End Validity"},"available_languages":{"items":{"type":"string"},"type":"array","title":"Available Languages"},"eurovoc_concepts":{"items":{"type":"string"},"type":"array","title":"Eurovoc Concepts"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing EUR-Lex URL (alias of eurlex_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null on this metadata-only endpoint. Use /api/v1/citations/verify for body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null on this metadata-only endpoint."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this Cellar discovery call (live endpoint)."}},"type":"object","required":["celex","in_force","eurlex_url"],"title":"CellarMetadata"},"CellarRecentItem":{"properties":{"celex":{"type":"string","title":"Celex"},"work_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Uri","description":"Cellar work URI (used for FMX4 retrieval)"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"cdm:work_date_document"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing EUR-Lex URL (alias of eurlex_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body. Null by default; populated when /recent is called with include_body=true (other list endpoints stay metadata-only — use /api/v1/citations/verify for body on demand)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (Cellar XHTML manifestation). Null by default; populated when /recent is called with include_body=true."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this Cellar discovery call (live endpoint)."}},"type":"object","required":["celex"],"title":"CellarRecentItem"},"CellarRelation":{"properties":{"relation":{"type":"string","title":"Relation","description":"CDM relationship predicate URI"},"related_celex":{"type":"string","title":"Related Celex"},"direction":{"type":"string","title":"Direction","description":"'outgoing' (this work -> other) or 'incoming' (other -> this work)"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"EUR-Lex citizen URL of the related act."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null on this graph-edge endpoint — fetch via /citations/verify on the related_celex."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null on this graph-edge endpoint."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null on this graph-edge endpoint — Cellar relationship metadata doesn't carry the related act's date inline."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this Cellar relationship discovery call."}},"type":"object","required":["relation","related_celex","direction"],"title":"CellarRelation"},"ChatFeedbackCreate":{"properties":{"chat_id":{"type":"string","title":"Chat Id","description":"Chat conversation ID"},"message_id":{"type":"string","title":"Message Id","description":"Specific message ID being rated"},"rating":{"type":"string","title":"Rating","description":"Rating: 'positive', 'negative', or 'hallucination'"},"message_content":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Message Content","description":"The message content for context"},"feedback_text":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Feedback Text","description":"User's correction or explanation (for hallucination reports)"}},"type":"object","required":["chat_id","message_id","rating"],"title":"ChatFeedbackCreate","description":"Schema for quick chat message feedback"},"ChatFeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"feedback_id":{"type":"string","format":"uuid","title":"Feedback Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","feedback_id","message"],"title":"ChatFeedbackResponse","description":"Response for chat feedback submission"},"ChatMessageRequest":{"properties":{"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message","description":"User message"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","description":"Conversation ID (optional, for continuing conversation)"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID (optional)"},"pre_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pre User Id","description":"Pre-user ID for anonymous session tracking (optional)"},"document_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Document Ids","description":"Document IDs to include in context (optional)"},"use_context":{"type":"boolean","title":"Use Context","description":"Whether to inject EU context","default":true},"stream":{"type":"boolean","title":"Stream","description":"Whether to stream response","default":false},"nav_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nav Context","description":"Navigation context hint. 'policy_interests' routes the message to the lightweight policy-taxonomy mapping flow (Mistral-first) instead of the full knowledge-bearing answer."}},"type":"object","required":["message"],"title":"ChatMessageRequest","description":"Request to send chat message"},"ChatMessageResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message":{"type":"string","title":"Message"},"citations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Citations"},"tokens_used":{"type":"integer","title":"Tokens Used"},"model":{"type":"string","title":"Model"},"search_time_ms":{"type":"number","title":"Search Time Ms"},"total_time_ms":{"type":"number","title":"Total Time Ms"},"timestamp":{"type":"string","title":"Timestamp"},"actions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Actions","default":[]},"drafted_document":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Drafted Document"}},"type":"object","required":["chat_id","message","citations","tokens_used","model","search_time_ms","total_time_ms","timestamp"],"title":"ChatMessageResponse","description":"Response with AI message"},"CitationsResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"citations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Citations"},"total_citations":{"type":"integer","title":"Total Citations"}},"type":"object","required":["chat_id","citations","total_citations"],"title":"CitationsResponse","description":"Citations for conversation"},"ClaimInfoResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"role_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Title"},"pre_provisioned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pre Provisioned At"},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"},"private_guide_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Private Guide Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["valid"],"title":"ClaimInfoResponse","description":"Public-safe info shown on the /claim/<token> landing page."},"ClaimPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":100,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"ClaimPasswordRequest","description":"Set email + password for a dormant pre-provisioned profile."},"CohesionCategoryCount":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"datasets":{"type":"integer","title":"Datasets"}},"type":"object","required":["category","datasets"],"title":"CohesionCategoryCount"},"CohesionDetail":{"properties":{"socrata_id":{"type":"string","title":"Socrata Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"},"download_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Download Count"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count"},"last_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated At"},"created_at_src":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At Src"},"columns":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Columns"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"api_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Endpoint"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias."},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Dataset last-update date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last fetched this dataset (alias of fetched_at)."}},"type":"object","required":["socrata_id"],"title":"CohesionDetail"},"CohesionFinanceItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the fund's Cohesion Open Data page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The programme's status / adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the row."},"id":{"type":"integer","title":"Id","description":"Stable Brubru row id (use it on the detail endpoint)."},"fund":{"type":"string","title":"Fund"},"ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ms"},"cci":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cci"},"cci_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cci Title"},"dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"status_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Status Date"},"financial_allocation_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Financial Allocation Category"},"y2021":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2021"},"y2022":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2022"},"y2023":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2023"},"y2024":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2024"},"y2025":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2025"},"y2026":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2026"},"y2027":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y2027"},"total_non_flexible_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Non Flexible Amount"},"total_flexible_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Flexible Amount"},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"},"share_of_fa_in_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Fa In Total"}},"type":"object","required":["id","fund"],"title":"CohesionFinanceItem"},"CohesionListItem":{"properties":{"socrata_id":{"type":"string","title":"Socrata Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"download_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Download Count"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count"},"last_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"api_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Endpoint"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: name + category + tags + counts + last_updated."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Last update date (date-only view of last_updated_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this row."}},"type":"object","required":["socrata_id"],"title":"CohesionListItem"},"CohesionOutcomeItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the fund's Cohesion Open Data page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The programme's status / adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the row."},"id":{"type":"integer","title":"Id","description":"Stable Brubru row id (use it on the detail endpoint)."},"fund":{"type":"string","title":"Fund"},"ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ms"},"ms_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ms Name"},"cci":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cci"},"programme_short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme Short Title"},"policy_objective_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Objective Name"},"specific_objective_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Specific Objective Name"},"category_of_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Of Region"},"indicator_type_output_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Indicator Type Output Result"},"ind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ind Code"},"indicator_short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Indicator Short Name"},"indicator_long_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Indicator Long Name"},"measurement_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measurement Unit"},"baseline_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Value"},"milestone_value_2024":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Milestone Value 2024"},"target_value_2029":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Value 2029"},"decided_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Decided Value"},"implemented_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Implemented Value"}},"type":"object","required":["id","fund"],"title":"CohesionOutcomeItem"},"CohesionResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_code":{"type":"string","title":"Entity Code"},"cohesion_score":{"type":"number","title":"Cohesion Score"},"cohesion_level":{"type":"string","title":"Cohesion Level"},"votes_analyzed":{"type":"integer","title":"Votes Analyzed"},"majority_position":{"type":"string","title":"Majority Position"},"position_breakdown":{"additionalProperties":{"type":"integer"},"type":"object","title":"Position Breakdown"}},"type":"object","required":["entity_type","entity_code","cohesion_score","cohesion_level","votes_analyzed","majority_position","position_breakdown"],"title":"CohesionResponse","description":"Cohesion analysis response."},"ComitologyDocDetail":{"properties":{"document_reference":{"type":"string","title":"Document Reference"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"meeting_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Code"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"committee_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Title"},"document_type":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Document Type"},"document_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type Label"},"document_type_letter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type Letter"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"},"update_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Update Date"},"meeting_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Meeting Start Date"},"meeting_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Meeting End Date"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias."}},"type":"object","required":["document_reference"],"title":"ComitologyDocDetail"},"ComitologyDocItem":{"properties":{"document_reference":{"type":"string","title":"Document Reference"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"meeting_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Code"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"committee_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Title"},"document_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type Label"},"document_type_letter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type Letter"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"},"meeting_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Meeting Start Date"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false}},"type":"object","required":["document_reference"],"title":"ComitologyDocItem"},"CommentCreate":{"properties":{"comment_text":{"type":"string","minLength":1,"title":"Comment Text","description":"Comment text"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments","description":"Attachments"}},"type":"object","required":["comment_text"],"title":"CommentCreate","description":"Schema for creating a comment"},"CommentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"feedback_id":{"type":"string","format":"uuid","title":"Feedback Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"user":{"anyOf":[{"$ref":"#/components/schemas/FeedbackUserInfo"},{"type":"null"}]},"is_admin_response":{"type":"boolean","title":"Is Admin Response"},"comment_text":{"type":"string","title":"Comment Text"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","feedback_id","user_id","is_admin_response","comment_text","attachments","created_at","updated_at"],"title":"CommentResponse","description":"Schema for comment response"},"CommissionDocDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Name"},"doc_type":{"type":"string","title":"Doc Type"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"legislative_carriage_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Legislative Carriage Id"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"tracked_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tracked Since"}},"type":"object","required":["id","reference","title","doc_type","first_seen","last_updated"],"title":"CommissionDocDetailResponse","description":"Full detail response."},"CommissionDocListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CommissionDocumentSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters Applied"},"my_committees":{"items":{"type":"string"},"type":"array","title":"My Committees"},"pi_active":{"type":"boolean","title":"Pi Active","default":false},"files_active":{"type":"boolean","title":"Files Active","default":false},"has_tracked_files":{"type":"boolean","title":"Has Tracked Files","default":false}},"type":"object","required":["items","total","limit","offset"],"title":"CommissionDocListResponse","description":"Paginated list response."},"CommissionDocType":{"type":"string","enum":["COM","SWD","JOIN","OJ"],"title":"CommissionDocType","description":"Document types for filtering."},"CommissionDocumentSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Name"},"doc_type":{"type":"string","title":"Doc Type"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"committee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Name"},"referral_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Pdf Url"},"matches_interests":{"type":"boolean","title":"Matches Interests","default":false},"matches_tracked":{"type":"boolean","title":"Matches Tracked","default":false}},"type":"object","required":["id","reference","title","doc_type","last_updated"],"title":"CommissionDocumentSummary","description":"Summary schema for list views."},"CommissionRegisterItem":{"properties":{"id":{"type":"string","title":"Id"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"doc_type":{"type":"string","title":"Doc Type"},"document_register_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Register Category"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Name"},"languages":{"items":{},"type":"array","title":"Languages"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen-facing URL. Fallback chain: portal_url → EUR-Lex citizen URL derived from CELEX → source_url → pdf_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body of the document (extracted from PDF or Cellar XHTML)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (Cellar XHTML manifestation, EN). Null for PDF-only acts where Cellar has no XHTML representation."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The document's adoption / publication date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (first_seen)."},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"}},"type":"object","required":["id","reference","title","doc_type"],"title":"CommissionRegisterItem"},"CommissionerProfileOut":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"portfolio":{"type":"string","title":"Portfolio"},"country":{"type":"string","title":"Country"},"bio_url":{"type":"string","title":"Bio Url"},"agenda_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Url"},"agenda_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Pdf Url"},"unified_calendar_url":{"type":"string","title":"Unified Calendar Url","default":"https://commission.europa.eu/about/organisation/college-commissioners/calendar-items-president-and-commissioners_en"},"type":{"type":"string","title":"Type","default":"commissioner"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["slug","name","portfolio","country","bio_url"],"title":"CommissionerProfileOut","description":"Profile-only view of a College member. Returned by `/commissioners` (list)\nand `/commissioners/{slug}` (detail). The agenda lives at a separate path."},"Committee":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"type":{"type":"string","title":"Type"}},"type":"object","required":["code","name","url","type"],"title":"Committee","description":"Committee information"},"CommitteeAgendaOut":{"properties":{"id":{"type":"string","title":"Id"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"title":{"type":"string","title":"Title"},"meeting_date":{"type":"string","format":"date","title":"Meeting Date"},"agenda_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Url"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"procedure_refs":{"items":{},"type":"array","title":"Procedure Refs"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"has_body":{"type":"boolean","title":"Has Body","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — the doceo draft-agenda document (agenda_url), falling back to source_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body extracted from the doceo agenda document. Null only when the document could not be fetched."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body composed from the extracted agenda text (one <p> per paragraph). Same text as body_txt, structured."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The committee meeting date the agenda is for (start_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this agenda (eu_calendar_events.first_seen)."}},"type":"object","required":["id","title","meeting_date"],"title":"CommitteeAgendaOut"},"CommitteeDetails":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMember"},"type":"array","title":"Members"},"member_count":{"type":"integer","title":"Member Count"},"url":{"type":"string","title":"Url"},"last_updated":{"type":"string","title":"Last Updated"}},"type":"object","required":["code","name","description","members","member_count","url","last_updated"],"title":"CommitteeDetails","description":"Detailed committee information"},"CommitteeInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"full_name":{"type":"string","title":"Full Name"},"policy_area":{"type":"string","title":"Policy Area"}},"type":"object","required":["code","name","full_name","policy_area"],"title":"CommitteeInfo","description":"Committee information."},"CommitteeInfoResponse":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"full_members":{"type":"integer","title":"Full Members"},"substitutes":{"type":"integer","title":"Substitutes"},"total":{"type":"integer","title":"Total"},"group_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Group Distribution"},"pro_eu_balance":{"type":"integer","title":"Pro Eu Balance"},"eurosceptic_balance":{"type":"integer","title":"Eurosceptic Balance"}},"type":"object","required":["code","name","full_members","substitutes","total","group_distribution","pro_eu_balance","eurosceptic_balance"],"title":"CommitteeInfoResponse","description":"Committee information."},"CommitteeItem":{"properties":{"code":{"type":"string","title":"Code"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"dg_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Code"},"dg_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Title"},"parent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Code"},"abolished_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Abolished Since"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"}},"type":"object","required":["code"],"title":"CommitteeItem"},"CommitteeMember":{"properties":{"mep_id":{"type":"string","title":"Mep Id"},"name":{"type":"string","title":"Name"},"country":{"type":"string","title":"Country"},"political_group":{"type":"string","title":"Political Group"},"role":{"type":"string","title":"Role"},"profile_url":{"type":"string","title":"Profile Url"}},"type":"object","required":["mep_id","name","country","political_group","role","profile_url"],"title":"CommitteeMember","description":"Committee member information"},"CommitteeMinutesEnvelope":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommitteeMinutesOut"},"type":"array","title":"Data"},"committee_code":{"type":"string","title":"Committee Code"},"streaming_url":{"type":"string","title":"Streaming Url"},"homepage":{"type":"string","title":"Homepage"},"documents_url":{"type":"string","title":"Documents Url"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data","committee_code","streaming_url","homepage","documents_url"],"title":"CommitteeMinutesEnvelope"},"CommitteeMinutesOut":{"properties":{"id":{"type":"string","title":"Id"},"committee_code":{"type":"string","title":"Committee Code"},"meeting_date":{"type":"string","format":"date-time","title":"Meeting Date"},"title":{"type":"string","title":"Title"},"pe_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pe Reference"},"document_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Reference"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"agenda_items":{"items":{},"type":"array","title":"Agenda Items"},"votes":{"items":{},"type":"array","title":"Votes"},"decisions":{"items":{},"type":"array","title":"Decisions"},"attendees_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attendees Count"},"has_full_text":{"type":"boolean","title":"Has Full Text","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — pdf_url → doc_url → source_url fallback chain."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body extracted from the PDF minutes."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body. Null for this endpoint — minutes are PDF-source."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Start Date","description":"The meeting date (date-only view of meeting_date for the uniform datapoint convention)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this minutes row (committee_minutes.first_seen)."}},"type":"object","required":["id","committee_code","meeting_date","title"],"title":"CommitteeMinutesOut"},"CommitteeRole":{"type":"string","enum":["lead","associated","opinion"],"title":"CommitteeRole","description":"Committee's role in the procedure."},"CommitteeTranscriptOut":{"properties":{"id":{"type":"string","title":"Id"},"committee_code":{"type":"string","title":"Committee Code"},"title":{"type":"string","title":"Title"},"meeting_date":{"type":"string","format":"date-time","title":"Meeting Date"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"},"multimedia_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Multimedia Url"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Word Count"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"speaker_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Speaker Count"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"agenda_items":{"items":{},"type":"array","title":"Agenda Items"},"related_procedure_refs":{"items":{},"type":"array","title":"Related Procedure Refs"},"committee_minutes_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Minutes Id"},"transcription_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription Model"},"has_body":{"type":"boolean","title":"Has Body","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — EP Multimedia Centre page for the recording (multimedia_url -> video_url -> committee webstreaming page)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Verbatim Whisper transcript of the meeting. Null on the list endpoint unless include_body=true; always present on the detail endpoint."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML rendering composed from transcript_segments (one <p> per segment, speaker label when known). Same text as body_txt, structured. Null unless include_body=true / detail."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The date the committee meeting took place (meeting_date, date-only)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru produced this transcript row (transcribed_at, falling back to first_seen)."}},"type":"object","required":["id","committee_code","title","meeting_date"],"title":"CommitteeTranscriptOut"},"CommitteeVoteResponse":{"properties":{"committee_code":{"type":"string","title":"Committee Code"},"committee_name":{"type":"string","title":"Committee Name"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"predicted_outcome":{"type":"string","title":"Predicted Outcome"},"confidence":{"type":"number","title":"Confidence"},"expected_margin":{"type":"integer","title":"Expected Margin"},"estimated_for":{"type":"integer","title":"Estimated For"},"estimated_against":{"type":"integer","title":"Estimated Against"},"estimated_abstain":{"type":"integer","title":"Estimated Abstain"},"rapporteur_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Group"},"shadow_positions":{"additionalProperties":{"type":"string"},"type":"object","title":"Shadow Positions","default":{}},"amendment_risk":{"type":"string","title":"Amendment Risk"},"key_groups_to_watch":{"items":{"type":"string"},"type":"array","title":"Key Groups To Watch","default":[]}},"type":"object","required":["committee_code","committee_name","procedure_ref","predicted_outcome","confidence","expected_margin","estimated_for","estimated_against","estimated_abstain","amendment_risk"],"title":"CommitteeVoteResponse","description":"Committee vote prediction."},"CommitteeWorkDetailResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref","description":"OEIL procedure reference (e.g., 2025/0580(CNS))"},"committee_code":{"type":"string","title":"Committee Code","description":"Committee code (e.g., AFET, LIBE)"},"title":{"type":"string","title":"Title","description":"Procedure title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Short description"},"procedure_type":{"type":"string","title":"Procedure Type","description":"OEIL procedure type code (free text; e.g. COD, DEA, RSP)","default":"INI"},"committee_role":{"$ref":"#/components/schemas/CommitteeRole","description":"Committee role","default":"lead"},"relevance_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Relevance Score","description":"Relevance score (40-100)","default":40},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name","description":"Rapporteur name"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id","description":"MEP ID for linking"},"status":{"$ref":"#/components/schemas/CommitteeWorkStatus","description":"Current status","default":"unknown"},"status_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Text","description":"Original status text"},"oeil_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Url","description":"OEIL procedure page URL"},"ep_page_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Page Url","description":"EP committee page URL"},"id":{"type":"string","format":"uuid","title":"Id","description":"Work item ID"},"full_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Description","description":"Full description"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Committee stage"},"shadow_rapporteurs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Shadow Rapporteurs","description":"Shadow rapporteurs [{name, group, mep_id}]"},"timeline_events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Timeline Events","description":"Timeline events [{date, event, status}]"},"vote_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Vote Date","description":"Scheduled vote date"},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result","description":"Vote result if voted"},"related_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Documents","description":"Related documents [{title, url, type}]"},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","description":"Related CELEX numbers"},"legislative_carriage_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Legislative Carriage Id","description":"Linked LegislativeCarriage ID if available"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url","description":"EUR-Lex URL"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Source URL where scraped from"},"first_seen":{"type":"string","format":"date-time","title":"First Seen","description":"When first seen"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Last update time"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At","description":"When scraped"},"is_tracked":{"type":"boolean","title":"Is Tracked","description":"Whether user is tracking this item","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes","description":"User's notes on this item"},"tracked_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tracked Since","description":"When user started tracking"}},"type":"object","required":["procedure_ref","committee_code","title","id","first_seen","last_updated"],"title":"CommitteeWorkDetailResponse","description":"Detailed response with tracking info."},"CommitteeWorkEnvelope":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommitteeWorkOut"},"type":"array","title":"Data"},"committee_code":{"type":"string","title":"Committee Code"},"streaming_url":{"type":"string","title":"Streaming Url"},"homepage":{"type":"string","title":"Homepage"},"documents_url":{"type":"string","title":"Documents Url"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data","committee_code","streaming_url","homepage","documents_url"],"title":"CommitteeWorkEnvelope"},"CommitteeWorkItemResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref","description":"OEIL procedure reference (e.g., 2025/0580(CNS))"},"committee_code":{"type":"string","title":"Committee Code","description":"Committee code (e.g., AFET, LIBE)"},"title":{"type":"string","title":"Title","description":"Procedure title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Short description"},"procedure_type":{"type":"string","title":"Procedure Type","description":"OEIL procedure type code (free text; e.g. COD, DEA, RSP)","default":"INI"},"committee_role":{"$ref":"#/components/schemas/CommitteeRole","description":"Committee role","default":"lead"},"relevance_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Relevance Score","description":"Relevance score (40-100)","default":40},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name","description":"Rapporteur name"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id","description":"MEP ID for linking"},"status":{"$ref":"#/components/schemas/CommitteeWorkStatus","description":"Current status","default":"unknown"},"status_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Text","description":"Original status text"},"oeil_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Url","description":"OEIL procedure page URL"},"ep_page_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Page Url","description":"EP committee page URL"},"id":{"type":"string","format":"uuid","title":"Id","description":"Work item ID"},"full_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Description","description":"Full description"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Committee stage"},"shadow_rapporteurs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Shadow Rapporteurs","description":"Shadow rapporteurs [{name, group, mep_id}]"},"timeline_events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Timeline Events","description":"Timeline events [{date, event, status}]"},"vote_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Vote Date","description":"Scheduled vote date"},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result","description":"Vote result if voted"},"related_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Documents","description":"Related documents [{title, url, type}]"},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","description":"Related CELEX numbers"},"legislative_carriage_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Legislative Carriage Id","description":"Linked LegislativeCarriage ID if available"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url","description":"EUR-Lex URL"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Source URL where scraped from"},"first_seen":{"type":"string","format":"date-time","title":"First Seen","description":"When first seen"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Last update time"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At","description":"When scraped"}},"type":"object","required":["procedure_ref","committee_code","title","id","first_seen","last_updated"],"title":"CommitteeWorkItemResponse","description":"Full response schema for committee work item."},"CommitteeWorkItemSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"committee_code":{"type":"string","title":"Committee Code"},"title":{"type":"string","title":"Title"},"procedure_type":{"type":"string","title":"Procedure Type"},"committee_role":{"$ref":"#/components/schemas/CommitteeRole"},"relevance_score":{"type":"integer","title":"Relevance Score"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"status":{"$ref":"#/components/schemas/CommitteeWorkStatus"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"legislative_carriage_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Legislative Carriage Id"},"oeil_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Url"},"committee_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Committee Documents"}},"type":"object","required":["id","procedure_ref","committee_code","title","procedure_type","committee_role","relevance_score","status","last_updated"],"title":"CommitteeWorkItemSummary","description":"Summary schema for list views."},"CommitteeWorkListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CommitteeWorkItemSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters Applied"}},"type":"object","required":["items","total","limit","offset"],"title":"CommitteeWorkListResponse","description":"Response for paginated list of committee work items."},"CommitteeWorkOut":{"properties":{"id":{"type":"string","title":"Id"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"committee_code":{"type":"string","title":"Committee Code"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"committee_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Role"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"vote_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Vote Date"},"vote_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Result"},"celex_numbers":{"items":{},"type":"array","title":"Celex Numbers"},"relevance_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Relevance Score"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"law_tracker_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Law Tracker Url"},"rapporteur_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Group"},"rapporteur_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Source"},"rapporteur_name_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name Quality"},"shadow_rapporteurs":{"items":{},"type":"array","title":"Shadow Rapporteurs"},"shadow_rapporteurs_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shadow Rapporteurs Source"},"documents":{"items":{},"type":"array","title":"Documents"},"documents_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Source"},"celex_status":{"type":"string","title":"Celex Status","default":"unknown"},"vote_date_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote Date Source"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL for the procedure (OEIL procedure-file page)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body. Null on work-items — see the individual PDFs in `documents[]`."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body. Null on work-items — see the individual PDFs in `documents[]`."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Start Date","description":"The committee vote date when scheduled (alias of vote_date for the uniform datapoint convention)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this work-item row (committee_work.first_seen)."}},"type":"object","required":["id","committee_code"],"title":"CommitteeWorkOut"},"CommitteeWorkStatus":{"type":"string","enum":["in_committee","awaiting_vote","tabled","adopted","rejected","withdrawn","pending","completed","unknown"],"title":"CommitteeWorkStatus","description":"Status of the work item."},"CommitteeWorkload":{"properties":{"committee_code":{"type":"string","title":"Committee Code"},"committee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Name"},"active_files":{"type":"integer","title":"Active Files"},"files_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Files By Status"},"average_processing_time_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Processing Time Days"},"blocked_files":{"type":"integer","title":"Blocked Files"},"lead_files":{"type":"integer","title":"Lead Files","description":"Files where committee is lead","default":0},"opinion_files":{"type":"integer","title":"Opinion Files","description":"Files where committee gives opinion","default":0}},"type":"object","required":["committee_code","active_files","files_by_status","blocked_files"],"title":"CommitteeWorkload","description":"Committee workload analysis"},"CommitteesListResponse":{"properties":{"committees":{"items":{"$ref":"#/components/schemas/CommitteeInfo"},"type":"array","title":"Committees"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["committees","total"],"title":"CommitteesListResponse","description":"Response for list of committees."},"CompanySize":{"type":"string","enum":["micro","small","medium"],"title":"CompanySize","description":"SME company size categories"},"ComparisonAllyItem":{"properties":{"name":{"type":"string","title":"Name"},"group":{"type":"string","title":"Group"},"avg_score":{"type":"number","title":"Avg Score"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","group","avg_score","count"],"title":"ComparisonAllyItem","description":"A ranked MEP ally."},"ComparisonResponse":{"properties":{"best_allies":{"items":{"$ref":"#/components/schemas/ComparisonAllyItem"},"type":"array","title":"Best Allies"},"coverage_gaps":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Coverage Gaps","description":"{user_unique: [...], blind_spots: [...]}"},"political_landscape":{"additionalProperties":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":"object","title":"Political Landscape","description":"{supportive: [...], mixed: [...], opposed: [...]}"}},"type":"object","title":"ComparisonResponse","description":"Comparative analysis results."},"CompetitionCaseItem":{"properties":{"case_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Number"},"case_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Title"},"case_instrument":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Instrument","description":"SA / M / AT — state aid, merger, antitrust."},"case_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Dg"},"member_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member State"},"case_aid_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Aid Category"},"case_objectives":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Case Objectives"},"case_simplified_procedure":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Simplified Procedure"},"case_cartel":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Cartel"},"case_initiation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Case Initiation Date"},"case_notification_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Case Notification Date"},"case_measure_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Case Measure Start Date"},"case_last_update_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Case Last Update Date"},"primary_attachment_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Attachment Reference"},"primary_attachment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Attachment Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + instrument + DG + member state + aid category + objectives + dates."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Last update date (date-only)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Initiation date."}},"type":"object","title":"CompetitionCaseItem"},"ComplianceSignalItem":{"properties":{"eu_law_id":{"type":"integer","title":"Eu Law Id"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"title":{"type":"string","title":"Title"},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"},"adopted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Adopted On"}},"type":"object","required":["eu_law_id","title"],"title":"ComplianceSignalItem","description":"An adopted EU law in the user's policy areas."},"ComplianceSignalsTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/ComplianceSignalItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"ComplianceSignalsTile"},"ComputeResponse":{"properties":{"grid_id":{"type":"string","format":"uuid","title":"Grid Id"},"cells_computed":{"type":"integer","title":"Cells Computed"},"cells_failed":{"type":"integer","title":"Cells Failed"},"duration_seconds":{"type":"number","title":"Duration Seconds"}},"type":"object","required":["grid_id","cells_computed","cells_failed","duration_seconds"],"title":"ComputeResponse"},"ConsolidatedResult":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical EU URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (null when the resource has no inline body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (null when the resource has no inline body)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The resource's document date, when applicable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated/ingested this (server time)."},"base_celex":{"type":"string","title":"Base Celex"},"count":{"type":"integer","title":"Count"},"latest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Latest"},"versions":{"items":{},"type":"array","title":"Versions","description":"All consolidated versions, newest first: {celex, date, uri}."}},"type":"object","required":["base_celex","count"],"title":"ConsolidatedResult"},"ConsortiumPayload":{"properties":{"cordis_id":{"type":"string","title":"Cordis Id"},"project_acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Acronym"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"organisations":{"items":{},"type":"array","title":"Organisations"},"coordinator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Name"},"coordinator_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Country"},"organisation_count":{"type":"integer","title":"Organisation Count","default":0},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"CORDIS URL of the parent project."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Parent project's objective as plain text."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Parent project's objective as HTML."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Parent project's start_date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the parent project (ft_funded_projects.scraped_at)."}},"type":"object","required":["cordis_id"],"title":"ConsortiumPayload"},"ConsultationDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"initiative_id":{"type":"string","title":"Initiative Id"},"publication_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Id"},"title":{"type":"string","title":"Title"},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"full_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Description"},"objectives":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objectives"},"target_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Group"},"consultation_type":{"$ref":"#/components/schemas/ConsultationType"},"status":{"$ref":"#/components/schemas/ConsultationStatus"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"dg_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Name"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas","default":[]},"source":{"type":"string","title":"Source","default":"commission"},"source_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Body"},"body_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Name"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Remaining"},"is_closing_soon":{"type":"boolean","title":"Is Closing Soon","default":false},"feedback_count":{"type":"integer","title":"Feedback Count","default":0},"views_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Views Count"},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"feedback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Url"},"com_references":{"items":{"type":"string"},"type":"array","title":"Com References","default":[]},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","default":[]},"outcome_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome Summary"},"outcome_published_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Outcome Published Date"},"outcome_document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome Document Url"},"relevance_score":{"type":"integer","title":"Relevance Score","default":50},"documents":{"items":{"$ref":"#/components/schemas/ConsultationDocumentResponse"},"type":"array","title":"Documents","default":[]},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"tracked_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tracked Since"},"submission_status":{"anyOf":[{"$ref":"#/components/schemas/SubmissionStatus"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated"}},"type":"object","required":["id","initiative_id","title","consultation_type","status","created_at","last_updated"],"title":"ConsultationDetailResponse","description":"Full details model for a consultation."},"ConsultationDocumentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"document_type":{"$ref":"#/components/schemas/DocumentType"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"file_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Format"},"language":{"type":"string","title":"Language","default":"en"}},"type":"object","required":["id","title","document_type"],"title":"ConsultationDocumentResponse","description":"Response model for a consultation document."},"ConsultationListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"initiative_id":{"type":"string","title":"Initiative Id"},"title":{"type":"string","title":"Title"},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title"},"consultation_type":{"$ref":"#/components/schemas/ConsultationType"},"status":{"$ref":"#/components/schemas/ConsultationStatus"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"dg_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Name"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas","default":[]},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Remaining"},"is_closing_soon":{"type":"boolean","title":"Is Closing Soon","default":false},"feedback_count":{"type":"integer","title":"Feedback Count","default":0},"relevance_score":{"type":"integer","title":"Relevance Score","default":50},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"source":{"type":"string","title":"Source","default":"commission"},"source_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Body"},"body_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Name"}},"type":"object","required":["id","initiative_id","title","consultation_type","status"],"title":"ConsultationListItem","description":"Summary model for consultation list views."},"ConsultationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConsultationListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters Applied"}},"type":"object","required":["items","total","limit","offset"],"title":"ConsultationListResponse","description":"Paginated list response for consultations."},"ConsultationStatus":{"type":"string","enum":["open","upcoming","closed","outcome_published","withdrawn"],"title":"ConsultationStatus","description":"Status of a consultation."},"ConsultationType":{"type":"string","enum":["public_consultation","call_for_evidence","feedback","roadmap","initiative"],"title":"ConsultationType","description":"Types of EC public consultations."},"ConsultationsDirectory":{"properties":{"total_consultations":{"type":"integer","title":"Total Consultations"},"open":{"type":"integer","title":"Open"},"closed":{"type":"integer","title":"Closed"},"bodies_with_consultations":{"type":"integer","title":"Bodies With Consultations"},"families":{"type":"integer","title":"Families"},"by_institution":{"additionalProperties":true,"type":"object","title":"By Institution"}},"type":"object","required":["total_consultations","open","closed","bodies_with_consultations","families","by_institution"],"title":"ConsultationsDirectory"},"ConversationHistoryResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"messages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Messages"},"total_messages":{"type":"integer","title":"Total Messages"}},"type":"object","required":["chat_id","messages","total_messages"],"title":"ConversationHistoryResponse","description":"Conversation history"},"CouncilConfigurationItem":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"register_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Register Entity Id"},"consilium_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consilium Url"},"calendar_filter_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calendar Filter Url"},"informal":{"type":"boolean","title":"Informal","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"The consilium 'council-meetings-explained' page for this configuration."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text description of the configuration."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML description of the configuration."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — a configuration is reference data, not a dated document."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this response was generated (server time)."}},"type":"object","required":["code","name"],"title":"CouncilConfigurationItem"},"CouncilDocumentItem":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"},"council_configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"language":{"type":"string","title":"Language","default":"en"},"published_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published Date"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"tags":{"items":{},"type":"array","title":"Tags"},"oj_register_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Register Url"},"votes_register_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Votes Register Url"},"calendar_filter_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calendar Filter Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of `url`)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — the document summary when present."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — Council documents are PDF/external links."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Start Date","description":"For calendar_event rows: meeting date."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"For publication rows: publication date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","source","title"],"title":"CouncilDocumentItem"},"CouncilRegisterItemModel":{"properties":{"id":{"type":"string","title":"Id"},"content_type":{"type":"string","title":"Content Type"},"title":{"type":"string","title":"Title"},"council_configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"},"document_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Ref","description":"Council document number, e.g. 'ST 9727 2026 INIT'."},"interinstitutional_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interinstitutional Ref","description":"Interinstitutional procedure file, e.g. '2021/0297(COD)' — joins to OEIL."},"subject_matters":{"items":{},"type":"array","title":"Subject Matters"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url","description":"Direct PDF on the un-walled data.consilium store, where present."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — the consilium page or PDF."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — always populated."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body — composed from the real facts; null only for honest PDF-text rows."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Meeting / publication date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","content_type","title"],"title":"CouncilRegisterItemModel"},"CouncilVoteResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"predicted_outcome":{"type":"string","title":"Predicted Outcome"},"confidence":{"type":"number","title":"Confidence"},"qmv_result":{"$ref":"#/components/schemas/QMVResultResponse"},"state_positions":{"items":{"$ref":"#/components/schemas/MemberStatePositionResponse"},"type":"array","title":"State Positions"},"blocking_risk":{"$ref":"#/components/schemas/BlockingCoalitionResponse"},"key_concerns":{"items":{"type":"string"},"type":"array","title":"Key Concerns"},"compromise_areas":{"items":{"type":"string"},"type":"array","title":"Compromise Areas"}},"type":"object","required":["procedure_ref","predicted_outcome","confidence","qmv_result","state_positions","blocking_risk","key_concerns","compromise_areas"],"title":"CouncilVoteResponse","description":"Council vote prediction."},"CountryItem":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"iso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso"},"is_eu_ms":{"type":"boolean","title":"Is Eu Ms","default":false}},"type":"object","required":["code","name"],"title":"CountryItem"},"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":3,"title":"Name","description":"Human label, e.g. 'Production' or 'Local dev'. 3-100 characters."},"scopes":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Scopes","description":"One or more read:* scopes from the catalogue. Wildcard '*' is reserved for admins."},"expires_in_days":{"type":"integer","title":"Expires In Days","description":"Lifetime in days. Must be one of 30, 90, 180, 365.","default":180}},"additionalProperties":false,"type":"object","required":["name","scopes"],"title":"CreateKeyRequest"},"CreateKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key","description":"Plaintext API key. Shown ONCE. Store securely."},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"warning":{"type":"string","title":"Warning","default":"Store this key securely. It will not be shown again."}},"type":"object","required":["id","key","name","key_prefix","scopes","created_at","expires_at"],"title":"CreateKeyResponse","description":"Shown ONCE to the caller. Plaintext key is never returned again."},"CuratedActor":{"properties":{"committee":{"type":"string","title":"Committee"},"role":{"type":"string","title":"Role","description":"lead | opinion | budgetary"},"rapporteur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"appointed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointed"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["committee","role"],"title":"CuratedActor"},"CuratedDebate":{"properties":{"date":{"type":"string","title":"Date"},"forum":{"type":"string","title":"Forum"},"summary":{"type":"string","title":"Summary"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["date","forum","summary"],"title":"CuratedDebate"},"CuratedEvent":{"properties":{"date":{"type":"string","title":"Date"},"event":{"type":"string","title":"Event"}},"type":"object","required":["date","event"],"title":"CuratedEvent"},"CuratedKeyFact":{"properties":{"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"}},"type":"object","required":["label","value"],"title":"CuratedKeyFact"},"CuratedLink":{"properties":{"label":{"type":"string","title":"Label"},"url":{"type":"string","title":"Url"}},"type":"object","required":["label","url"],"title":"CuratedLink"},"CuratedRelatedProcedure":{"properties":{"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"relationship":{"type":"string","title":"Relationship"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["reference","title","relationship"],"title":"CuratedRelatedProcedure"},"CuratedShadow":{"properties":{"name":{"type":"string","title":"Name"},"group":{"type":"string","title":"Group"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","required":["name","group"],"title":"CuratedShadow"},"DGInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"full_name":{"type":"string","title":"Full Name"}},"type":"object","required":["code","name","full_name"],"title":"DGInfo","description":"Directorate-General information."},"DGListResponse":{"properties":{"dgs":{"items":{"$ref":"#/components/schemas/DGInfo"},"type":"array","title":"Dgs"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["dgs","total"],"title":"DGListResponse","description":"List of Directorate-Generals."},"DailyBriefResponse":{"properties":{"date":{"type":"string","title":"Date"},"items":{"items":{"$ref":"#/components/schemas/BriefItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["date","items","total"],"title":"DailyBriefResponse"},"DashboardResponse":{"properties":{"tiles":{"$ref":"#/components/schemas/DashboardTiles"},"profile_completeness":{"$ref":"#/components/schemas/ProfileCompleteness"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["tiles","profile_completeness","generated_at"],"title":"DashboardResponse"},"DashboardTiles":{"properties":{"new_this_week":{"$ref":"#/components/schemas/NewThisWeekTile"},"tracked_files_moving":{"$ref":"#/components/schemas/TrackedFilesMovingTile"},"positions_under_stress":{"$ref":"#/components/schemas/PositionsUnderStressTile"},"next_seven_days":{"$ref":"#/components/schemas/NextSevenDaysTile"},"compliance_signals":{"$ref":"#/components/schemas/ComplianceSignalsTile"},"voice_opportunities":{"$ref":"#/components/schemas/VoiceOpportunitiesTile"}},"type":"object","required":["new_this_week","tracked_files_moving","positions_under_stress","next_seven_days","compliance_signals","voice_opportunities"],"title":"DashboardTiles"},"DefinedTermsResponse":{"properties":{"celex":{"type":"string","title":"Celex"},"terms":{"additionalProperties":true,"type":"object","title":"Terms","description":"Term -> {term, definition, article, point}"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL of the parent law (EUR-Lex CELEX URL)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null on this derived endpoint — fetch /api/v1/laws/{celex} for the parent's date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When the defined-terms cache was last computed."}},"type":"object","required":["celex","terms"],"title":"DefinedTermsResponse"},"DelegationDeviationResponse":{"properties":{"country_code":{"type":"string","title":"Country Code"},"country_name":{"type":"string","title":"Country Name"},"group_code":{"type":"string","title":"Group Code"},"deviation_risk":{"type":"string","title":"Deviation Risk"},"deviation_probability":{"type":"number","title":"Deviation Probability"},"likely_direction":{"type":"string","title":"Likely Direction"},"national_interest_factor":{"type":"number","title":"National Interest Factor"},"governing_status":{"type":"string","title":"Governing Status"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons"}},"type":"object","required":["country_code","country_name","group_code","deviation_risk","deviation_probability","likely_direction","national_interest_factor","governing_status","reasons"],"title":"DelegationDeviationResponse","description":"Delegation deviation prediction response."},"DeliverablesPayload":{"properties":{"cordis_id":{"type":"string","title":"Cordis Id"},"project_acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Acronym"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"web_links":{"items":{},"type":"array","title":"Web Links"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"CORDIS URL of the parent project."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Parent project's objective as plain text."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Parent project's objective as HTML."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Parent project's start_date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the parent project."}},"type":"object","required":["cordis_id"],"title":"DeliverablesPayload"},"DocTypeCount":{"properties":{"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["doc_type","count"],"title":"DocTypeCount"},"DocumentAddRequest":{"properties":{"kind":{"type":"string","title":"Kind","description":"Document kind to add from the template (e.g. 'tender_pitch_deck')"}},"type":"object","required":["kind"],"title":"DocumentAddRequest"},"DocumentContentResponse":{"properties":{"document_id":{"type":"string","title":"Document Id"},"filename":{"type":"string","title":"Filename"},"text":{"type":"string","title":"Text"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"structure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structure"},"tables":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tables"},"quality":{"type":"string","title":"Quality"}},"type":"object","required":["document_id","filename","text","metadata","quality"],"title":"DocumentContentResponse","description":"Document content response"},"DocumentMetadata":{"properties":{"document_id":{"type":"string","title":"Document Id"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"},"file_size":{"type":"integer","title":"File Size"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"has_processed_content":{"type":"boolean","title":"Has Processed Content"}},"type":"object","required":["document_id","filename","content_type","file_size","status","created_at","has_processed_content"],"title":"DocumentMetadata","description":"Document metadata response"},"DocumentStatsResponse":{"properties":{"total_documents":{"type":"integer","title":"Total Documents"},"by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Type"},"by_policy_area":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Policy Area"},"total_amendments":{"type":"integer","title":"Total Amendments"},"total_analyses":{"type":"integer","title":"Total Analyses"},"total_strategies":{"type":"integer","title":"Total Strategies"},"total_notes":{"type":"integer","title":"Total Notes"},"total_uploaded":{"type":"integer","title":"Total Uploaded","default":0},"total_word_count":{"type":"integer","title":"Total Word Count"},"most_viewed_documents":{"items":{"$ref":"#/components/schemas/UserDocumentResponse"},"type":"array","title":"Most Viewed Documents"}},"type":"object","required":["total_documents","by_type","by_policy_area","total_amendments","total_analyses","total_strategies","total_notes","total_word_count","most_viewed_documents"],"title":"DocumentStatsResponse","description":"Schema for document statistics"},"DocumentType":{"type":"string","enum":["questionnaire","impact_assessment","draft_act","explanatory_memo","annex","factsheet","summary","inception_impact_assessment","roadmap","outcome_report","statistics","other"],"title":"DocumentType","description":"Types of consultation documents."},"DocumentVersionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"version":{"type":"integer","title":"Version"},"title":{"type":"string","title":"Title"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"parent_document_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Document Id"}},"type":"object","required":["id","version","title","updated_at"],"title":"DocumentVersionResponse","description":"Schema for document version info"},"ECLIResolution":{"properties":{"ecli":{"type":"string","title":"Ecli"},"parts":{"additionalProperties":true,"type":"object","title":"Parts"},"is_cjeu":{"type":"boolean","title":"Is Cjeu"},"e_justice_url":{"type":"string","title":"E Justice Url"},"inforcuria_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inforcuria Url"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — InforCuria for CJEU rulings, else e-Justice deep-link."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null for this endpoint — ECLI lookup is metadata-only; the ruling body is not fetched. Follow public_url to read the ruling."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null for this endpoint — see body_text note."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Year of the ECLI (the 'year' part of the identifier; full date isn't encoded)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this ECLI resolution call (stateless endpoint)."}},"type":"object","required":["ecli","parts","is_cjeu","e_justice_url"],"title":"ECLIResolution"},"EPDocumentItem":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"document_type":{"type":"string","title":"Document Type"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"},"pe_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pe Reference"},"title":{"type":"string","title":"Title"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url"},"total_amendments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Amendments"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of document_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null for this list endpoint — fetch body via the per-source detail endpoints (committee minutes, amendment docs)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null for this list endpoint."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (alias of last_updated for this union view)."}},"type":"object","required":["id","source","document_type","title"],"title":"EPDocumentItem"},"EPRSBriefingReference":{"properties":{"url":{"type":"string","title":"Url"},"title":{"type":"string","title":"Title"},"publication_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Id"}},"type":"object","required":["url","title"],"title":"EPRSBriefingReference","description":"Reference to EPRS briefing"},"EPRSItem":{"properties":{"id":{"type":"string","title":"Id"},"publication_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"publication_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Type"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"authors":{"items":{},"type":"array","title":"Authors"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"committees":{"items":{},"type":"array","title":"Committees"},"related_celex_numbers":{"items":{},"type":"array","title":"Related Celex Numbers"},"related_procedures":{"items":{},"type":"array","title":"Related Procedures"},"html_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Word Count"},"page_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Count"},"has_full_text":{"type":"boolean","title":"Has Full Text","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — html_url fallback to pdf_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (currently the publication summary — EPRS full-text lives in the source HTML behind html_url)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null for this endpoint — EPRS HTML lives on europarl.europa.eu/thinktank."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of publication_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id"],"title":"EPRSItem"},"EUSFCase":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the fund's Cohesion Open Data page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The programme's status / adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the row."},"id":{"type":"integer","title":"Id","description":"Stable Brubru row id (use it on the detail endpoint)."},"year_of_occurrence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year Of Occurrence"},"cci_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cci Number"},"applicant_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicant Country"},"name_of_disaster":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Of Disaster"},"disaster_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disaster Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"first_damage_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"First Damage Date"},"total_direct_damage_meur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Direct Damage Meur"},"eligible_emergency_cost_meur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eligible Emergency Cost Meur"},"damage_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Damage Pct"},"eusf_grant_paid_meur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eusf Grant Paid Meur"}},"type":"object","required":["id"],"title":"EUSFCase"},"EcbBody":{"properties":{"code":{"type":"string","title":"Code","description":"Body code: 'ecb' or 'ecb_ssm'."},"acronym":{"type":"string","title":"Acronym"},"name":{"type":"string","title":"Name"},"mandate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandate"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"item_counts":{"additionalProperties":true,"type":"object","title":"Item Counts","description":"Stored item count per resource type."}},"type":"object","required":["code","acronym","name"],"title":"EcbBody"},"EconomyItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the item on the institution's own website."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail endpoints; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail endpoints; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The item's own published date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the item."},"id":{"type":"integer","title":"Id","description":"Stable Brubru item id (use it on the detail endpoint)."},"body_code":{"type":"string","title":"Body Code","description":"Body code: 'ecb' or 'ecb_ssm'."},"item_type":{"type":"string","title":"Item Type","description":"news | publication | event | legal."},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind","description":"How the item was ingested: rss | html | pdf | cellar."}},"type":"object","required":["id","body_code","item_type","title"],"title":"EconomyItem"},"ElementAmendmentCount":{"properties":{"element_reference":{"type":"string","title":"Element Reference"},"element_type":{"type":"string","title":"Element Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["element_reference","element_type","count"],"title":"ElementAmendmentCount","description":"Amendment count for a legislative element."},"ElementSummary":{"properties":{"position":{"type":"string","title":"Position","description":"Human-readable position, e.g. 'Article 5', 'Recital 3'"},"element_type":{"type":"string","title":"Element Type","description":"Type: recital, article, point, paragraph, etc."},"text":{"type":"string","title":"Text","description":"Legislative text content (may be truncated)"},"element_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Element Index","description":"Index of this element in the full loaded document (for reliable placement)"}},"type":"object","required":["position","element_type","text"],"title":"ElementSummary","description":"Summary of a legislative element for AI analysis"},"EmailCampaignRequest":{"properties":{"inactive_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Inactive Days","description":"Days since last login to consider inactive","default":7},"include_never_logged_in":{"type":"boolean","title":"Include Never Logged In","description":"Include users who registered but never logged in","default":true},"dry_run":{"type":"boolean","title":"Dry Run","description":"Preview recipients without sending","default":true}},"type":"object","title":"EmailCampaignRequest","description":"Request to send re-engagement emails"},"EmailCampaignResponse":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run"},"welcome_back_recipients":{"items":{"type":"string"},"type":"array","title":"Welcome Back Recipients"},"first_time_recipients":{"items":{"type":"string"},"type":"array","title":"First Time Recipients"},"sent":{"type":"integer","title":"Sent"},"failed":{"type":"integer","title":"Failed"},"failed_addresses":{"items":{"type":"string"},"type":"array","title":"Failed Addresses"}},"type":"object","required":["dry_run","welcome_back_recipients","first_time_recipients","sent","failed","failed_addresses"],"title":"EmailCampaignResponse","description":"Response from email campaign"},"EmeetingAgendaItem":{"properties":{"id":{"type":"string","title":"Id"},"oj_reference":{"type":"string","title":"Oj Reference"},"committee_code":{"type":"string","title":"Committee Code"},"committee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Name"},"meeting_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Reference"},"title":{"type":"string","title":"Title"},"procedure_refs":{"items":{"type":"string"},"type":"array","title":"Procedure Refs","description":"OEIL procedure refs on the agenda (MEUB anchor)."},"rapporteurs":{"items":{"type":"string"},"type":"array","title":"Rapporteurs"},"document_count":{"type":"integer","title":"Document Count","default":0},"event_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Reference","description":"Ties the agenda to a calendar event."},"agenda_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Pdf Url","description":"The OJ agenda document PDF (EN)."},"items":{"items":{},"type":"array","title":"Items","description":"Full item/document tree: items[].document_sets[].documents[].pdf_url."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL — the agenda PDF (or eMeeting timeline)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text rendering of the agenda — always populated."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML rendering of the agenda — always populated."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Meeting date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this agenda."}},"type":"object","required":["id","oj_reference","committee_code","title"],"title":"EmeetingAgendaItem"},"EmeetingDocumentItem":{"properties":{"id":{"type":"string","title":"Id"},"gepro_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gepro Code","description":"Raw eMeeting document type code: PR, AM, DV, RR, AD, OJ, PV ..."},"doc_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Kind","description":"Normalised kind: draft_report, amendment, voting_list, compromise_amendments, agenda, minutes, report, opinion, adopted_text, miscellaneous."},"gepro_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gepro Description"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference","description":"PE-number, e.g. PE784.388."},"visual_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visual Reference"},"committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Code"},"committee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Name"},"oj_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Reference","description":"The agenda this document sits on."},"agenda_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Id"},"dossier_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dossier Reference"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref","description":"OEIL procedure ref (MEUB anchor)."},"item_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Title"},"document_set_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Set Type"},"rapporteurs":{"items":{"type":"string"},"type":"array","title":"Rapporteurs"},"pdf_urls":{"additionalProperties":true,"type":"object","title":"Pdf Urls","description":"{lang_code: url} — every language PDF on the meetdocs store."},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"The EN PDF (or first available)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Meeting date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id"],"title":"EmeetingDocumentItem"},"EngineCount":{"properties":{"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["engine","count"],"title":"EngineCount"},"EnrichedCarriage":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id","description":"Carriage ID (UUID)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"Legislative Train file ID/slug"},"train_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Train Id","description":"Parent train ID (UUID)"},"package_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Package Id","description":"Parent package ID (UUID)"},"package_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Slug","description":"Parent package slug"},"title":{"type":"string","title":"Title","description":"File title"},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"Human-readable short name (max ~60 chars) for headings and list rows: a curated alias, or a subject line synthesised from the official title and checked against it. Null means the caller should fall back to the instrument designation parsed from `title`. Never a substitute for `title` in legal contexts."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"File description"},"current_status":{"$ref":"#/components/schemas/CarriageStatus","description":"Current status"},"status_history":{"items":{"$ref":"#/components/schemas/StatusChange"},"type":"array","title":"Status History","description":"Status change history"},"days_in_current_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Current Status","description":"Days in current status"},"is_blocked":{"type":"boolean","title":"Is Blocked","description":"True if blocked 9+ months","default":false},"timeline":{"items":{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TimelineEntry"},"type":"array","title":"Timeline","description":"Monthly status history"},"text_type":{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TextType","description":"Legislative or non-legislative","default":"unknown"},"spotlight_tags":{"items":{"type":"string"},"type":"array","title":"Spotlight Tags","description":"Spotlight tags (e.g., 'recently_updated')"},"is_recently_updated":{"type":"boolean","title":"Is Recently Updated","description":"Marked as recently updated","default":false},"oeil_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Procedure Ref","description":"OEIL procedure reference"},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","description":"Related CELEX numbers"},"eprs_briefings":{"items":{"$ref":"#/components/schemas/EPRSBriefingReference"},"type":"array","title":"Eprs Briefings","description":"EPRS briefings"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee","description":"Lead committee code"},"opinion_committees":{"items":{"type":"string"},"type":"array","title":"Opinion Committees","description":"Opinion committees"},"committees":{"items":{"type":"string"},"type":"array","title":"Committees","description":"All involved committees"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id","description":"Rapporteur MEP ID"},"ec_priority_ids":{"items":{"type":"string"},"type":"array","title":"Ec Priority Ids","description":"EC Priority IDs"},"related_themes":{"items":{"type":"string"},"type":"array","title":"Related Themes","description":"Related theme slugs"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full URL to file page"},"scraped_at":{"type":"string","format":"date-time","title":"Scraped At"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"expected_completion":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Completion"},"oeil_procedure_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Oeil Procedure Data","description":"Full OEIL procedure data"},"oeil_timeline":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Oeil Timeline","description":"OEIL timeline events"},"oeil_key_events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Oeil Key Events","description":"Key events from OEIL"},"eurlex_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Eurlex Documents","description":"EUR-Lex documents"},"legal_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Text Url","description":"EUR-Lex legal text URL"},"eprs_matched_briefings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Eprs Matched Briefings","description":"Matched EPRS briefings"},"eprs_match_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eprs Match Confidence","description":"EPRS match confidence (0-1)"},"rapporteur_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rapporteur Data","description":"Rapporteur details"},"shadow_rapporteurs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Shadow Rapporteurs","description":"Shadow rapporteurs"},"enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enriched At"},"enrichment_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enrichment Quality","description":"Quality: high, medium, low"}},"type":"object","required":["title","current_status"],"title":"EnrichedCarriage","description":"Carriage enriched with OEIL, EUR-Lex, and EPRS data.\n\nExtends LegislativeCarriage with additional enrichment data."},"EnrichedCarriageResponse":{"properties":{"carriage":{"$ref":"#/components/schemas/EnrichedCarriage"},"related_carriages":{"items":{"$ref":"#/components/schemas/LegislativeCarriage"},"type":"array","title":"Related Carriages"},"timeline_prediction":{"anyOf":[{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TimelinePrediction"},{"type":"null"}]}},"type":"object","required":["carriage"],"title":"EnrichedCarriageResponse","description":"Response for enriched carriage endpoint"},"EnrichmentResponse":{"properties":{"entry_id":{"type":"string","title":"Entry Id"},"enriched":{"type":"boolean","title":"Enriched"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas","default":[]},"entities":{"additionalProperties":true,"type":"object","title":"Entities","default":{}},"sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment"},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","default":[]},"procedures":{"items":{"type":"string"},"type":"array","title":"Procedures","default":[]},"message":{"type":"string","title":"Message"}},"type":"object","required":["entry_id","enriched","message"],"title":"EnrichmentResponse","description":"Response for on-demand AI enrichment"},"EntrepreneurInstrumentItem":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call Id"},"framework_programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"deadline_secondary":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Secondary"},"indicative_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Indicative Budget"},"budget_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Currency","default":"EUR"},"source_url":{"type":"string","title":"Source Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"target_audience":{"items":{"type":"string"},"type":"array","title":"Target Audience"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme"},"instrument_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instrument Family"},"intermediary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intermediary"}},"type":"object","required":["id","topic_id","title","source_url"],"title":"EntrepreneurInstrumentItem"},"EntryListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"entries":{"items":{"$ref":"#/components/schemas/RSSEntryInfo"},"type":"array","title":"Entries"},"time_window_hours":{"type":"integer","title":"Time Window Hours"},"filtered_by":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filtered By"}},"type":"object","required":["total","entries","time_window_hours"],"title":"EntryListResponse","description":"Response for entry list endpoint"},"EsmBody":{"properties":{"code":{"type":"string","title":"Code","description":"Body code: 'esm'."},"acronym":{"type":"string","title":"Acronym"},"name":{"type":"string","title":"Name"},"mandate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandate"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"item_counts":{"additionalProperties":true,"type":"object","title":"Item Counts","description":"Stored item count per resource type."}},"type":"object","required":["code","acronym","name"],"title":"EsmBody"},"EuroVocConcept":{"properties":{"concept_uri":{"type":"string","title":"Concept Uri"},"label":{"type":"string","title":"Label"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"ShowVoc citizen URL for the EuroVoc concept."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Concept label (taxonomy nodes don't have a body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — taxonomy nodes are labels not documents."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — EuroVoc concepts are taxonomy entries without an adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this Cellar EuroVoc search call."}},"type":"object","required":["concept_uri","label"],"title":"EuroVocConcept"},"EuroVocTaxonomyConcept":{"properties":{"uri":{"type":"string","title":"Uri"},"notation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notation"},"concept_type":{"type":"string","title":"Concept Type","description":"domain | microthesaurus | descriptor"},"labels":{"additionalProperties":true,"type":"object","title":"Labels","description":"prefLabel per language {en,es,fr,it,nl[,ca]}"},"alt_labels":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alt Labels"},"domain_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain Uri"},"microthesaurus_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Microthesaurus Uri"},"broader_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Broader Uri"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"The concept's EuroVoc URI (stable key; links to EUR-Lex tagging)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Preferred label in the requested language."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the label."},"document_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["uri","concept_type"],"title":"EuroVocTaxonomyConcept"},"EurostatSeriesItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Eurostat Data Browser URL for the dataset."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text summary: null on list, populated on detail."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML summary: null on list, populated on detail."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Eurostat reported 'last update' for the dataset, if known."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated."},"code":{"type":"string","title":"Code","description":"Eurostat dataset code, e.g. 'hlth_ehis_pe9e', 'sport_emp_sex'."},"name":{"type":"string","title":"Name","description":"Dataset short name."},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme","description":"Brubru-curated theme: 'Sport and physical activity', 'Health, BMI, nutrition', 'Household leisure expenditure'."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"One-paragraph plain-language description."},"unit_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Hint","description":"Unit of measurement hint (e.g. 'Percentage of population', 'Thousands of persons')."},"dimensions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Dimensions","description":"Dimension list with code, name, size, and a short sample of category labels. Detail only."},"sample_observations":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sample Observations","description":"Up to 10 representative {geo, time, value} observations. Detail only."},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Full JSON-stat 2.0 payload from Eurostat: included by default on detail (set `include_payload=false` to omit)."},"payload_truncated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Payload Truncated","description":"True when `payload` is omitted (`include_payload=false`) or upstream returned an unexpected shape."}},"type":"object","required":["code","name"],"title":"EurostatSeriesItem","description":"One Eurostat sport / health dataset (list or detail shape)."},"EventItem":{"properties":{"id":{"type":"string","title":"Id","description":"Stable aggregator id (use on the detail endpoint). Prefixed by source: 'e<n>' economy, 'c<uuid>' calendar."},"body_code":{"type":"string","title":"Body Code","description":"Canonical body code the event belongs to."},"body_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Name","description":"Human-readable body name."},"families":{"items":{"type":"string"},"type":"array","title":"Families","description":"Brubru policy families this body belongs to."},"source":{"type":"string","title":"Source","description":"Which store the event came from: economy | calendar."},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type","description":"Event kind where known (calendar events)."},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue","description":"Venue / location where known."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the event on the source website."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The event's own date (start datetime)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the event."}},"type":"object","required":["id","body_code","source","title"],"title":"EventItem"},"EventStatus":{"type":"string","enum":["scheduled","confirmed","tentative","cancelled","completed","postponed"],"title":"EventStatus"},"EventType":{"type":"string","enum":["plenary_session","committee_week","committee_meeting","group_week","external_activities","recess","council_meeting","informal_meeting","european_council_summit","eurogroup","commission_college_meeting","commissioner_meeting","court_hearing","ecb_governing_council","agency_event","special_date","comitology_meeting","expert_group_meeting","grant_deadline","conference","webinar","roundtable","training","workshop"],"title":"EventType","description":"Mirror of models.eu_calendar.EventTypeEnum.\n\nThese two enums must stay in step. Migration 203 added\n`external_activities` (the EP's constituency weeks, the fourth working-week\ntype) to the database enum and the ORM, but not here — so every\n/api/eu-calendar/ response containing a constituency week failed Pydantic\nvalidation and the endpoint returned 500. My EU Calendar showed nothing for\nany month containing one, roughly nine weeks a year."},"EventsDirectory":{"properties":{"total_events":{"type":"integer","title":"Total Events"},"upcoming":{"type":"integer","title":"Upcoming"},"past":{"type":"integer","title":"Past"},"undated":{"type":"integer","title":"Undated"},"bodies_with_events":{"type":"integer","title":"Bodies With Events"},"families":{"type":"integer","title":"Families"},"earliest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Earliest"},"latest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest"}},"type":"object","required":["total_events","upcoming","past","undated","bodies_with_events","families"],"title":"EventsDirectory"},"ExamplePrompt":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"text":{"type":"string","title":"Text"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"scope":{"type":"string","title":"Scope"},"subscription_tiers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subscription Tiers"},"is_active":{"type":"boolean","title":"Is Active"},"sort_order":{"type":"integer","title":"Sort Order"},"usage_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usage Count","default":0}},"type":"object","required":["id","text","locale","scope","subscription_tiers","is_active","sort_order"],"title":"ExamplePrompt"},"ExamplePromptCreate":{"properties":{"text":{"type":"string","maxLength":500,"minLength":3,"title":"Text"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale","description":"e.g., 'en' or 'en-GB'"},"scope":{"type":"string","title":"Scope","default":"main_chat"},"subscription_tiers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subscription Tiers"},"is_active":{"type":"boolean","title":"Is Active","default":true},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order","default":0}},"type":"object","required":["text"],"title":"ExamplePromptCreate"},"ExamplePromptUpdate":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":500,"minLength":3},{"type":"null"}],"title":"Text"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"subscription_tiers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subscription Tiers"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ExamplePromptUpdate"},"ExportDocumentRequest":{"properties":{"document_content":{"type":"string","title":"Document Content","description":"Document content in markdown"},"document_title":{"type":"string","title":"Document Title"},"export_format":{"type":"string","enum":["docx","pdf"],"title":"Export Format","default":"docx"},"organisation_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Name"},"include_header":{"type":"boolean","title":"Include Header","default":true},"include_footer":{"type":"boolean","title":"Include Footer","default":true}},"type":"object","required":["document_content","document_title"],"title":"ExportDocumentRequest","description":"Request to export a document to Word/PDF"},"ExtractResult":{"properties":{"url":{"type":"string","title":"Url"},"platform":{"type":"string","title":"Platform","description":"Detected platform: ecl | drupal | wordpress | dynamics | jcms | sharepoint | spa | bespoke."},"body_code":{"type":"string","title":"Body Code"},"fetched_via":{"type":"string","title":"Fetched Via","description":"requests | browser | failed."},"item_count":{"type":"integer","title":"Item Count"},"items":{"items":{"$ref":"#/components/schemas/ExtractedItem"},"type":"array","title":"Items"}},"type":"object","required":["url","platform","body_code","fetched_via","item_count","items"],"title":"ExtractResult"},"ExtractedItem":{"properties":{"title":{"type":"string","title":"Title"},"item_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Type","description":"news | event | publication | topic | consultation | tender (caller-supplied page-level hint)."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Article body — populated only with deep=true."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Article HTML — populated only with deep=true."},"body_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Code"},"guid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guid"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind","description":"The platform handler that parsed it."},"eurovoc_descriptors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Eurovoc Descriptors","description":"EuroVoc subject descriptors (when classify=true)."}},"type":"object","required":["title"],"title":"ExtractedItem"},"FeatureAccessResponse":{"properties":{"feature":{"type":"string","title":"Feature"},"has_access":{"type":"boolean","title":"Has Access"},"current_tier":{"type":"string","title":"Current Tier"},"required_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Required Tier"}},"type":"object","required":["feature","has_access","current_tier"],"title":"FeatureAccessResponse","description":"Feature access check response"},"FeaturedExample":{"properties":{"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"position":{"type":"integer","title":"Position"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}},"type":"object","required":["eurlex_url","title","position"],"title":"FeaturedExample"},"FeaturedExamplesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FeaturedExample"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"FeaturedExamplesResponse"},"FeedCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":3,"title":"Name"},"url":{"type":"string","title":"Url","description":"RSS feed URL"},"source":{"type":"string","title":"Source","description":"Source organization"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"update_frequency_minutes":{"type":"integer","maximum":1440.0,"minimum":15.0,"title":"Update Frequency Minutes","default":60},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","url","source"],"title":"FeedCreateRequest","description":"Request to create new RSS feed"},"FeedListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"feeds":{"items":{"$ref":"#/components/schemas/RSSFeedInfo"},"type":"array","title":"Feeds"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"}},"type":"object","required":["total","feeds","sources"],"title":"FeedListResponse","description":"Response for feed list endpoint"},"FeedManagementResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"source":{"type":"string","title":"Source"},"is_active":{"type":"boolean","title":"Is Active"},"last_fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetched At"},"update_frequency_minutes":{"type":"integer","title":"Update Frequency Minutes"},"entry_count":{"type":"integer","title":"Entry Count"},"subscriber_count":{"type":"integer","title":"Subscriber Count"}},"type":"object","required":["id","name","url","source","is_active","last_fetched_at","update_frequency_minutes","entry_count","subscriber_count"],"title":"FeedManagementResponse","description":"RSS feed details for admin panel"},"FeedStatistics":{"properties":{"total_feeds":{"type":"integer","title":"Total Feeds"},"active_feeds":{"type":"integer","title":"Active Feeds"},"total_entries":{"type":"integer","title":"Total Entries"},"entries_last_24h":{"type":"integer","title":"Entries Last 24H"},"entries_last_7d":{"type":"integer","title":"Entries Last 7D"},"sources":{"additionalProperties":{"type":"integer"},"type":"object","title":"Sources"},"categories":{"additionalProperties":{"type":"integer"},"type":"object","title":"Categories"}},"type":"object","required":["total_feeds","active_feeds","total_entries","entries_last_24h","entries_last_7d","sources","categories"],"title":"FeedStatistics","description":"Feed statistics"},"FeedUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"update_frequency_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Update Frequency Minutes"}},"type":"object","title":"FeedUpdateRequest","description":"Request to update RSS feed"},"FeedbackAggregates":{"properties":{"consultation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consultation Id"},"initiative_id":{"type":"string","title":"Initiative Id"},"publication_id":{"type":"integer","title":"Publication Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"feedback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Url"},"summary_total":{"type":"integer","title":"Summary Total"},"by_user_type":{"additionalProperties":true,"type":"object","title":"By User Type"},"by_country":{"additionalProperties":true,"type":"object","title":"By Country"}},"type":"object","required":["initiative_id","publication_id","summary_total"],"title":"FeedbackAggregates","description":"Summary aggregates exposed alongside the items list."},"FeedbackCreate":{"properties":{"feedback_type":{"type":"string","title":"Feedback Type","description":"Type: bug, feature_request, general, other"},"title":{"type":"string","maxLength":200,"minLength":5,"title":"Title","description":"Feedback title"},"description":{"type":"string","minLength":10,"title":"Description","description":"Detailed description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Category (e.g., 'UI/UX', 'Performance')"},"affected_feature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Affected Feature","description":"Feature affected by bug"},"browser_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Browser Info","description":"Browser and OS info"},"device_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Device Info","description":"Device information"},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url","description":"URL to uploaded screenshot"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments","description":"Array of attachments"}},"type":"object","required":["feedback_type","title","description"],"title":"FeedbackCreate","description":"Schema for creating new feedback"},"FeedbackEnvelope":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FeedbackItem"},"type":"array","title":"Data"},"aggregates":{"$ref":"#/components/schemas/FeedbackAggregates"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data","aggregates"],"title":"FeedbackEnvelope","description":"Response envelope + aggregates. Partners get analytics + detail in one call."},"FeedbackItem":{"properties":{"feedback_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Id"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"user_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Type"},"organisation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"company_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Size"},"transparency_register_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transparency Register Number"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"attachments":{"items":{},"type":"array","title":"Attachments"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"}},"type":"object","title":"FeedbackItem"},"FeedbackItemResponse":{"properties":{"feedback_id":{"type":"integer","title":"Feedback Id"},"publication_id":{"type":"integer","title":"Publication Id"},"date":{"type":"string","title":"Date"},"user_type":{"type":"string","title":"User Type"},"organisation":{"type":"string","title":"Organisation"},"author_name":{"type":"string","title":"Author Name"},"country":{"type":"string","title":"Country"},"language":{"type":"string","title":"Language"},"company_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Size"},"transparency_register_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transparency Register Number"},"text":{"type":"string","title":"Text"},"attachments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Attachments","default":[]},"public_url":{"type":"string","title":"Public Url"}},"type":"object","required":["feedback_id","publication_id","date","user_type","organisation","author_name","country","language","text","public_url"],"title":"FeedbackItemResponse","description":"One stakeholder feedback contribution."},"FeedbackListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"feedback_items":{"items":{"$ref":"#/components/schemas/schemas__feedback_schemas__FeedbackResponse"},"type":"array","title":"Feedback Items"}},"type":"object","required":["total","page","page_size","feedback_items"],"title":"FeedbackListResponse","description":"Schema for paginated feedback list"},"FeedbackStats":{"properties":{"total_feedback":{"type":"integer","title":"Total Feedback"},"by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status"},"by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Type"},"by_priority":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Priority"},"recent_feedback":{"type":"integer","title":"Recent Feedback"},"unresolved_count":{"type":"integer","title":"Unresolved Count"}},"type":"object","required":["total_feedback","by_status","by_type","by_priority","recent_feedback","unresolved_count"],"title":"FeedbackStats","description":"Feedback statistics for admin dashboard"},"FeedbackUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"admin_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Response"},"assigned_to":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assigned To"}},"type":"object","title":"FeedbackUpdate","description":"Schema for updating feedback (admin only)"},"FeedbackUserInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}},"type":"object","required":["id","email"],"title":"FeedbackUserInfo","description":"User info for feedback responses"},"FetchEURLexRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"EUR-Lex URL"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX number"},"format":{"type":"string","title":"Format","description":"Document format: html, pdf, xml","default":"html"},"language":{"type":"string","title":"Language","description":"Language code","default":"EN"}},"type":"object","title":"FetchEURLexRequest","description":"Request to fetch document from EUR-Lex"},"FetchJobRequest":{"properties":{"days_back":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Days Back","description":"Days to look back","default":7},"countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries","description":"Country codes to fetch"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes","description":"CPV codes to filter"},"max_value":{"type":"number","minimum":0.0,"title":"Max Value","description":"Maximum tender value","default":5000000},"source":{"type":"string","title":"Source","description":"Data source: ted_api or ted_sparql","default":"ted_api"}},"type":"object","title":"FetchJobRequest","description":"Request for manual fetch job."},"FinBody":{"properties":{"code":{"type":"string","title":"Code","description":"Body code (e.g. 'eba')."},"acronym":{"type":"string","title":"Acronym"},"name":{"type":"string","title":"Name"},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family"},"mandate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandate"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"item_counts":{"additionalProperties":true,"type":"object","title":"Item Counts","description":"Stored item count per resource type."}},"type":"object","required":["code","acronym","name"],"title":"FinBody"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Ask for a reset link. Answered identically whether or not the email exists."},"FreshnessInfo":{"properties":{"last_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Update"}},"type":"object","title":"FreshnessInfo"},"FtCallProposalItem":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call Id"},"framework_programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"deadline_secondary":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Secondary"},"indicative_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Indicative Budget"},"budget_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Currency","default":"EUR"},"source_url":{"type":"string","title":"Source Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"target_audience":{"items":{"type":"string"},"type":"array","title":"Target Audience"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","topic_id","title","source_url"],"title":"FtCallProposalItem"},"FtCallTenderItem":{"properties":{"id":{"type":"string","title":"Id"},"tender_reference":{"type":"string","title":"Tender Reference"},"contracting_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contracting Authority"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"contract_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"value_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Currency","default":"EUR"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"source_url":{"type":"string","title":"Source Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"cpv_codes":{"items":{"type":"string"},"type":"array","title":"Cpv Codes"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","tender_reference","title","source_url"],"title":"FtCallTenderItem"},"FtFundedProjectItem":{"properties":{"id":{"type":"string","title":"Id"},"project_id":{"type":"string","title":"Project Id"},"project_acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Acronym"},"title":{"type":"string","title":"Title"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"framework_programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"coordinator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Name"},"coordinator_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Country"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"total_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Cost"},"eu_contribution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eu Contribution"},"cost_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Currency","default":"EUR"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"source_url":{"type":"string","title":"Source Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url — the F&T Portal project page)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Project start date (the canonical 'when this happened' date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","project_id","title","source_url"],"title":"FtFundedProjectItem"},"FtaDetail":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"work_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Uri"},"resource_type_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Uri"},"resource_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Label"},"agreement_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agreement Type"},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"date_in_force":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date In Force"},"date_end_validity":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date End Validity"},"available_languages":{"items":{"type":"string"},"type":"array","title":"Available Languages"},"eurovoc_concepts":{"items":{"type":"string"},"type":"array","title":"Eurovoc Concepts"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML manifestation when Cellar served XHTML; null when only a PDF was available."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body. Always populated when has_body=True."},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source","description":"'xhtml' or 'pdf' depending on which Cellar manifestation produced the body."},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias for body_text/body_html."},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — alias of eurlex_url."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last fetched this agreement (alias of fetched_at)."}},"type":"object","required":["celex","eurlex_url"],"title":"FtaDetail"},"FtaListItem":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"agreement_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agreement Type","description":"Brubru-derived classification: FTA, EPA, AssociationAgreement, PCA, EPCA, InterimTrade, FisheriesPartnership, Aviation, ResearchCooperation, SocialSecurity, CustomsCooperation, TaxInfoExchange, ExchangeOfLetters, Protocol, StrategicPartnership, Agreement, Other."},"partner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner","description":"Best-effort regex extract from title."},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"has_body":{"type":"boolean","title":"Has Body","description":"True if this agreement has a stored body. List rows always show False; call the detail endpoint for the body itself.","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — alias of eurlex_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + agreement type + partner + dates + in-force status. Full body on the detail endpoint."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time this row was last refreshed."}},"type":"object","required":["celex","eurlex_url"],"title":"FtaListItem"},"FundingItem":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call Id"},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme"},"title":{"type":"string","title":"Title"},"short_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Summary"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"deadline_secondary":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Secondary"},"indicative_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Indicative Budget"},"budget_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Currency","default":"EUR"},"source_url":{"type":"string","title":"Source Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"target_audience":{"items":{"type":"string"},"type":"array","title":"Target Audience"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url — the F&T Portal topic page)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","topic_id","title","source_url"],"title":"FundingItem"},"FundingPayload":{"properties":{"cordis_id":{"type":"string","title":"Cordis Id"},"project_acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Acronym"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"total_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Cost"},"eu_contribution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eu Contribution"},"cost_currency":{"type":"string","title":"Cost Currency","default":"EUR"},"legal_basis":{"items":{},"type":"array","title":"Legal Basis"},"by_organisation":{"items":{},"type":"array","title":"By Organisation"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"CORDIS URL of the parent project."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Parent project's objective as plain text."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Parent project's objective as HTML."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Parent project's start_date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the parent project."}},"type":"object","required":["cordis_id"],"title":"FundingPayload"},"GeneralPublicationItem":{"properties":{"id":{"type":"string","title":"Id"},"publication_id":{"type":"string","title":"Publication Id"},"cellar_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cellar Uri"},"title":{"type":"string","title":"Title"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","publication_id","title"],"title":"GeneralPublicationItem"},"GenerateEPQuestionRequest":{"properties":{"topic":{"type":"string","title":"Topic","description":"What the question is about (becomes the title)"},"addressee":{"type":"string","enum":["commission","council","vp_hr"],"title":"Addressee","description":"Institution addressed: commission, council, or vp_hr","default":"commission"},"question_type":{"type":"string","enum":["standard","priority"],"title":"Question Type","description":"Standard (E-) or priority (P-) question","default":"standard"},"context_description":{"type":"string","title":"Context Description","description":"Background facts, evidence, and concerns to include in the introductory section"},"legislation_references":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Legislation References","description":"Specific EU legislation to cite (e.g., 'Regulation (EU) 2021/2116')"},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources","description":"URLs or descriptions of evidence sources (news articles, audits, reports)"},"num_sub_questions":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Num Sub Questions","description":"Number of sub-questions to generate (1-3)","default":3},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area","description":"Policy area for auto-detecting relevant legislation"},"tone":{"type":"string","enum":["assertive","diplomatic","technical"],"title":"Tone","description":"Tone: assertive (default), diplomatic, or technical","default":"assertive"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference","description":"OEIL procedure reference if known"},"celex_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex Number","description":"CELEX number if known"},"language":{"type":"string","title":"Language","description":"Output language code","default":"EN"}},"type":"object","required":["topic","context_description"],"title":"GenerateEPQuestionRequest","description":"Request to generate a European Parliament written question"},"GenerateEUEmailRequest":{"properties":{"recipient_name":{"type":"string","maxLength":200,"minLength":1,"title":"Recipient Name","description":"Full name of the recipient (e.g., 'Margrethe Vestager')"},"recipient_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Recipient Title","description":"Recipient's formal title or role"},"recipient_role":{"type":"string","enum":["commissioner","cabinet_member","director_general","director","head_of_unit","policy_officer","mep","apa","ep_group_advisor","ep_committee_staff","council_attache","permrep_counsellor","ambassador","other"],"title":"Recipient Role","description":"Category that drives the salutation/register","default":"policy_officer"},"recipient_institution":{"type":"string","enum":["european_commission","european_parliament","council_eu","permanent_representation","eeas","agency","other"],"title":"Recipient Institution","default":"european_commission"},"recipient_unit":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Recipient Unit","description":"DG / Committee / Unit (e.g., 'DG ENVI', 'IMCO')"},"purpose":{"type":"string","enum":["meeting_request","follow_up","position_input","invitation","thanks","information_request","amendment_input","other"],"title":"Purpose","description":"What this email is for","default":"meeting_request"},"subject_hint":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Subject Hint","description":"If empty, the model invents a Brussels-style subject line"},"policy_file_reference":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Policy File Reference","description":"The legislative file / procedure / EUR-Lex reference the email is about (e.g., 'AI Act trilogue', '2021/0106(COD)')"},"the_ask":{"type":"string","maxLength":1000,"minLength":1,"title":"The Ask","description":"The concrete request, in plain language"},"context_notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Context Notes","description":"Background, reasons, prior exchanges, evidence to weave in"},"deadline_or_date":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Deadline Or Date","description":"Time anchor (e.g., 'before the IMCO vote on 12 June', 'next Tuesday')"},"tone":{"type":"string","enum":["standard","warm","urgent","formal"],"title":"Tone","default":"standard"},"relationship":{"type":"string","enum":["cold","warm","established"],"title":"Relationship","description":"How well the sender knows the recipient","default":"cold"},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"sender_name":{"type":"string","maxLength":200,"minLength":1,"title":"Sender Name"},"sender_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Sender Title","description":"Role / title within the sender's organisation"},"sender_org":{"type":"string","maxLength":200,"minLength":1,"title":"Sender Org"},"sender_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Sender Email"},"sender_phone":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Sender Phone"},"sender_transparency_register_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Sender Transparency Register Id","description":"EU Transparency Register identification number, included in the GDPR footer"},"logo_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Logo Storage Id","description":"storage_document_id returned by /api/documents/upload; embedded in DOCX export"}},"type":"object","required":["recipient_name","the_ask","sender_name","sender_org"],"title":"GenerateEUEmailRequest","description":"Request to generate a Brussels-style EU email or letter"},"GenerateEUPresentationRequest":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"subtitle":{"anyOf":[{"type":"string","maxLength":240},{"type":"null"}],"title":"Subtitle"},"audience":{"type":"string","enum":["commission_official","commission_cabinet","mep_office","ep_committee_staff","council_attache","permrep","academic","industry","press","general"],"title":"Audience","default":"commission_official"},"audience_label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Audience Label","description":"Free-text refinement, e.g. 'DG ENVI Unit B3'"},"purpose":{"type":"string","maxLength":600,"minLength":1,"title":"Purpose","description":"What this presentation is meant to achieve"},"key_messages":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Key Messages","description":"3-7 messages to anchor the deck"},"sections":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Sections","description":"Section headings the deck should follow"},"num_slides":{"type":"integer","maximum":30.0,"minimum":4.0,"title":"Num Slides","default":10},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"style_reference_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Style Reference Storage Id","description":"storage_document_id of a user-uploaded PPTX/PDF to learn style from"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["title","purpose"],"title":"GenerateEUPresentationRequest","description":"Slide deck for an EU-institution audience. Renders to PPTX + PDF."},"GenerateEUPressReleaseRequest":{"properties":{"institution_style":{"type":"string","enum":["commission","parliament","council","agency"],"title":"Institution Style","default":"commission"},"headline":{"type":"string","maxLength":240,"minLength":1,"title":"Headline","description":"Press release headline"},"sub_headline":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Sub Headline","description":"One-line strap below the headline"},"dateline_city":{"type":"string","maxLength":80,"title":"Dateline City","default":"Brussels"},"dateline_date":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Dateline Date","description":"Free-text date (e.g. '20 May 2026'); blank = today"},"lead_paragraph":{"type":"string","maxLength":1500,"minLength":1,"title":"Lead Paragraph","description":"The first paragraph (who/what/where/when/why)"},"key_points":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Key Points","description":"3-8 fact bullets to expand in the body"},"quote_text":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Quote Text"},"quote_attribution":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Quote Attribution","description":"e.g. 'Margrethe Vestager, Executive Vice-President'"},"background":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Background"},"next_steps":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Next Steps"},"contacts":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Contacts","description":"Press contact block, one contact per line"},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["headline","lead_paragraph"],"title":"GenerateEUPressReleaseRequest","description":"EU-format press release in Commission / EP / Council house style."},"GenerateEventPosterRequest":{"properties":{"event_title":{"type":"string","maxLength":200,"minLength":1,"title":"Event Title"},"event_tagline":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Event Tagline"},"event_date":{"type":"string","maxLength":80,"minLength":1,"title":"Event Date","description":"Human-readable date / time"},"event_location":{"type":"string","maxLength":160,"minLength":1,"title":"Event Location","description":"Venue + city"},"event_type":{"type":"string","enum":["conference","panel","webinar","roundtable","workshop","launch","other"],"title":"Event Type","default":"panel"},"hosts":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Hosts","description":"Hosting organisations"},"speakers":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Speakers","description":"One per line: 'Name -- Title, Organisation'"},"agenda_points":{"items":{"type":"string"},"type":"array","maxItems":12,"title":"Agenda Points"},"registration_url":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Registration Url"},"contact_info":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Contact Info"},"format":{"type":"string","enum":["a4_portrait","a4_landscape","a3_portrait","instagram_square","linkedin_landscape"],"title":"Format","default":"a4_portrait"},"accent_color":{"type":"string","maxLength":12,"title":"Accent Color","description":"Hex colour for the poster's brand accent","default":"#0066cc"},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"style_reference_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Style Reference Storage Id"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["event_title","event_date","event_location"],"title":"GenerateEventPosterRequest","description":"Single-page event poster on an EU-policy topic."},"GenerateImpactAssessmentRequest":{"properties":{"initiative_title":{"type":"string","maxLength":300,"minLength":1,"title":"Initiative Title"},"policy_area":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Policy Area","description":"DG / policy area (e.g. 'DG ENVI', 'Digital Single Market')"},"problem_definition":{"type":"string","maxLength":3000,"minLength":1,"title":"Problem Definition","description":"Plain-language description of the problem"},"drivers":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Drivers","description":"Causal drivers of the problem"},"objectives_general":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Objectives General"},"objectives_specific":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Objectives Specific"},"baseline_scenario":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Baseline Scenario","description":"What happens if EU takes no further action"},"policy_options":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Policy Options","description":"Policy options to compare (option 0 = baseline)"},"impact_dimensions":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Impact Dimensions","description":"Dimensions to score in the impact table"},"preferred_option_hint":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Preferred Option Hint"},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"style_reference_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Style Reference Storage Id"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["initiative_title","problem_definition"],"title":"GenerateImpactAssessmentRequest","description":"Impact assessment in the European Commission Better Regulation template."},"GenerateMEPBriefingRequest":{"properties":{"mep_name":{"type":"string","title":"Mep Name","description":"Name of the MEP"},"political_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group","description":"Political group (EPP, S&D, etc.)"},"nationality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nationality","description":"MEP's nationality"},"committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee","description":"Relevant committee"},"legislative_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legislative File Id"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"},"legislation_title":{"type":"string","title":"Legislation Title"},"position":{"type":"string","enum":["support","support_with_amendments","oppose","neutral"],"title":"Position"},"the_ask":{"type":"string","title":"The Ask","description":"The specific action you want the MEP to take"},"key_points":{"items":{"type":"string"},"type":"array","maxItems":5,"minItems":1,"title":"Key Points","description":"Key points (1-5)"},"voting_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voting Recommendation","description":"Specific voting recommendation"},"organisation_name":{"type":"string","title":"Organisation Name"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"mep_priorities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mep Priorities","description":"Known priorities of this MEP"},"national_angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Angle","description":"How this affects their country"},"language":{"type":"string","title":"Language","default":"EN"}},"type":"object","required":["mep_name","legislation_title","position","the_ask","key_points","organisation_name"],"title":"GenerateMEPBriefingRequest","description":"Request to generate an MEP briefing note"},"GenerateOnePagerRequest":{"properties":{"topic":{"type":"string","maxLength":300,"minLength":1,"title":"Topic","description":"Topic or legislative file the one-pager is about"},"procedure_reference":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Procedure Reference"},"celex_number":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Celex Number"},"organisation_name":{"type":"string","maxLength":200,"minLength":1,"title":"Organisation Name"},"organisation_pitch":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Organisation Pitch","description":"One- or two-sentence elevator pitch for the organisation"},"position":{"type":"string","enum":["support","support_with_amendments","oppose","neutral"],"title":"Position","default":"support_with_amendments"},"headline_ask":{"type":"string","maxLength":300,"minLength":1,"title":"Headline Ask","description":"The single most important ask, rendered as the H1"},"key_asks":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Key Asks","description":"2-5 short bullet asks"},"supporting_evidence":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Supporting Evidence","description":"Data, citations, numbers to ground the asks"},"tone":{"type":"string","enum":["constructive","critical","technical","diplomatic"],"title":"Tone","default":"constructive"},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"style_reference_storage_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Style Reference Storage Id","description":"storage_document_id of a user-uploaded one-pager to learn style from"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["topic","organisation_name","headline_ask"],"title":"GenerateOnePagerRequest","description":"One-page position paper, strict 600-word ceiling, single-sheet layout."},"GeneratePetitionRequest":{"properties":{"topic":{"type":"string","title":"Topic","description":"Subject of the petition"},"context_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Description","description":"Background and facts for the petition (optional; the AI keeps unverified facts as bracketed placeholders for the petitioner to complete)"},"petitioner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Petitioner Name","description":"Name or organisation of the petitioner"},"language":{"type":"string","title":"Language","description":"Language code (en, es, ca, fr, it, nl)","default":"en"}},"type":"object","required":["topic"],"title":"GeneratePetitionRequest","description":"Request to generate a petition to the European Parliament (Committee on Petitions, PETI)"},"GeneratePositionPaperRequest":{"properties":{"legislative_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legislative File Id","description":"ID of tracked legislative file"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference","description":"OEIL procedure reference e.g. 2021/0106(COD)"},"celex_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex Number","description":"CELEX number if known"},"legislation_title":{"type":"string","title":"Legislation Title","description":"Title of the legislation"},"position":{"type":"string","enum":["support","support_with_amendments","oppose","neutral"],"title":"Position","description":"Overall position on the legislation"},"key_asks":{"items":{"$ref":"#/components/schemas/KeyAsk"},"type":"array","maxItems":5,"minItems":1,"title":"Key Asks","description":"Key policy asks (1-5)"},"organisation_name":{"type":"string","title":"Organisation Name","description":"Name of the organisation"},"organisation_type":{"type":"string","enum":["company","industry_association","ngo","think_tank","law_firm","consultancy"],"title":"Organisation Type","description":"Type of organisation"},"tone":{"type":"string","enum":["constructive","critical","technical","diplomatic"],"title":"Tone","description":"Tone of the document","default":"constructive"},"organisation_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Description","description":"Brief description of organisation"},"sector_impact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector Impact","description":"How this affects your sector"},"additional_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Context","description":"Any additional context to include"},"include_executive_summary":{"type":"boolean","title":"Include Executive Summary","default":true},"include_amendments":{"type":"boolean","title":"Include Amendments","description":"Include specific amendment proposals","default":true},"language":{"type":"string","title":"Language","description":"Output language code","default":"EN"}},"type":"object","required":["legislation_title","position","key_asks","organisation_name","organisation_type"],"title":"GeneratePositionPaperRequest","description":"Request to generate a position paper"},"GenerateProposalsRequest":{"properties":{"document_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Document Ids","default":[]},"focus_areas":{"items":{"type":"string"},"type":"array","title":"Focus Areas","default":[]}},"type":"object","title":"GenerateProposalsRequest","description":"Request to generate proposals."},"GenerateResolutionRequest":{"properties":{"topic":{"type":"string","title":"Topic","description":"Title/topic of the resolution (e.g., 'The situation of human rights in Iran')"},"context_description":{"type":"string","title":"Context Description","description":"Background context for generating 'whereas' recitals (A., B., C., ...)"},"key_demands":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Key Demands","description":"Key demands (each becomes a numbered resolution point with an active verb). Optional - AI infers from context."},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference","description":"Procedure reference if known (e.g., 2025/2500(RSP))"},"additional_references":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Additional References","description":"Specific treaties, regulations, or previous resolutions to cite in 'having regard to' section"},"language":{"type":"string","title":"Language","description":"Output language code","default":"EN"}},"type":"object","required":["topic","context_description"],"title":"GenerateResolutionRequest","description":"Request to generate a European Parliament Resolution draft"},"GenerateStakeholderMapRequest":{"properties":{"policy_topic":{"type":"string","maxLength":300,"minLength":1,"title":"Policy Topic"},"procedure_reference":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Procedure Reference"},"celex_number":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Celex Number"},"scope":{"type":"string","enum":["eu","national","both"],"title":"Scope","default":"eu"},"sector":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Sector","description":"Sector / industry context (e.g. 'medtech', 'fintech')"},"objectives":{"type":"string","maxLength":1000,"minLength":1,"title":"Objectives","description":"What the user wants to achieve on this file"},"known_stakeholders":{"items":{"type":"string"},"type":"array","maxItems":30,"title":"Known Stakeholders","description":"Pre-seeded names to include in the map"},"institutions_to_cover":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Institutions To Cover"},"target_count":{"type":"integer","maximum":40.0,"minimum":4.0,"title":"Target Count","description":"How many stakeholder rows the AI should produce","default":12},"language":{"type":"string","enum":["en","fr"],"title":"Language","default":"en"},"branding":{"$ref":"#/components/schemas/BrandingBlock"}},"type":"object","required":["policy_topic","objectives"],"title":"GenerateStakeholderMapRequest","description":"Structured stakeholder mapping for an EU policy file."},"GenerateTalkingPointsRequest":{"properties":{"meeting_with":{"type":"string","title":"Meeting With","description":"Who the meeting is with (name/title)"},"meeting_institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Institution","description":"Institution (Commission, Parliament, etc.)"},"meeting_purpose":{"type":"string","title":"Meeting Purpose","description":"Purpose of the meeting"},"legislative_file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legislative File Id"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"},"topic":{"type":"string","title":"Topic","description":"Main topic of discussion"},"key_messages":{"items":{"type":"string"},"type":"array","maxItems":5,"minItems":1,"title":"Key Messages","description":"Key messages to convey"},"key_asks":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":1,"title":"Key Asks","description":"Specific asks for the meeting"},"organisation_name":{"type":"string","title":"Organisation Name"},"topics_to_avoid":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topics To Avoid","description":"Topics to avoid or handle carefully"},"anticipated_questions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Anticipated Questions","description":"Questions they might ask"},"language":{"type":"string","title":"Language","default":"EN"}},"type":"object","required":["meeting_with","meeting_purpose","topic","key_messages","key_asks","organisation_name"],"title":"GenerateTalkingPointsRequest","description":"Request to generate talking points for a meeting"},"GeneratedDocument":{"properties":{"document_type":{"type":"string","title":"Document Type","description":"Type of document generated"},"title":{"type":"string","title":"Title","description":"Document title"},"content":{"type":"string","title":"Content","description":"Full document content in markdown"},"sections":{"additionalProperties":true,"type":"object","title":"Sections","description":"Document broken into named sections"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"word_count":{"type":"integer","title":"Word Count"},"language":{"type":"string","title":"Language"},"legislative_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Legislative Context","description":"Legislative context that was used"},"editable_sections":{"items":{"type":"string"},"type":"array","title":"Editable Sections","description":"List of section names that can be edited"}},"type":"object","required":["document_type","title","content","sections","word_count","language","editable_sections"],"title":"GeneratedDocument","description":"Response containing generated document"},"GiDetail":{"properties":{"gi_identifier":{"type":"string","title":"Gi Identifier"},"protected_names":{"items":{"type":"string"},"type":"array","title":"Protected Names"},"file_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Number"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"third_country_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Third Country Flag"},"map_locations":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Map Locations"},"gi_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gi Type"},"product_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Type"},"product_categories":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Product Categories"},"cn_classification":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Cn Classification"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"eu_protection_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Eu Protection Date"},"modification_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modification Date"},"amendments_in_progress":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Amendments In Progress"},"removed_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Removed Flag"},"legal_instrument":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Legal Instrument"},"publications":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Publications"},"single_document":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Single Document"},"summary_sheets":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Summary Sheets"},"transcriptions":{"anyOf":[{},{"type":"null"}],"title":"Transcriptions"},"amendments":{"anyOf":[{},{"type":"null"}],"title":"Amendments"},"producer_group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Name"},"producer_group_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Email"},"producer_group_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Phone"},"producer_group_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Url"},"producer_group_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Address"},"producer_group_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Group Country"},"producer_group_updated_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Producer Group Updated On"},"competent_control_authorities":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Competent Control Authorities"},"recognised_producers_group":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Recognised Producers Group"},"sustainability_reports":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Sustainability Reports"},"source":{"type":"string","title":"Source"},"giview_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Giview Source"},"giview_database":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Giview Database"},"eambrosia_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eambrosia Url"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias for body_text/body_html."},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"EU protection date (alias of eu_protection_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this row (alias of fetched_at)."}},"type":"object","required":["gi_identifier","source"],"title":"GiDetail"},"GiListItem":{"properties":{"gi_identifier":{"type":"string","title":"Gi Identifier"},"protected_names":{"items":{"type":"string"},"type":"array","title":"Protected Names"},"file_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Number"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"gi_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gi Type","description":"PDO / PGI / TSG / GI"},"product_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Type","description":"WINE / SPIRIT / FOOD / AROMATISED / etc."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"eu_protection_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Eu Protection Date"},"third_country_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Third Country Flag"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"source":{"type":"string","title":"Source","description":"eambrosia / giview / merged"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: protected names + type + countries + product + protection date + status."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"EU protection date (alias of eu_protection_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this row."}},"type":"object","required":["gi_identifier","source"],"title":"GiListItem"},"GiTypeCount":{"properties":{"gi_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gi Type"},"product_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["gi_type","product_type","count"],"title":"GiTypeCount"},"GoogleAuthRequest":{"properties":{"access_token":{"type":"string","title":"Access Token"},"claim_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Token"}},"type":"object","required":["access_token"],"title":"GoogleAuthRequest","description":"Google OAuth authentication request"},"GreetingResponse":{"properties":{"message":{"type":"string","title":"Message"},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata"},"policy_hooks":{"items":{"$ref":"#/components/schemas/PolicyHook"},"type":"array","title":"Policy Hooks","default":[]}},"type":"object","required":["message","metadata"],"title":"GreetingResponse"},"GridColumn":{"properties":{"key":{"type":"string","title":"Key","description":"One of the canonical column keys (see COLUMN_KEYS)"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Display label; defaults to canonical label"}},"type":"object","required":["key"],"title":"GridColumn"},"GridCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"file_refs":{"items":{"type":"string"},"type":"array","title":"File Refs","description":"CELEX or OEIL references"},"columns":{"items":{"$ref":"#/components/schemas/GridColumn"},"type":"array","title":"Columns"}},"type":"object","required":["name"],"title":"GridCreate"},"GridDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"file_refs":{"items":{"type":"string"},"type":"array","title":"File Refs"},"columns":{"items":{"$ref":"#/components/schemas/GridColumn"},"type":"array","title":"Columns"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"cell_count":{"type":"integer","title":"Cell Count","default":0},"cells":{"items":{"$ref":"#/components/schemas/CellOut"},"type":"array","title":"Cells"},"file_metadata":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"File Metadata"}},"type":"object","required":["id","name","file_refs","columns","created_at","updated_at"],"title":"GridDetail"},"GridList":{"properties":{"grids":{"items":{"$ref":"#/components/schemas/GridSummary"},"type":"array","title":"Grids"},"total":{"type":"integer","title":"Total"},"tier_limits":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tier Limits"}},"type":"object","required":["grids","total","tier_limits"],"title":"GridList"},"GridPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"file_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Refs"},"columns":{"anyOf":[{"items":{"$ref":"#/components/schemas/GridColumn"},"type":"array"},{"type":"null"}],"title":"Columns"}},"type":"object","title":"GridPatch"},"GridSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"file_refs":{"items":{"type":"string"},"type":"array","title":"File Refs"},"columns":{"items":{"$ref":"#/components/schemas/GridColumn"},"type":"array","title":"Columns"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"cell_count":{"type":"integer","title":"Cell Count","default":0}},"type":"object","required":["id","name","file_refs","columns","created_at","updated_at"],"title":"GridSummary"},"GroupAmendmentCount":{"properties":{"political_group":{"type":"string","title":"Political Group"},"count":{"type":"integer","title":"Count"},"percentage":{"type":"number","title":"Percentage","default":0.0}},"type":"object","required":["political_group","count"],"title":"GroupAmendmentCount","description":"Amendment count for a political group."},"GroupPositionResponse":{"properties":{"group_code":{"type":"string","title":"Group Code"},"group_name":{"type":"string","title":"Group Name"},"predicted_position":{"type":"string","title":"Predicted Position"},"confidence":{"type":"number","title":"Confidence"},"expected_cohesion":{"type":"number","title":"Expected Cohesion"},"prob_for":{"type":"number","title":"Prob For"},"prob_against":{"type":"number","title":"Prob Against"},"prob_abstention":{"type":"number","title":"Prob Abstention"},"factors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Factors","default":[]}},"type":"object","required":["group_code","group_name","predicted_position","confidence","expected_cohesion","prob_for","prob_against","prob_abstention"],"title":"GroupPositionResponse","description":"Group position prediction response."},"GuideDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"category":{"type":"string","title":"Category"},"markdown":{"type":"string","title":"Markdown"},"chars":{"type":"integer","title":"Chars"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["slug","title","category","markdown","chars"],"title":"GuideDetail"},"GuideListResult":{"properties":{"count":{"type":"integer","title":"Count"},"guides":{"items":{"$ref":"#/components/schemas/GuideSummary"},"type":"array","title":"Guides"}},"type":"object","required":["count","guides"],"title":"GuideListResult"},"GuideSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"category":{"type":"string","title":"Category"},"summary":{"type":"string","title":"Summary"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"chars":{"type":"integer","title":"Chars"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"}},"type":"object","required":["slug","title","category","summary","chars"],"title":"GuideSummary"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentifyResult":{"properties":{"kind":{"type":"string","title":"Kind"},"value":{"type":"string","title":"Value"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url"},"brubru_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brubru Url"},"showvoc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showvoc Url"},"parts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parts"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical EU URL for the identifier (alias of canonical_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null — an identifier match has no body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — an identifier match has no body."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — identifiers are not dated documents."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this identifier was resolved (server time)."}},"type":"object","required":["kind","value"],"title":"IdentifyResult"},"ImpactBlockResponse":{"properties":{"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"title":{"type":"string","title":"Title"},"headline":{"type":"string","title":"Headline"},"what_it_is":{"type":"string","title":"What It Is"},"why_it_touches_you":{"type":"string","title":"Why It Touches You"},"what_to_watch":{"type":"string","title":"What To Watch"},"actions_you_can_take":{"items":{"$ref":"#/components/schemas/ActionLinkResponse"},"type":"array","title":"Actions You Can Take"},"matched_policy_areas":{"items":{"type":"string"},"type":"array","title":"Matched Policy Areas"},"matched_sectors":{"items":{"type":"string"},"type":"array","title":"Matched Sectors"},"user_profile_was_partial":{"type":"boolean","title":"User Profile Was Partial"}},"type":"object","required":["procedure_ref","title","headline","what_it_is","why_it_touches_you","what_to_watch","actions_you_can_take","matched_policy_areas","matched_sectors","user_profile_was_partial"],"title":"ImpactBlockResponse"},"ImproveTextRequest":{"properties":{"drafted_text":{"type":"string","minLength":1,"title":"Drafted Text","description":"The user's current drafted amendment text"},"original_text":{"type":"string","title":"Original Text","description":"The original legislative text being amended","default":""},"element_type":{"type":"string","title":"Element Type","description":"Type: recital, article, point, paragraph, etc."},"element_position":{"type":"string","title":"Element Position","description":"Position reference, e.g. 'Article 5'"},"amendment_type":{"type":"string","title":"Amendment Type","description":"modification or addition"},"document_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Title","description":"Title of the legislative document"}},"type":"object","required":["drafted_text","element_type","element_position","amendment_type"],"title":"ImproveTextRequest","description":"Request to improve user-drafted amendment text with AI"},"ImproveTextResponse":{"properties":{"improved_text":{"type":"string","title":"Improved Text"},"changes_summary":{"type":"string","title":"Changes Summary"},"ai_provider":{"type":"string","title":"Ai Provider"},"ai_model":{"type":"string","title":"Ai Model"}},"type":"object","required":["improved_text","changes_summary","ai_provider","ai_model"],"title":"ImproveTextResponse","description":"Response containing AI-improved amendment text"},"InfringementItem":{"properties":{"id":{"type":"string","title":"Id"},"inf_reference":{"type":"string","title":"Inf Reference"},"member_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member State"},"procedure_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Stage"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"decision_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Decision Date"},"source_url":{"type":"string","title":"Source Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"related_celex":{"items":{"type":"string"},"type":"array","title":"Related Celex"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — source_url fallback to pdf_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — the procedure summary when present."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — infringement decisions are PDF-source."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Decision date (alias of decision_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","inf_reference","title","source_url"],"title":"InfringementItem"},"InstitutionInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"short_name":{"type":"string","title":"Short Name"},"mdi_icon":{"type":"string","title":"Mdi Icon"},"colour":{"type":"string","title":"Colour"},"calendar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calendar Url"}},"type":"object","required":["code","name","short_name","mdi_icon","colour"],"title":"InstitutionInfo","description":"Institution info for frontend display."},"InstitutionType":{"type":"string","enum":["EP","COUNCIL","EUROPEAN_COUNCIL","COMMISSION","ECJ","ECB","ESMA","EMA","EBA","EIOPA","COR","EESC","EDPS","OMBUDSMAN","EIB","ECA","ECHA","ENISA","EUIPO","EUAA","EUROJUST","FRA","EU_OSHA","EUROFOUND","ACER","ECDC","AMLA","CEPOL","EIT","CPVO","EMSA","EEAS","FUNDING","THIRD_PARTY"],"title":"InstitutionType"},"InstitutionalFeedsResponse":{"properties":{"institution":{"type":"string","title":"Institution"},"total_feeds":{"type":"integer","title":"Total Feeds"},"feeds":{"items":{"$ref":"#/components/schemas/RSSFeedInfo"},"type":"array","title":"Feeds"},"total_entries":{"type":"integer","title":"Total Entries"}},"type":"object","required":["institution","total_feeds","feeds","total_entries"],"title":"InstitutionalFeedsResponse","description":"Response for institutional feeds"},"IntlCoopItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL (FTS)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"FTS record date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru ingested it."},"id":{"type":"integer","title":"Id"},"beneficiary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary","description":"Who received the money."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Beneficiary country."},"amount_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Eur","description":"EU commitment (total), EUR."},"funding_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Type","description":"Grant | Procurement contract | Contribution agreement."},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme","description":"Full FTS programme string."},"programme_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme Key","description":"ndici | ipa3 | humanitarian."},"dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg","description":"Responsible Commission department (DG)."},"contract_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Ref","description":"Legal commitment reference."},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year","description":"FTS budget year."},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"What the money was for."}},"type":"object","required":["id"],"title":"IntlCoopItem"},"JrcDatasetDetail":{"properties":{"uuid":{"type":"string","title":"Uuid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"},"distributions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Distributions"},"public_url":{"type":"string","title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias."},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"}},"type":"object","required":["uuid","public_url"],"title":"JrcDatasetDetail"},"JrcDatasetItem":{"properties":{"uuid":{"type":"string","title":"Uuid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Modified"},"public_url":{"type":"string","title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false}},"type":"object","required":["uuid","public_url"],"title":"JrcDatasetItem"},"JustifyRequest":{"properties":{"original_text":{"type":"string","title":"Original Text","description":"Original legislative text","default":""},"proposed_text":{"type":"string","title":"Proposed Text","description":"Proposed amended text","default":""},"amendment_type":{"type":"string","title":"Amendment Type","description":"modification, suppression, or addition","default":"modification"},"policy_rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Rationale","description":"The user's policy reason for the amendment"},"element_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Position","description":"Position reference, e.g. 'Article 5'"}},"type":"object","title":"JustifyRequest","description":"Request to generate a justification for an amendment"},"JustifyResponse":{"properties":{"justification":{"type":"string","title":"Justification"},"ai_provider":{"type":"string","title":"Ai Provider"},"ai_model":{"type":"string","title":"Ai Model"}},"type":"object","required":["justification","ai_provider","ai_model"],"title":"JustifyResponse","description":"Response containing an AI-drafted justification"},"KbChangelogEntry":{"properties":{"date":{"type":"string","title":"Date"},"action":{"type":"string","title":"Action"},"guide":{"type":"string","title":"Guide"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"refs":{"items":{"type":"string"},"type":"array","title":"Refs","default":[]}},"type":"object","required":["date","action","guide","title","summary"],"title":"KbChangelogEntry"},"KbChangelogResult":{"properties":{"count":{"type":"integer","title":"Count"},"entries":{"items":{"$ref":"#/components/schemas/KbChangelogEntry"},"type":"array","title":"Entries"}},"type":"object","required":["count","entries"],"title":"KbChangelogResult"},"KeyAsk":{"properties":{"summary":{"type":"string","title":"Summary","description":"Brief summary of the ask (1 sentence)"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"More detailed explanation"},"article_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article Reference","description":"Specific article/recital reference"}},"type":"object","required":["summary"],"title":"KeyAsk","description":"A specific policy ask/recommendation"},"KnowledgeGuideItem":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"quick_facts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quick Facts"},"triggers":{"items":{},"type":"array","title":"Triggers"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"content_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Preview"},"full_content_chars":{"type":"integer","title":"Full Content Chars","default":0},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing URL — the guides index (guides have no per-guide public page)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"The guide's markdown body (mirrors `content` at the requested detail level)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Always null — guides are not rendered to HTML."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Always null — guides are not dated documents."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Always null — guides are not per-row timestamped."}},"type":"object","required":["id","title"],"title":"KnowledgeGuideItem"},"LanguageMentionsMonthBucket":{"properties":{"month":{"type":"string","format":"date","title":"Month"},"keyword":{"type":"string","title":"Keyword"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["month","keyword","count"],"title":"LanguageMentionsMonthBucket"},"LanguageMentionsResponse":{"properties":{"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"since":{"type":"string","format":"date","title":"Since"},"buckets":{"items":{"$ref":"#/components/schemas/LanguageMentionsMonthBucket"},"type":"array","title":"Buckets"},"total":{"type":"integer","title":"Total"},"note":{"type":"string","title":"Note","default":"Counts include eu_laws + texts_adopted + legislative_carriages + rss_entries. Each row is counted once per keyword it matches."}},"type":"object","required":["keywords","since","buckets","total"],"title":"LanguageMentionsResponse"},"LawItem":{"properties":{"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"adopted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Adopted On","description":"Adoption / publication date"},"oj_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Reference"},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"},"legal_basis":{"items":{},"type":"array","title":"Legal Basis"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Url","description":"Brubru endpoint for the full body (XML or plain text). Call this URL to retrieve the actual law content."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of eurlex_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null on list — call /laws/{celex}/text for the body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null on list — call /laws/{celex}/text for the body."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Adoption / publication date (alias of adopted_on)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this CELEX (eu_laws.created_at)."}},"type":"object","title":"LawItem"},"LawTextResponse":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type"},"adopted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Adopted On"},"format":{"type":"string","title":"Format","description":"xml | plain"},"content":{"type":"string","title":"Content"},"content_length":{"type":"integer","title":"Content Length"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of eurlex_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — populated when format=plain (mirrors `content`)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML/XHTML body — populated when format=xml (mirrors `content`)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Adoption / publication date (alias of adopted_on)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this CELEX."}},"type":"object","required":["celex","format","content","content_length"],"title":"LawTextResponse"},"LegislationTrackingResponse":{"properties":{"celex_number":{"type":"string","title":"Celex Number"},"status":{"type":"string","title":"Status"},"related_amendments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Amendments"},"related_rss_entries":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Rss Entries"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"},"last_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Update"}},"type":"object","required":["celex_number","status","related_amendments","related_rss_entries","procedure_reference","last_update"],"title":"LegislationTrackingResponse","description":"Response with tracking information."},"LegislativeCarriage":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id","description":"Carriage ID (UUID)"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"Legislative Train file ID/slug"},"train_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Train Id","description":"Parent train ID (UUID)"},"package_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Package Id","description":"Parent package ID (UUID)"},"package_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Package Slug","description":"Parent package slug"},"title":{"type":"string","title":"Title","description":"File title"},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title","description":"Human-readable short name (max ~60 chars) for headings and list rows: a curated alias, or a subject line synthesised from the official title and checked against it. Null means the caller should fall back to the instrument designation parsed from `title`. Never a substitute for `title` in legal contexts."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"File description"},"current_status":{"$ref":"#/components/schemas/CarriageStatus","description":"Current status"},"status_history":{"items":{"$ref":"#/components/schemas/StatusChange"},"type":"array","title":"Status History","description":"Status change history"},"days_in_current_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Current Status","description":"Days in current status"},"is_blocked":{"type":"boolean","title":"Is Blocked","description":"True if blocked 9+ months","default":false},"timeline":{"items":{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TimelineEntry"},"type":"array","title":"Timeline","description":"Monthly status history"},"text_type":{"$ref":"#/components/schemas/schemas__scrapers__legislative_train_schemas__TextType","description":"Legislative or non-legislative","default":"unknown"},"spotlight_tags":{"items":{"type":"string"},"type":"array","title":"Spotlight Tags","description":"Spotlight tags (e.g., 'recently_updated')"},"is_recently_updated":{"type":"boolean","title":"Is Recently Updated","description":"Marked as recently updated","default":false},"oeil_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Procedure Ref","description":"OEIL procedure reference"},"celex_numbers":{"items":{"type":"string"},"type":"array","title":"Celex Numbers","description":"Related CELEX numbers"},"eprs_briefings":{"items":{"$ref":"#/components/schemas/EPRSBriefingReference"},"type":"array","title":"Eprs Briefings","description":"EPRS briefings"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee","description":"Lead committee code"},"opinion_committees":{"items":{"type":"string"},"type":"array","title":"Opinion Committees","description":"Opinion committees"},"committees":{"items":{"type":"string"},"type":"array","title":"Committees","description":"All involved committees"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id","description":"Rapporteur MEP ID"},"ec_priority_ids":{"items":{"type":"string"},"type":"array","title":"Ec Priority Ids","description":"EC Priority IDs"},"related_themes":{"items":{"type":"string"},"type":"array","title":"Related Themes","description":"Related theme slugs"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full URL to file page"},"scraped_at":{"type":"string","format":"date-time","title":"Scraped At"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"expected_completion":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Completion"}},"type":"object","required":["title","current_status"],"title":"LegislativeCarriage","description":"Individual legislative file within a train"},"LegislativePackage":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id","description":"Package ID (UUID)"},"slug":{"type":"string","title":"Slug","description":"URL slug (e.g., 'package-vision-for-agriculture-and-food')"},"name":{"type":"string","title":"Name","description":"Package name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id","description":"Parent package ID"},"parent_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Slug","description":"Parent package slug"},"is_sub_package":{"type":"boolean","title":"Is Sub Package","description":"True if this is a sub-package","default":false},"status_counts":{"$ref":"#/components/schemas/PackageStatusCounts"},"ec_priorities":{"items":{"type":"string"},"type":"array","title":"Ec Priorities","description":"EC Priority codes"},"ep_committees":{"items":{"type":"string"},"type":"array","title":"Ep Committees","description":"EP Committee codes"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full URL to package page"},"scraped_at":{"type":"string","format":"date-time","title":"Scraped At"}},"type":"object","required":["slug","name"],"title":"LegislativePackage","description":"Package within the Legislative Train (NEW in 2025).\n\nPackages are thematic groupings that can have sub-packages.\nExample: \"Vision for Agriculture and Food\" contains sub-packages\nlike \"Sustainable food systems\" and \"Animal welfare\"."},"LegislativeTrain":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id","description":"Train ID (UUID)"},"priority_number":{"type":"integer","maximum":7.0,"minimum":1.0,"title":"Priority Number","description":"Priority number (1-7)"},"name":{"type":"string","title":"Name","description":"Priority name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"commission_term":{"type":"string","title":"Commission Term","description":"Commission term","default":"2024-2029"},"theme_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Slug","description":"URL slug for this priority theme"},"total_files":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Files","description":"Total legislative files","default":0},"files_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Files By Status","description":"Files count by status"},"packages":{"items":{"$ref":"#/components/schemas/LegislativePackage"},"type":"array","title":"Packages","description":"Packages in this train"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full URL to train page"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["priority_number","name"],"title":"LegislativeTrain","description":"EC Priority 'train' with grouped legislative files"},"LifecycleResult":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical EU URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (null when the resource has no inline body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (null when the resource has no inline body)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The resource's document date, when applicable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated/ingested this (server time)."},"celex":{"type":"string","title":"Celex"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"date_in_force":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date In Force"},"date_end_validity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date End Validity"},"repealed_or_expired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Repealed Or Expired","description":"True when an end-of-validity date is set."}},"type":"object","required":["celex"],"title":"LifecycleResult"},"LinkedInCallbackRequest":{"properties":{"code":{"type":"string","title":"Code"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"claim_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Token"}},"type":"object","required":["code","redirect_uri"],"title":"LinkedInCallbackRequest","description":"LinkedIn OAuth callback request"},"LobbyNewsItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"EU Transparency Register detail page for the organisation."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text profile composition."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML profile composition."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the organisation's most recent news item."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this profile row."},"identification_code":{"type":"string","title":"Identification Code"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"item_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind","description":"rss / atom / sitemap / html."}},"type":"object","required":["identification_code"],"title":"LobbyNewsItem"},"MEPAmendmentCrossRefResponse":{"properties":{"author_name":{"type":"string","title":"Author Name"},"total_amendments":{"type":"integer","title":"Total Amendments"},"procedures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Procedures","description":"[{procedure_ref, count, committees}]"},"items":{"items":{"$ref":"#/components/schemas/MEPAmendmentResponse"},"type":"array","title":"Items"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["author_name","total_amendments","items","limit","offset"],"title":"MEPAmendmentCrossRefResponse","description":"Cross-procedure amendment results for a specific MEP."},"MEPAmendmentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MEPAmendmentResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters Applied"}},"type":"object","required":["items","total","limit","offset"],"title":"MEPAmendmentListResponse","description":"Paginated list of amendments with filters."},"MEPAmendmentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"procedure_reference":{"type":"string","title":"Procedure Reference"},"committee_code":{"type":"string","title":"Committee Code"},"pe_reference":{"type":"string","title":"Pe Reference"},"amendment_number":{"type":"integer","title":"Amendment Number"},"author_names":{"items":{"type":"string"},"type":"array","title":"Author Names"},"political_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group"},"on_behalf_of_group":{"type":"boolean","title":"On Behalf Of Group","default":false},"element_type":{"type":"string","title":"Element Type"},"element_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Number"},"element_reference":{"type":"string","title":"Element Reference"},"amendment_type":{"type":"string","title":"Amendment Type"},"original_text":{"type":"string","title":"Original Text"},"proposed_text":{"type":"string","title":"Proposed Text"},"justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Justification"},"original_language":{"type":"string","title":"Original Language","default":"en"},"source_url":{"type":"string","title":"Source Url"},"parsing_confidence":{"type":"number","title":"Parsing Confidence","default":1.0},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"}},"type":"object","required":["id","procedure_reference","committee_code","pe_reference","amendment_number","author_names","element_type","element_reference","amendment_type","original_text","proposed_text","source_url"],"title":"MEPAmendmentResponse","description":"A single scraped amendment."},"MEPItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"profile_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — the EP MEP profile page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: full name, citizenship, active political group + role, mandate start, membership history."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields. Includes the MEP portrait when available."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Start date of the MEP's current/most-recent MEMBER_PARLIAMENT membership."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this MEP fetch (live endpoint, 6h cache)."}},"type":"object","title":"MEPItem"},"MarkAsReadRequest":{"properties":{"reading_time_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Reading Time Seconds","description":"Time spent reading in seconds"},"clicked_link":{"type":"boolean","title":"Clicked Link","description":"Whether user clicked through to source","default":false}},"type":"object","title":"MarkAsReadRequest","description":"Schema for marking entry as read"},"MemberStatePositionResponse":{"properties":{"country_code":{"type":"string","title":"Country Code"},"country_name":{"type":"string","title":"Country Name"},"position":{"type":"string","title":"Position"},"confidence":{"type":"number","title":"Confidence"},"key_concerns":{"items":{"type":"string"},"type":"array","title":"Key Concerns"},"red_lines":{"items":{"type":"string"},"type":"array","title":"Red Lines"},"european_family_positions":{"additionalProperties":{"type":"string"},"type":"object","title":"European Family Positions"}},"type":"object","required":["country_code","country_name","position","confidence","key_concerns","red_lines","european_family_positions"],"title":"MemberStatePositionResponse","description":"Member state position on a procedure."},"MemberVoteItem":{"properties":{"member_id":{"type":"string","title":"Member Id"},"position":{"type":"string","title":"Position"},"country_code":{"type":"string","title":"Country Code"},"group_code":{"type":"string","title":"Group Code"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"The parent vote's HowTheyVote page (so each row links back to the vote context)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: MEP id + position + country + group."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the parent vote."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When the parent vote was last refreshed."}},"type":"object","required":["member_id","position","country_code","group_code"],"title":"MemberVoteItem"},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse","description":"Generic acknowledgement that deliberately carries no account detail."},"MintRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human label, e.g. 'GovClipping production'"}},"type":"object","required":["name"],"title":"MintRequest"},"MintResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key","description":"Plaintext API key. Shown ONCE. Store securely."},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"warning":{"type":"string","title":"Warning","default":"Store this key securely. It will not be shown again."}},"type":"object","required":["id","key","name","key_prefix","created_at"],"title":"MintResponse"},"ModelInfoResponse":{"properties":{"timeline_model":{"additionalProperties":true,"type":"object","title":"Timeline Model"},"outcome_model":{"additionalProperties":true,"type":"object","title":"Outcome Model"}},"type":"object","required":["timeline_model","outcome_model"],"title":"ModelInfoResponse","description":"Model information response."},"MyAmendableFile":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"title":{"type":"string","title":"Title"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"text_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Type"}},"type":"object","required":["carriage_id","title"],"title":"MyAmendableFile"},"NewThisWeekItem":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"title":{"type":"string","title":"Title"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas"},"matched_interests":{"items":{"type":"string"},"type":"array","title":"Matched Interests"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["carriage_id","title"],"title":"NewThisWeekItem","description":"A legislative file that landed in the last 7 days and matches the user."},"NewThisWeekTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/NewThisWeekItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"NewThisWeekTile"},"NewsDirectory":{"properties":{"total_items":{"type":"integer","title":"Total Items"},"news":{"type":"integer","title":"News"},"press_releases":{"type":"integer","title":"Press Releases"},"bodies_with_news":{"type":"integer","title":"Bodies With News"},"families":{"type":"integer","title":"Families"},"earliest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Earliest"},"latest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest"}},"type":"object","required":["total_items","news","press_releases","bodies_with_news","families"],"title":"NewsDirectory"},"NewsItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Id","description":"Stable Brubru item id (use on the detail endpoint). An INTEGER for agency items and a UUID STRING for Commission / Parliament / Council items, which live in a different store. Pass whichever you got through unchanged."},"body_code":{"type":"string","title":"Body Code","description":"Canonical body code the item belongs to."},"body_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Name","description":"Human-readable body name."},"families":{"items":{"type":"string"},"type":"array","title":"Families","description":"Brubru policy families this body belongs to."},"kind":{"type":"string","title":"Kind","description":"news | press_release."},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL on the source website."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The item's own published date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the item."}},"type":"object","required":["id","body_code","kind","title"],"title":"NewsItem"},"NewsRef":{"properties":{"title":{"type":"string","title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Full article body (backfilled in economy_items)."}},"type":"object","required":["title"],"title":"NewsRef","description":"A recent packaging/plastics news item, with its (already-backfilled) body."},"NextSevenDaysTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/schemas__dashboard_schemas__CalendarEventItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"NextSevenDaysTile"},"NotificationFrequency":{"type":"string","enum":["daily","weekly","bi-weekly"],"title":"NotificationFrequency","description":"Notification frequency options"},"NotificationListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"unread_count":{"type":"integer","title":"Unread Count"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["notifications","unread_count","total"],"title":"NotificationListResponse","description":"List of notifications response."},"NotificationResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"notification_type":{"type":"string","title":"Notification Type"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"action_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"related_entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Related Entity Type"},"related_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Related Entity Id"},"priority":{"type":"string","title":"Priority"},"is_read":{"type":"boolean","title":"Is Read"},"created_at":{"type":"string","title":"Created At"},"read_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read At"}},"type":"object","required":["id","user_id","notification_type","title","message","action_url","metadata","related_entity_type","related_entity_id","priority","is_read","created_at","read_at"],"title":"NotificationResponse","description":"Notification response schema."},"OPCoreMetadata":{"properties":{"dct:title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Title","description":"Title of the listing / collection."},"dct:identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Identifier","description":"Stable identifier — typically the canonical request URL."},"dct:type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Type","description":"Resource type — e.g. 'EU legislation', 'Procedure', 'MEP'."},"dct:language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Language","description":"ISO-639 lang tag of the response content (default 'en')."},"dct:isPartOf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Ispartof","description":"Parent collection IRI — defaults to the Brubru DCAT-AP catalogue."},"dct:date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Dct:Date","description":"Server timestamp when this response was generated."},"dct:publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dct:Publisher","default":"https://brubru.beresol.eu/.well-known/publisher"},"dct:isReferencedBy":{"items":{"type":"string"},"type":"array","title":"Dct:Isreferencedby","description":"Related v1 endpoints partners can follow for richer detail (e.g. /api/v1/discover/cellar/celex/{celex}/relationships)."},"dct:conformsTo":{"type":"string","title":"Dct:Conformsto","description":"OP Core Metadata application profile this envelope conforms to.","default":"https://op.europa.eu/en/web/eu-vocabularies/opcm"}},"type":"object","title":"OPCoreMetadata","description":"OP Core Metadata block (Dublin-Core-derived) carried on every v1\npaginated envelope. Mirrors the element set used by Cellar so a\npartner harvester can ingest a Brubru response without translation.\n\nAll fields are optional — every endpoint populates the ones that\napply to its content type and leaves the rest at their default.\n\nReference: https://op.europa.eu/en/web/eu-vocabularies/opcm"},"OfficialItem":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"institution_slug":{"type":"string","title":"Institution Slug"},"dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg"},"cabinet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cabinet"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"bio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio Url"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"portfolio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portfolio"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — the bio page (or Whoiswho profile)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: name + title + role + institution + DG + cabinet + portfolio + contact details."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields. Includes the photo when available."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — officials are not dated documents."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time of this fetch."}},"type":"object","required":["id","slug","name","institution_slug"],"title":"OfficialItem"},"OpenDataCatalogueItem":{"properties":{"id":{"type":"string","title":"Id"},"catalogue_id":{"type":"string","title":"Catalogue Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"dataset_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dataset Count"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","catalogue_id"],"title":"OpenDataCatalogueItem"},"OpenDataDatasetItem":{"properties":{"id":{"type":"string","title":"Id"},"dataset_id":{"type":"string","title":"Dataset Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"catalogue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"formats":{"items":{"type":"string"},"type":"array","title":"Formats"},"is_hvd":{"type":"boolean","title":"Is Hvd","default":false},"distributions":{"items":{},"type":"array","title":"Distributions","description":"[{format, url, title}] direct download links."},"issued":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Issued"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Last modified date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","dataset_id","title"],"title":"OpenDataDatasetItem"},"OrgTypeFacet":{"properties":{"org_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Type"},"eutr_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eutr Section"},"organisations":{"type":"integer","title":"Organisations"},"with_news":{"type":"integer","title":"With News"}},"type":"object","required":["org_type","eutr_section","organisations","with_news"],"title":"OrgTypeFacet"},"OutcomePrediction":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"outcomes":{"items":{"$ref":"#/components/schemas/api__v1__predictions__OutcomeProbability"},"type":"array","title":"Outcomes"},"most_likely_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Most Likely Outcome"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"OEIL procedure-file URL for the underlying procedure."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text summary of the predicted outcomes + probabilities."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML rendering of the prediction breakdown."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — predictions are not dated documents."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time the prediction was generated."}},"type":"object","required":["procedure_ref"],"title":"OutcomePrediction"},"OutcomePredictionResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"current_status":{"type":"string","title":"Current Status"},"predicted_outcome":{"type":"string","title":"Predicted Outcome"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"probabilities":{"items":{"$ref":"#/components/schemas/api__predictions__OutcomeProbability"},"type":"array","title":"Probabilities","default":[]},"model_version":{"type":"string","title":"Model Version","default":"baseline"},"top_factors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Factors","default":[]}},"type":"object","required":["procedure_ref","current_status","predicted_outcome","confidence"],"title":"OutcomePredictionResponse","description":"Outcome prediction response."},"PackageStatusCounts":{"properties":{"announced":{"type":"integer","title":"Announced","default":0},"tabled":{"type":"integer","title":"Tabled","default":0},"blocked":{"type":"integer","title":"Blocked","default":0},"close_to_adoption":{"type":"integer","title":"Close To Adoption","default":0},"adopted":{"type":"integer","title":"Adopted","default":0},"withdrawn":{"type":"integer","title":"Withdrawn","default":0},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"PackageStatusCounts","description":"Status counts for a package"},"PaginatedResponse_AgendaItemOut_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/AgendaItemOut"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[AgendaItemOut]"},"PaginatedResponse_AmendmentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/AmendmentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[AmendmentItem]"},"PaginatedResponse_BrusselsLobby_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/BrusselsLobby"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[BrusselsLobby]"},"PaginatedResponse_CAPPaymentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CAPPaymentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CAPPaymentItem]"},"PaginatedResponse_CalendarEventItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/api__v1__calendar__CalendarEventItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CalendarEventItem]"},"PaginatedResponse_CalendarEventV2_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CalendarEventV2"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CalendarEventV2]"},"PaginatedResponse_CanonReport_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CanonReport"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CanonReport]"},"PaginatedResponse_CatalanActConcept_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CatalanActConcept"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CatalanActConcept]"},"PaginatedResponse_CatalanLinkedAct_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CatalanLinkedAct"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CatalanLinkedAct]"},"PaginatedResponse_CatalanTranslationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CatalanTranslationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CatalanTranslationItem]"},"PaginatedResponse_CellarRecentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CellarRecentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CellarRecentItem]"},"PaginatedResponse_CellarRelation_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CellarRelation"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CellarRelation]"},"PaginatedResponse_CohesionFinanceItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CohesionFinanceItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CohesionFinanceItem]"},"PaginatedResponse_CohesionListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CohesionListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CohesionListItem]"},"PaginatedResponse_CohesionOutcomeItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CohesionOutcomeItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CohesionOutcomeItem]"},"PaginatedResponse_ComitologyDocItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ComitologyDocItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ComitologyDocItem]"},"PaginatedResponse_CommissionRegisterItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommissionRegisterItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CommissionRegisterItem]"},"PaginatedResponse_CommitteeAgendaOut_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommitteeAgendaOut"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CommitteeAgendaOut]"},"PaginatedResponse_CommitteeItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommitteeItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CommitteeItem]"},"PaginatedResponse_CommitteeTranscriptOut_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CommitteeTranscriptOut"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CommitteeTranscriptOut]"},"PaginatedResponse_CompetitionCaseItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CompetitionCaseItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CompetitionCaseItem]"},"PaginatedResponse_CouncilConfigurationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CouncilConfigurationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CouncilConfigurationItem]"},"PaginatedResponse_CouncilDocumentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CouncilDocumentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CouncilDocumentItem]"},"PaginatedResponse_CouncilRegisterItemModel_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CouncilRegisterItemModel"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CouncilRegisterItemModel]"},"PaginatedResponse_CountryItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/CountryItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[CountryItem]"},"PaginatedResponse_EPDocumentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EPDocumentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EPDocumentItem]"},"PaginatedResponse_EPRSItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EPRSItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EPRSItem]"},"PaginatedResponse_EUSFCase_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EUSFCase"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EUSFCase]"},"PaginatedResponse_EconomyItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EconomyItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EconomyItem]"},"PaginatedResponse_EmeetingAgendaItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EmeetingAgendaItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EmeetingAgendaItem]"},"PaginatedResponse_EmeetingDocumentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EmeetingDocumentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EmeetingDocumentItem]"},"PaginatedResponse_EntrepreneurInstrumentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EntrepreneurInstrumentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EntrepreneurInstrumentItem]"},"PaginatedResponse_EuroVocConcept_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EuroVocConcept"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EuroVocConcept]"},"PaginatedResponse_EuroVocTaxonomyConcept_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EuroVocTaxonomyConcept"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EuroVocTaxonomyConcept]"},"PaginatedResponse_EurostatSeriesItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EurostatSeriesItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EurostatSeriesItem]"},"PaginatedResponse_EventItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/EventItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[EventItem]"},"PaginatedResponse_FtCallProposalItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FtCallProposalItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[FtCallProposalItem]"},"PaginatedResponse_FtCallTenderItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FtCallTenderItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[FtCallTenderItem]"},"PaginatedResponse_FtFundedProjectItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FtFundedProjectItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[FtFundedProjectItem]"},"PaginatedResponse_FtaListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FtaListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[FtaListItem]"},"PaginatedResponse_FundingItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/FundingItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[FundingItem]"},"PaginatedResponse_GeneralPublicationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/GeneralPublicationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[GeneralPublicationItem]"},"PaginatedResponse_GiListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/GiListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[GiListItem]"},"PaginatedResponse_IdentifyResult_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/IdentifyResult"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[IdentifyResult]"},"PaginatedResponse_InfringementItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/InfringementItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[InfringementItem]"},"PaginatedResponse_IntlCoopItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/IntlCoopItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[IntlCoopItem]"},"PaginatedResponse_JrcDatasetItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/JrcDatasetItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[JrcDatasetItem]"},"PaginatedResponse_KnowledgeGuideItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/KnowledgeGuideItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[KnowledgeGuideItem]"},"PaginatedResponse_LawItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/LawItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[LawItem]"},"PaginatedResponse_LobbyNewsItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/LobbyNewsItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[LobbyNewsItem]"},"PaginatedResponse_MEPItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/MEPItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[MEPItem]"},"PaginatedResponse_MemberVoteItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/MemberVoteItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[MemberVoteItem]"},"PaginatedResponse_NewsItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/NewsItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[NewsItem]"},"PaginatedResponse_OfficialItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/OfficialItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[OfficialItem]"},"PaginatedResponse_OpenDataCatalogueItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/OpenDataCatalogueItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[OpenDataCatalogueItem]"},"PaginatedResponse_OpenDataDatasetItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/OpenDataDatasetItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[OpenDataDatasetItem]"},"PaginatedResponse_ParliamentaryQuestionItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ParliamentaryQuestionItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ParliamentaryQuestionItem]"},"PaginatedResponse_PpwrItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/PpwrItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[PpwrItem]"},"PaginatedResponse_PressReleaseItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/PressReleaseItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[PressReleaseItem]"},"PaginatedResponse_ProcedureItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ProcedureItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ProcedureItem]"},"PaginatedResponse_ProductItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ProductItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ProductItem]"},"PaginatedResponse_ProgrammeFacet_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ProgrammeFacet"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ProgrammeFacet]"},"PaginatedResponse_ProgrammeItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ProgrammeItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ProgrammeItem]"},"PaginatedResponse_Programme_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/Programme"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[Programme]"},"PaginatedResponse_PublicationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/PublicationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[PublicationItem]"},"PaginatedResponse_RSBOpinionItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/RSBOpinionItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[RSBOpinionItem]"},"PaginatedResponse_ResearchProjectItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ResearchProjectItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ResearchProjectItem]"},"PaginatedResponse_ResearchPublicationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ResearchPublicationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ResearchPublicationItem]"},"PaginatedResponse_ResolutionItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/ResolutionItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ResolutionItem]"},"PaginatedResponse_SanctionListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/SanctionListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[SanctionListItem]"},"PaginatedResponse_SecondaryActItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/SecondaryActItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[SecondaryActItem]"},"PaginatedResponse_SocialAccount_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/SocialAccount"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[SocialAccount]"},"PaginatedResponse_SocialPost_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/SocialPost"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[SocialPost]"},"PaginatedResponse_StartupFundingItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/StartupFundingItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[StartupFundingItem]"},"PaginatedResponse_SummaryItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/SummaryItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[SummaryItem]"},"PaginatedResponse_TRISNotificationItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TRISNotificationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TRISNotificationItem]"},"PaginatedResponse_TenderComplyClusterItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TenderComplyClusterItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TenderComplyClusterItem]"},"PaginatedResponse_TenderItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TenderItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TenderItem]"},"PaginatedResponse_TenderTemplateItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TenderTemplateItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TenderTemplateItem]"},"PaginatedResponse_TextItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TextItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TextItem]"},"PaginatedResponse_TextileAct_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TextileAct"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TextileAct]"},"PaginatedResponse_TrListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TrListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TrListItem]"},"PaginatedResponse_TradeDefenceListItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TradeDefenceListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TradeDefenceListItem]"},"PaginatedResponse_TrainCarriage_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TrainCarriage"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TrainCarriage]"},"PaginatedResponse_TransparencyMeetingItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/TransparencyMeetingItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[TransparencyMeetingItem]"},"PaginatedResponse_VocabularyConcept_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/VocabularyConcept"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[VocabularyConcept]"},"PaginatedResponse_VoteItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/VoteItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[VoteItem]"},"PaginatedResponse_WebstreamItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/WebstreamItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[WebstreamItem]"},"PaginatedResponse_WhoIsWhoDepartmentItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/WhoIsWhoDepartmentItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[WhoIsWhoDepartmentItem]"},"PaginatedResponse_WhoIsWhoOfficialItem_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/WhoIsWhoOfficialItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[WhoIsWhoOfficialItem]"},"PaginatedResponse_XrefResult_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/XrefResult"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[XrefResult]"},"ParliamentaryQuestionItem":{"properties":{"id":{"type":"string","title":"Id"},"question_reference":{"type":"string","title":"Question Reference"},"question_type":{"type":"string","title":"Question Type"},"parliamentary_term":{"type":"integer","title":"Parliamentary Term","default":10},"subject":{"type":"string","title":"Subject"},"text_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Question"},"text_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Answer"},"submitted_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Submitted Date"},"answered_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Answered Date"},"asking_mep_ids":{"items":{},"type":"array","title":"Asking Mep Ids"},"asking_mep_names":{"items":{},"type":"array","title":"Asking Mep Names"},"answering_institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answering Institution"},"answering_commissioner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answering Commissioner"},"committees":{"items":{},"type":"array","title":"Committees"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"related_celex":{"items":{},"type":"array","title":"Related Celex"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"answer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Url"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — alias of source_url (the doceo question page)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The question's submission date (alias of submitted_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time the row was first ingested (alias of last_updated for now)."}},"type":"object","required":["id","question_reference","question_type","subject"],"title":"ParliamentaryQuestionItem"},"ParliamentaryTermInfo":{"properties":{"term":{"type":"integer","title":"Term"},"years":{"type":"string","title":"Years"},"prefix":{"type":"string","title":"Prefix"},"text_count":{"type":"integer","title":"Text Count","default":0}},"type":"object","required":["term","years","prefix"],"title":"ParliamentaryTermInfo","description":"Information about a parliamentary term."},"ParseEURLexURLResponse":{"properties":{"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"language":{"type":"string","title":"Language"},"format":{"type":"string","title":"Format"},"valid":{"type":"boolean","title":"Valid"},"url_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Type"},"original_url":{"type":"string","title":"Original Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["celex","language","format","valid","url_type","original_url"],"title":"ParseEURLexURLResponse","description":"Response with parsed EUR-Lex URL"},"PingResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"service":{"type":"string","title":"Service","default":"brubru-data-provider"},"version":{"type":"string","title":"Version","default":"v1"},"time":{"type":"string","format":"date-time","title":"Time"}},"type":"object","required":["time"],"title":"PingResponse"},"PlenaryVoteResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"predicted_outcome":{"type":"string","title":"Predicted Outcome"},"confidence":{"type":"number","title":"Confidence"},"predicted_margin":{"type":"integer","title":"Predicted Margin"},"estimated_for":{"type":"integer","title":"Estimated For"},"estimated_against":{"type":"integer","title":"Estimated Against"},"estimated_abstention":{"type":"integer","title":"Estimated Abstention"},"total_meps":{"type":"integer","title":"Total Meps"},"group_predictions":{"items":{"$ref":"#/components/schemas/GroupPositionResponse"},"type":"array","title":"Group Predictions"},"swing_groups":{"items":{"type":"string"},"type":"array","title":"Swing Groups"}},"type":"object","required":["procedure_ref","predicted_outcome","confidence","predicted_margin","estimated_for","estimated_against","estimated_abstention","total_meps","group_predictions","swing_groups"],"title":"PlenaryVoteResponse","description":"Plenary vote prediction response."},"PolicyAreasListResponse":{"properties":{"policy_areas":{"items":{"$ref":"#/components/schemas/schemas__public_consultation_schemas__PolicyAreaInfo"},"type":"array","title":"Policy Areas"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["policy_areas","total"],"title":"PolicyAreasListResponse","description":"List of policy areas."},"PolicyHook":{"properties":{"label":{"type":"string","title":"Label"},"spoken":{"type":"string","title":"Spoken"},"suggested_query":{"type":"string","title":"Suggested Query"},"source":{"type":"string","title":"Source"}},"type":"object","required":["label","spoken","suggested_query","source"],"title":"PolicyHook"},"PositionListItem":{"properties":{"carriage_id":{"type":"string","format":"uuid","title":"Carriage Id"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"is_recently_updated":{"type":"boolean","title":"Is Recently Updated","default":false},"is_pi_match":{"type":"boolean","title":"Is Pi Match","default":false},"user_stance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Stance"},"has_snapshot":{"type":"boolean","title":"Has Snapshot","default":false}},"type":"object","required":["carriage_id"],"title":"PositionListItem"},"PositionListResponse":{"properties":{"pi_active":{"type":"boolean","title":"Pi Active","default":false},"tracked":{"items":{"$ref":"#/components/schemas/PositionListItem"},"type":"array","title":"Tracked"},"suggested":{"items":{"$ref":"#/components/schemas/PositionListItem"},"type":"array","title":"Suggested"}},"type":"object","title":"PositionListResponse"},"PositionResponse":{"properties":{"carriage_id":{"type":"string","format":"uuid","title":"Carriage Id"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"data_completeness":{"type":"string","title":"Data Completeness"},"confidence":{"type":"string","title":"Confidence"},"commission_position":{"additionalProperties":true,"type":"object","title":"Commission Position"},"parliament_position":{"additionalProperties":true,"type":"object","title":"Parliament Position"},"council_position":{"additionalProperties":true,"type":"object","title":"Council Position"},"sources":{"additionalProperties":true,"type":"object","title":"Sources"},"user_position":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"User Position"},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"generated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Generated At"}},"type":"object","required":["carriage_id","procedure_ref","data_completeness","confidence","commission_position","parliament_position","council_position"],"title":"PositionResponse"},"PositionStressItem":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"title":{"type":"string","title":"Title"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"signal":{"type":"string","enum":["snapshot_refreshed","amendments_tabled","status_moved"],"title":"Signal"},"detail":{"type":"string","title":"Detail"},"detected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Detected At"}},"type":"object","required":["carriage_id","title","signal","detail"],"title":"PositionStressItem","description":"A tracked file with a position snapshot that recently shifted."},"PositionsUnderStressTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/PositionStressItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"PositionsUnderStressTile"},"PpwrItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen/machine deep-link (== deep_link)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — null (see deep-link)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body — null."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Signature/publication date of the act."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru resolved this row."},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX (the regulation; null for pending delegated acts)."},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref","description":"OEIL procedure ref (delegated acts)."},"kind":{"type":"string","title":"Kind","description":"regulation | delegated_act."},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli","description":"ELI permalink (null for acts not yet adopted)."},"title":{"type":"string","title":"Title","description":"Plain-language title in the requested lang."},"titles":{"additionalProperties":{"type":"string"},"type":"object","title":"Titles","description":"Titles in ca/es/en."},"role":{"type":"string","title":"Role","description":"What this act is / why it matters."},"status":{"type":"string","title":"Status","description":"in_force | applies_soon | pending."},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force","description":"Live in-force flag (Cellar)."},"entry_into_force":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Entry Into Force","description":"Entry-into-force date."},"applies_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Applies From","description":"General date of application (distinct from entry into force!)."},"days_until_application":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until Application","description":"Days from today to applies_from (negative if already applying)."},"structure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Structure","description":"Structural summary (regulation only)."},"procedure_ref_reg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref Reg","description":"The regulation's own COD procedure ref."},"repeals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repeals","description":"What the act repeals."},"timeline":{"items":{"$ref":"#/components/schemas/api__v2__proprietary__packaging_waste_regulation__TimelineEntry"},"type":"array","title":"Timeline","description":"Phased-obligation dates (regulation only)."},"official_resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array","title":"Official Resources","description":"Official Commission / EUR-Lex resources (regulation only)."},"related_news":{"items":{"$ref":"#/components/schemas/NewsRef"},"type":"array","title":"Related News","description":"Recent packaging & circular-economy news from Brubru's news corpus, with backfilled bodies (regulation only). Keyword-matched, so relevance is approximate."},"latest_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Step","description":"Latest legislative step (delegated acts)."},"deep_link":{"type":"string","title":"Deep Link","description":"Brubru deep-link (canon page or OEIL)."}},"type":"object","required":["kind","title","role","status","deep_link"],"title":"PpwrItem"},"PreUserEmailRequest":{"properties":{"pre_user_id":{"type":"string","maxLength":36,"minLength":1,"title":"Pre User Id"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["pre_user_id","email"],"title":"PreUserEmailRequest"},"PreUserEventRequest":{"properties":{"pre_user_id":{"type":"string","maxLength":36,"minLength":1,"title":"Pre User Id"},"event_type":{"type":"string","maxLength":30,"minLength":1,"title":"Event Type"},"event_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Metadata"}},"type":"object","required":["pre_user_id","event_type"],"title":"PreUserEventRequest"},"PreferencesResponse":{"properties":{"preferences":{"additionalProperties":true,"type":"object","title":"Preferences"}},"type":"object","required":["preferences"],"title":"PreferencesResponse","description":"Response with user preferences"},"PreferencesUpdate":{"properties":{"preferences":{"additionalProperties":true,"type":"object","title":"Preferences"}},"type":"object","required":["preferences"],"title":"PreferencesUpdate","description":"Request to update user preferences"},"PressReleaseItem":{"properties":{"id":{"type":"string","title":"Id"},"institution_slug":{"type":"string","title":"Institution Slug"},"source_slug":{"type":"string","title":"Source Slug"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"url":{"type":"string","title":"Url"},"language":{"type":"string","title":"Language","default":"en"},"published_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published Date"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"tags":{"items":{},"type":"array","title":"Tags"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — alias of url (the press-release page on the institutional site)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date of the press release (date-only view of published_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","institution_slug","source_slug","title","url"],"title":"PressReleaseItem"},"ProactiveBriefingResponse":{"properties":{"trigger_source":{"type":"string","title":"Trigger Source"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"suggested_query":{"type":"string","title":"Suggested Query"},"evidence_refs":{"items":{"type":"string"},"type":"array","title":"Evidence Refs","default":[]},"drill_down_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drill Down Path"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","default":[]}},"type":"object","required":["trigger_source","title","summary","suggested_query"],"title":"ProactiveBriefingResponse"},"ProactivePendingResponse":{"properties":{"briefings":{"items":{"$ref":"#/components/schemas/ProactiveBriefingResponse"},"type":"array","title":"Briefings"},"cap_reached":{"type":"boolean","title":"Cap Reached"}},"type":"object","required":["briefings","cap_reached"],"title":"ProactivePendingResponse"},"ProcedureDetail":{"properties":{"id":{"type":"string","title":"Id"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"oeil_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"is_blocked":{"type":"boolean","title":"Is Blocked","default":false},"days_in_current_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Current Status"},"text_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Type"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"OEIL procedure-file URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body sourced from the cached OEIL page."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body sourced from the cached OEIL page."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the latest OEIL key event."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this carriage."},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"opinion_committees":{"items":{},"type":"array","title":"Opinion Committees"},"committees":{"items":{},"type":"array","title":"Committees"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"},"celex_numbers":{"items":{},"type":"array","title":"Celex Numbers"},"eprs_briefing_ids":{"items":{},"type":"array","title":"Eprs Briefing Ids"},"eprs_matched_briefings":{"items":{},"type":"array","title":"Eprs Matched Briefings"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"related_themes":{"items":{},"type":"array","title":"Related Themes"},"spotlight_tags":{"items":{},"type":"array","title":"Spotlight Tags"},"ec_priority_ids":{"items":{},"type":"array","title":"Ec Priority Ids"},"timeline":{"items":{},"type":"array","title":"Timeline"},"status_history":{"items":{},"type":"array","title":"Status History"},"oeil_timeline":{"items":{},"type":"array","title":"Oeil Timeline"},"oeil_key_events":{"items":{},"type":"array","title":"Oeil Key Events"},"eurlex_documents":{"items":{},"type":"array","title":"Eurlex Documents"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"},"ai_entities":{"items":{},"type":"array","title":"Ai Entities"},"ai_policy_classifications":{"items":{},"type":"array","title":"Ai Policy Classifications"},"legal_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Text Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"law_tracker_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Law Tracker Url"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"expected_completion":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Completion"},"enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enriched At"},"enrichment_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enrichment Quality"},"curated":{"anyOf":[{"$ref":"#/components/schemas/BrubruCuration"},{"type":"null"}]}},"type":"object","required":["id","title"],"title":"ProcedureDetail"},"ProcedureItem":{"properties":{"id":{"type":"string","title":"Id"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"oeil_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"is_blocked":{"type":"boolean","title":"Is Blocked","default":false},"days_in_current_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Current Status"},"text_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Type"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"opinion_committees":{"items":{},"type":"array","title":"Opinion Committees"},"committees":{"items":{},"type":"array","title":"Committees"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"},"celex_numbers":{"items":{},"type":"array","title":"Celex Numbers"},"eprs_briefing_ids":{"items":{},"type":"array","title":"Eprs Briefing Ids"},"eprs_matched_briefings":{"items":{},"type":"array","title":"Eprs Matched Briefings"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"related_themes":{"items":{},"type":"array","title":"Related Themes"},"spotlight_tags":{"items":{},"type":"array","title":"Spotlight Tags"},"ec_priority_ids":{"items":{},"type":"array","title":"Ec Priority Ids"},"timeline":{"items":{},"type":"array","title":"Timeline"},"status_history":{"items":{},"type":"array","title":"Status History"},"oeil_timeline":{"items":{},"type":"array","title":"Oeil Timeline"},"oeil_key_events":{"items":{},"type":"array","title":"Oeil Key Events"},"eurlex_documents":{"items":{},"type":"array","title":"Eurlex Documents"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"},"ai_entities":{"items":{},"type":"array","title":"Ai Entities"},"ai_policy_classifications":{"items":{},"type":"array","title":"Ai Policy Classifications"},"legal_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Text Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"law_tracker_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Law Tracker Url"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"expected_completion":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Completion"},"enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enriched At"},"enrichment_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enrichment Quality"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"OEIL procedure-file URL — citizen-facing canonical page for the procedure."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text of the OEIL procedure-file page (description + key events)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML of the OEIL procedure-file page."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the latest OEIL key event."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this carriage (alias of first_seen)."}},"type":"object","required":["id"],"title":"ProcedureItem","description":"LIST-shaped procedure row.\n\nMaintains LIST/DETAIL field parity with `ProcedureDetail` so partners (e.g.\nGovClipping) can iterate over the LIST without round-tripping to DETAIL just\nto read `description`, `oeil_key_events`, `ai_summary`, etc. The two models\nexpose identical field names; values may be set or null per row."},"ProcedureTrackingResponse":{"properties":{"procedure_reference":{"type":"string","title":"Procedure Reference"},"status":{"type":"string","title":"Status"},"current_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Stage"},"timeline":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Timeline"},"related_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Documents"},"next_milestone":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Next Milestone"},"last_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Update"}},"type":"object","required":["procedure_reference","status","current_stage","timeline","related_documents","next_milestone","last_update"],"title":"ProcedureTrackingResponse","description":"Response with procedure tracking information."},"ProcedureType":{"type":"string","enum":["COD","CNS","APP","NLE","INI","INL","RSP","RSO","REG","RPS","DEA","IMM","BUD","BUI","DEC","GBD","ACI","COS","DCE"],"title":"ProcedureType","description":"OEIL procedure types (used to validate the ?procedure_type filter).\n\nOEIL's vocabulary is open-ended; this is the comprehensive set we currently\nstore. The stored column is a free varchar, so unseen types never crash."},"ProductItem":{"properties":{"code":{"type":"string","title":"Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Level"},"parent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Code"}},"type":"object","required":["code"],"title":"ProductItem"},"ProfileCompleteness":{"properties":{"score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Score"},"has_policy_interests":{"type":"boolean","title":"Has Policy Interests"},"has_organisation":{"type":"boolean","title":"Has Organisation"},"has_country":{"type":"boolean","title":"Has Country"},"has_tracked_files":{"type":"boolean","title":"Has Tracked Files"},"has_sectors":{"type":"boolean","title":"Has Sectors","default":false},"has_role_title":{"type":"boolean","title":"Has Role Title","default":false}},"type":"object","required":["score","has_policy_interests","has_organisation","has_country","has_tracked_files"],"title":"ProfileCompleteness","description":"How much of the user's profile is filled in.\n\nEach component contributes a fraction; total in [0, 1]. The Dashboard uses\nthis to decide whether to surface a \"complete your profile\" banner."},"Programme":{"properties":{"programme":{"type":"string","title":"Programme"},"acronym":{"type":"string","title":"Acronym"},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution","description":"Who runs it: European Commission, Joint Undertaking, Member States (shared management), EEAS."},"managing_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Managing Body","description":"The specific managing body / executive agency / JU."},"body_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Code","description":"Brubru canonical body code of the managing agency/JU, where applicable."},"dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg","description":"Responsible Commission Directorate-General."},"heading":{"type":"string","title":"Heading","description":"One of the 6 EC MFF headings."},"cluster":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster"},"programme_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme Type","description":"grants | financial-instrument | blended | procurement | prize."},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"budget_eur_bn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Eur Bn","description":"Indicative 2021-2027 headline allocation in EUR billion (current prices)."},"coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage","description":"Brubru coverage: covered | gap | skipped."},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint","description":"Brubru data endpoint for this programme's calls/projects, where covered."},"apply_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apply Url","description":"The live portal where applicants find and apply to calls."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL (the apply portal, else the EC programmes page)."}},"type":"object","required":["programme","acronym","heading"],"title":"Programme"},"ProgrammeCount":{"properties":{"programme":{"type":"string","title":"Programme"},"persons":{"type":"integer","title":"Persons"},"entities":{"type":"integer","title":"Entities"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["programme","persons","entities","total"],"title":"ProgrammeCount"},"ProgrammeFacet":{"properties":{"programme":{"type":"string","title":"Programme","description":"Programme name as stored in the template files."},"template_count":{"type":"integer","title":"Template Count","description":"Number of templates under this programme."}},"type":"object","required":["programme","template_count"],"title":"ProgrammeFacet"},"ProgrammeItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the fund's Cohesion Open Data page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The programme's status / adoption date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested the row."},"programme":{"type":"string","title":"Programme"},"acronym":{"type":"string","title":"Acronym"},"heading":{"type":"string","title":"Heading","description":"One of the 6 EC MFF headings."},"cluster":{"type":"string","title":"Cluster"},"coverage":{"type":"string","title":"Coverage","description":"covered | gap | skipped"},"via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via","description":"endpoint | ft_calls | null"},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint","description":"The Brubru endpoint path, when covered by a dedicated endpoint."},"source":{"type":"string","title":"Source","description":"Where the data comes from / why it is a gap."}},"type":"object","required":["programme","acronym","heading","cluster","coverage","source"],"title":"ProgrammeItem"},"ProgrammesDirectory":{"properties":{"total_programmes":{"type":"integer","title":"Total Programmes"},"total_budget_eur_bn":{"type":"number","title":"Total Budget Eur Bn"},"by_institution":{"additionalProperties":true,"type":"object","title":"By Institution"},"by_heading":{"additionalProperties":true,"type":"object","title":"By Heading"},"by_type":{"additionalProperties":true,"type":"object","title":"By Type"},"by_coverage":{"additionalProperties":true,"type":"object","title":"By Coverage"}},"type":"object","required":["total_programmes","total_budget_eur_bn","by_institution","by_heading","by_type","by_coverage"],"title":"ProgrammesDirectory"},"ProgressSummaryResponse":{"properties":{"total_tracked":{"type":"integer","title":"Total Tracked"},"active_procedures":{"type":"integer","title":"Active Procedures"},"pending_amendments":{"type":"integer","title":"Pending Amendments"},"recent_updates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Updates"},"upcoming_milestones":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Upcoming Milestones"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["total_tracked","active_procedures","pending_amendments","recent_updates","upcoming_milestones","generated_at"],"title":"ProgressSummaryResponse","description":"Response with progress summary."},"ProposalItemResponse":{"properties":{"id":{"type":"integer","title":"Id"},"question_addressed":{"type":"string","title":"Question Addressed"},"proposed_response":{"type":"string","title":"Proposed Response"},"supporting_arguments":{"items":{"type":"string"},"type":"array","title":"Supporting Arguments"},"evidence_citations":{"items":{"type":"string"},"type":"array","title":"Evidence Citations","default":[]},"source_documents":{"items":{"type":"string"},"type":"array","title":"Source Documents"},"tone_suggestion":{"type":"string","title":"Tone Suggestion"},"confidence_score":{"type":"number","title":"Confidence Score"}},"type":"object","required":["id","question_addressed","proposed_response","supporting_arguments","source_documents","tone_suggestion","confidence_score"],"title":"ProposalItemResponse","description":"Single proposal in response."},"ProposalsResponse":{"properties":{"consultation_id":{"type":"string","format":"uuid","title":"Consultation Id"},"overall_strategy":{"type":"string","title":"Overall Strategy"},"recommended_tone":{"type":"string","title":"Recommended Tone"},"key_messages":{"items":{"type":"string"},"type":"array","title":"Key Messages"},"proposals":{"items":{"$ref":"#/components/schemas/ProposalItemResponse"},"type":"array","title":"Proposals"},"tokens_used":{"type":"integer","title":"Tokens Used"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["consultation_id","overall_strategy","recommended_tone","key_messages","proposals","tokens_used","generated_at"],"title":"ProposalsResponse","description":"Full proposals response."},"PublicationItem":{"properties":{"id":{"type":"string","title":"Id"},"source_slug":{"type":"string","title":"Source Slug"},"institution_slug":{"type":"string","title":"Institution Slug"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"url":{"type":"string","title":"Url"},"language":{"type":"string","title":"Language","default":"en"},"published_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published Date"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"tags":{"items":{},"type":"array","title":"Tags"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — alias of url."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","source_slug","institution_slug","title","url"],"title":"PublicationItem"},"QMVResultResponse":{"properties":{"outcome":{"type":"string","title":"Outcome"},"states_for":{"type":"integer","title":"States For"},"states_against":{"type":"integer","title":"States Against"},"states_abstain":{"type":"integer","title":"States Abstain"},"states_undecided":{"type":"integer","title":"States Undecided"},"states_for_pct":{"type":"number","title":"States For Pct"},"population_for_pct":{"type":"number","title":"Population For Pct"},"meets_state_threshold":{"type":"boolean","title":"Meets State Threshold"},"meets_population_threshold":{"type":"boolean","title":"Meets Population Threshold"},"blocking_minority_possible":{"type":"boolean","title":"Blocking Minority Possible"},"margin_states":{"type":"integer","title":"Margin States"},"margin_population_pct":{"type":"number","title":"Margin Population Pct"}},"type":"object","required":["outcome","states_for","states_against","states_abstain","states_undecided","states_for_pct","population_for_pct","meets_state_threshold","meets_population_threshold","blocking_minority_possible","margin_states","margin_population_pct"],"title":"QMVResultResponse","description":"QMV calculation result."},"RSBOpinionItem":{"properties":{"id":{"type":"string","title":"Id"},"opinion_reference":{"type":"string","title":"Opinion Reference"},"title":{"type":"string","title":"Title"},"target_initiative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Initiative"},"target_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Dg"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"opinion_type":{"type":"string","title":"Opinion Type"},"verdict":{"type":"string","title":"Verdict"},"opinion_date":{"type":"string","format":"date","title":"Opinion Date"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"source_url":{"type":"string","title":"Source Url"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["id","opinion_reference","title","opinion_type","verdict","opinion_date","source_url"],"title":"RSBOpinionItem"},"RSSEntryInfo":{"properties":{"id":{"type":"string","title":"Id"},"feed_id":{"type":"string","title":"Feed Id"},"title":{"type":"string","title":"Title"},"link":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Link"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution"},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area"},"is_featured":{"type":"boolean","title":"Is Featured","default":false}},"type":"object","required":["id","feed_id","title","link"],"title":"RSSEntryInfo","description":"RSS entry information"},"RSSEntryListResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/RSSEntryResponse"},"type":"array","title":"Entries"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["entries","total","limit","offset","has_more"],"title":"RSSEntryListResponse","description":"Schema for paginated RSS entry list"},"RSSEntryResponse":{"properties":{"title":{"type":"string","maxLength":500,"title":"Title","description":"Entry title"},"link":{"type":"string","maxLength":1000,"title":"Link","description":"Entry URL"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Entry summary"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Full content"},"author":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author","description":"Author name"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Entry categories"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"id":{"type":"string","format":"uuid","title":"Id"},"feed_id":{"type":"string","format":"uuid","title":"Feed Id"},"guid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guid"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"language":{"type":"string","title":"Language","default":"en"},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"},"ai_sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Sentiment"},"ai_topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ai Topics"},"view_count":{"type":"integer","title":"View Count","default":0},"save_count":{"type":"integer","title":"Save Count","default":0},"is_read":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Read"},"is_saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Saved"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["title","link","id","feed_id","created_at"],"title":"RSSEntryResponse","description":"Schema for RSS entry response"},"RSSFeedInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"source":{"type":"string","title":"Source"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"language":{"type":"string","title":"Language","default":"en"},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_fetched":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetched"},"total_entries":{"type":"integer","title":"Total Entries","default":0},"update_frequency_minutes":{"type":"integer","title":"Update Frequency Minutes","default":60}},"type":"object","required":["id","name","url","source"],"title":"RSSFeedInfo","description":"RSS feed information"},"RSSFeedResponse":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name","description":"Human-readable feed name"},"url":{"type":"string","maxLength":1000,"title":"Url","description":"RSS feed URL"},"source":{"type":"string","maxLength":100,"title":"Source","description":"Institution name (e.g., 'european_parliament')"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category","description":"Feed category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Feed description"},"language":{"type":"string","maxLength":5,"title":"Language","description":"ISO 639-1 language code","default":"en"},"update_frequency_minutes":{"type":"integer","maximum":1440.0,"minimum":15.0,"title":"Update Frequency Minutes","description":"Update frequency in minutes","default":60},"is_active":{"type":"boolean","title":"Is Active","description":"Whether feed is actively monitored","default":true},"id":{"type":"string","format":"uuid","title":"Id"},"last_fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetched At"},"last_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated At"},"last_entry_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Entry Date"},"total_entries":{"type":"integer","title":"Total Entries","default":0},"is_healthy":{"type":"boolean","title":"Is Healthy","default":true},"error_rate":{"type":"number","title":"Error Rate","default":0.0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","url","source","id","created_at","updated_at"],"title":"RSSFeedResponse","description":"Schema for RSS feed response"},"RapporteurInfo":{"properties":{"name":{"type":"string","title":"Name"},"political_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Political Group"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mep Id"}},"type":"object","required":["name"],"title":"RapporteurInfo","description":"Rapporteur details for a procedure."},"RecitalArticleMapResponse":{"properties":{"celex":{"type":"string","title":"Celex"},"map":{"additionalProperties":true,"type":"object","title":"Map","description":"Article -> [{recital_number, score, snippet}, ...] (top-3)"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL of the parent law (EUR-Lex CELEX URL)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null — call /api/v1/laws/{celex}/text for the parent law's body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — same."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null on this derived endpoint — fetch /api/v1/laws/{celex} for the parent's date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When the recital-article map was last computed."}},"type":"object","required":["celex","map"],"title":"RecitalArticleMapResponse"},"RefineProposalRequest":{"properties":{"proposal_id":{"type":"integer","title":"Proposal Id"},"user_feedback":{"type":"string","title":"User Feedback"}},"type":"object","required":["proposal_id","user_feedback"],"title":"RefineProposalRequest","description":"Request to refine a proposal."},"ReorderRequest":{"properties":{"ordered_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Ordered Ids"}},"type":"object","required":["ordered_ids"],"title":"ReorderRequest"},"ResearchProjectItem":{"properties":{"cordis_id":{"type":"string","title":"Cordis Id"},"acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acronym"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"topic_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Code"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"total_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Cost"},"eu_contribution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eu Contribution"},"coordinator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Name"},"coordinator_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator Country"},"cordis_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cordis Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — the CORDIS project page (alias of cordis_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Project start_date (the canonical 'when this project happened' date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this project row (ft_funded_projects.scraped_at)."}},"type":"object","required":["cordis_id"],"title":"ResearchProjectItem"},"ResearchPublicationItem":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"publication_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Id"},"title":{"type":"string","title":"Title"},"publication_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Type"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"authors":{"items":{},"type":"array","title":"Authors"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"committees":{"items":{},"type":"array","title":"Committees"},"related_celex_numbers":{"items":{},"type":"array","title":"Related Celex Numbers"},"related_procedures":{"items":{},"type":"array","title":"Related Procedures"},"html_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["id","source","title"],"title":"ResearchPublicationItem"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":16,"title":"Token"},"password":{"type":"string","maxLength":100,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest","description":"Redeem a reset token and set a new password."},"ResetTokenCheckResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["valid"],"title":"ResetTokenCheckResponse","description":"Whether a reset link is still good, so the page can say so before asking for a password."},"ResolutionIndicatorResponse":{"properties":{"resolution_id":{"type":"string","title":"Resolution Id"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"type":"string","title":"Title"},"resolution_type":{"type":"string","title":"Resolution Type"},"adoption_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adoption Date"},"vote_for":{"type":"integer","title":"Vote For"},"vote_against":{"type":"integer","title":"Vote Against"},"vote_abstention":{"type":"integer","title":"Vote Abstention"},"vote_total":{"type":"integer","title":"Vote Total"},"support_percentage":{"type":"number","title":"Support Percentage"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"rapporteur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur"},"match_method":{"type":"string","title":"Match Method"},"match_confidence":{"type":"number","title":"Match Confidence"},"days_before_legislation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Before Legislation"},"oeil_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Url"}},"type":"object","required":["resolution_id","procedure_ref","title","resolution_type","vote_for","vote_against","vote_abstention","vote_total","support_percentage","match_method","match_confidence"],"title":"ResolutionIndicatorResponse","description":"Resolution as a leading indicator for a legislative procedure."},"ResolutionItem":{"properties":{"id":{"type":"string","title":"Id"},"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"type":"string","title":"Title"},"resolution_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Type"},"adoption_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Adoption Date"},"vote_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Vote Date"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"rapporteur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"eurovoc_codes":{"items":{},"type":"array","title":"Eurovoc Codes"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"vote_for":{"type":"integer","title":"Vote For","default":0},"vote_against":{"type":"integer","title":"Vote Against","default":0},"vote_abstention":{"type":"integer","title":"Vote Abstention","default":0},"vote_total":{"type":"integer","title":"Vote Total","default":0},"key_events":{"items":{},"type":"array","title":"Key Events"},"oeil_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Url"},"text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Url"},"has_commission_followup":{"type":"boolean","title":"Has Commission Followup","default":false},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — text_url (the doceo text) when present, else oeil_url."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + procedure + lead committee + rapporteur + dates + vote tally + summary."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Adoption date if set, else the plenary vote date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (alias of updated_at)."}},"type":"object","required":["id","procedure_ref","title"],"title":"ResolutionItem"},"ResolutionLeadingIndicatorResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"resolutions":{"items":{"$ref":"#/components/schemas/ResolutionIndicatorResponse"},"type":"array","title":"Resolutions"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"}},"type":"object","required":["procedure_ref","resolutions","summary"],"title":"ResolutionLeadingIndicatorResponse","description":"Response with resolution leading indicators for a procedure."},"ResolveAliasesRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Plain text. Detects GDPR/DSA/AI Act/etc. by name.","examples":["The GDPR and the AI Act both regulate automated decision-making."]}},"type":"object","required":["text"],"title":"ResolveAliasesRequest"},"ResolveRequest":{"properties":{"refs":{"items":{"type":"string"},"type":"array","title":"Refs"}},"type":"object","required":["refs"],"title":"ResolveRequest"},"ResolveResponse":{"properties":{"metadata":{"additionalProperties":{"$ref":"#/components/schemas/SearchHit"},"type":"object","title":"Metadata"}},"type":"object","required":["metadata"],"title":"ResolveResponse"},"ResolveResult":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical EU URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (null when the resource has no inline body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (null when the resource has no inline body)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The resource's document date, when applicable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated/ingested this (server time)."},"input":{"type":"string","title":"Input"},"recognised_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recognised Kind","description":"Identifier type recognised from the input (celex, eli, ecli, oj, alias, oeil_ref, ...)."},"resolved_via":{"type":"string","title":"Resolved Via","description":"How the CELEX was reached: celex | eli | alias | oeil | unresolved."},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"Official EU URL for the resource."},"brubru_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brubru Url","description":"The Brubru v2 endpoint for this law, when resolved to a CELEX."}},"type":"object","required":["input","resolved_via"],"title":"ResolveResult"},"Resource":{"properties":{"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"}},"type":"object","required":["kind","title","url"],"title":"Resource"},"SanctionDetail":{"properties":{"entity_logical_id":{"type":"integer","title":"Entity Logical Id"},"eu_ref_num":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Ref Num"},"subject_type":{"type":"string","title":"Subject Type"},"programme":{"type":"string","title":"Programme"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"middle_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Middle Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"function":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Function"},"aliases":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Aliases"},"addresses":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Addresses"},"birth_details":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Birth Details"},"identification_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Identification Documents"},"citizenships":{"items":{"type":"string"},"type":"array","title":"Citizenships"},"legal_basis_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis Title"},"legal_basis_publication_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Legal Basis Publication Date"},"legal_basis_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis Url"},"remark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"},"date_file":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date File"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias for body_text or body_html."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — the legal basis URL (EUR-Lex page for the listing regulation)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date of the legal basis act."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Date this row was last refreshed in the upstream consolidated list."}},"type":"object","required":["entity_logical_id","subject_type","programme"],"title":"SanctionDetail"},"SanctionListItem":{"properties":{"entity_logical_id":{"type":"integer","title":"Entity Logical Id"},"eu_ref_num":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Ref Num","description":"EU reference number (e.g. EU.27.28). Use this as the path id for the detail endpoint when present."},"subject_type":{"type":"string","title":"Subject Type","description":"P = natural person; E = legal entity / vessel / aircraft."},"programme":{"type":"string","title":"Programme","description":"CFSP sanctions programme code (e.g. UKR, IRN, BLR, TERR)."},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"legal_basis_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis Title"},"legal_basis_publication_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Legal Basis Publication Date"},"legal_basis_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis Url"},"citizenships":{"items":{"type":"string"},"type":"array","title":"Citizenships"},"date_file":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date File","description":"Date this row was last refreshed in the upstream consolidated list."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — the legal basis URL (EUR-Lex page for the sanctions regulation listing this entity)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text row composition (full_name + programme + legal basis + citizenships + date)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"legal_basis_publication_date (the date the listing legal act was published)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Date this row was last refreshed in the upstream consolidated list (alias of date_file)."}},"type":"object","required":["entity_logical_id","subject_type","programme"],"title":"SanctionListItem"},"SaveEntryRequest":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Personal notes about this entry"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Tags","description":"User-defined tags"},"collection_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Collection Name","description":"Collection/folder name"},"is_starred":{"type":"boolean","title":"Is Starred","description":"Mark as starred/important","default":false}},"type":"object","title":"SaveEntryRequest","description":"Schema for saving/bookmarking an entry"},"ScopeCatalogueResponse":{"properties":{"scopes":{"items":{"$ref":"#/components/schemas/ScopeOption"},"type":"array","title":"Scopes"},"defaults":{"items":{"type":"string"},"type":"array","title":"Defaults"},"expiry_options_days":{"items":{"type":"integer"},"type":"array","title":"Expiry Options Days"},"max_active_keys":{"type":"integer","title":"Max Active Keys"}},"type":"object","required":["scopes","defaults","expiry_options_days","max_active_keys"],"title":"ScopeCatalogueResponse"},"ScopeOption":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"default_on_self_serve":{"type":"boolean","title":"Default On Self Serve"}},"type":"object","required":["name","label","description","default_on_self_serve"],"title":"ScopeOption","description":"One row in the scope catalogue — drives the mint UI checkboxes."},"SearchHit":{"properties":{"file_ref":{"type":"string","title":"File Ref"},"label":{"type":"string","title":"Label"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"type":{"type":"string","title":"Type"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"source":{"type":"string","title":"Source"},"committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee"},"deep_dive_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Dive Url"},"deep_dive_short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Dive Short Title"}},"type":"object","required":["file_ref","label","type","source"],"title":"SearchHit","description":"One file the user can add to a Comparator grid."},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"hits":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Hits"}},"type":"object","required":["query","hits"],"title":"SearchResponse"},"SecondaryActItem":{"properties":{"id":{"type":"string","title":"Id"},"act_type":{"type":"string","title":"Act Type"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"parent_celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Celex"},"parent_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Procedure Ref"},"status":{"type":"string","title":"Status"},"proposing_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposing Dg"},"publication_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Publication Date"},"objection_deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Objection Deadline"},"ep_scrutiny":{"additionalProperties":true,"type":"object","title":"Ep Scrutiny"},"council_scrutiny":{"additionalProperties":true,"type":"object","title":"Council Scrutiny"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"source_url":{"type":"string","title":"Source Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — EUR-Lex CELEX URL when available, else pdf_url, else source_url."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The act's publication date (same as publication_date, surfaced under the uniform datapoint name)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (secondary_acts.first_seen)."},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"}},"type":"object","required":["id","act_type","reference","title","status","source_url"],"title":"SecondaryActItem"},"SocialAccount":{"properties":{"id":{"type":"integer","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_key":{"type":"string","title":"Entity Key"},"entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Name"},"platform":{"type":"string","title":"Platform"},"scope":{"type":"string","title":"Scope"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"status":{"type":"string","title":"Status"},"verified":{"type":"boolean","title":"Verified"},"discovery_source":{"type":"string","title":"Discovery Source"},"content_fetch_enabled":{"type":"boolean","title":"Content Fetch Enabled"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical URL of the account on the platform."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Composed profile (null on list; full on detail)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML profile (null on list; full on detail)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"When the account was last checked / first seen."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first mapped the account."}},"type":"object","required":["id","entity_type","entity_key","platform","scope","status","verified","discovery_source","content_fetch_enabled","title"],"title":"SocialAccount"},"SocialDirectory":{"properties":{"total_accounts":{"type":"integer","title":"Total Accounts"},"total_posts":{"type":"integer","title":"Total Posts"},"verified_accounts":{"type":"integer","title":"Verified Accounts"},"accounts_by_entity_type":{"additionalProperties":true,"type":"object","title":"Accounts By Entity Type"},"accounts_by_platform":{"additionalProperties":true,"type":"object","title":"Accounts By Platform"},"posts_by_platform":{"additionalProperties":true,"type":"object","title":"Posts By Platform"},"note":{"type":"string","title":"Note"}},"type":"object","required":["total_accounts","total_posts","verified_accounts","accounts_by_entity_type","accounts_by_platform","posts_by_platform","note"],"title":"SocialDirectory"},"SocialPlatform":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"fetch_tier":{"type":"string","title":"Fetch Tier","description":"open | gated | hard | none — content-fetch feasibility."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"account_count":{"type":"integer","title":"Account Count","default":0},"post_count":{"type":"integer","title":"Post Count","default":0}},"type":"object","required":["code","name","fetch_tier"],"title":"SocialPlatform"},"SocialPost":{"properties":{"id":{"type":"integer","title":"Id"},"account_id":{"type":"integer","title":"Account Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_key":{"type":"string","title":"Entity Key"},"entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Name"},"platform":{"type":"string","title":"Platform"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"like_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Like Count"},"repost_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repost Count"},"reply_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply Count"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Permalink to the post on the platform."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text post body (null on list; full on detail)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML post body (null on list; full on detail)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"When the post was published."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru fetched the post."}},"type":"object","required":["id","account_id","entity_type","entity_key","platform","title"],"title":"SocialPost"},"StagnationAlertResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"title":{"type":"string","title":"Title"},"current_status":{"type":"string","title":"Current Status"},"days_in_status":{"type":"integer","title":"Days In Status"},"stagnation_level":{"type":"string","title":"Stagnation Level"},"last_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Update"}},"type":"object","required":["procedure_ref","title","current_status","days_in_status","stagnation_level"],"title":"StagnationAlertResponse","description":"Stagnation alert response."},"StartupFundingItem":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call Id"},"framework_programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework Programme"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"type_of_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Of Action"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"deadline_secondary":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Secondary"},"indicative_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Indicative Budget"},"budget_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Currency","default":"EUR"},"source_url":{"type":"string","title":"Source Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"target_audience":{"items":{"type":"string"},"type":"array","title":"Target Audience"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication date (date-only view of published_at)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"instrument":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instrument"}},"type":"object","required":["id","topic_id","title","source_url"],"title":"StartupFundingItem"},"StatusChange":{"properties":{"status":{"$ref":"#/components/schemas/CarriageStatus"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days"}},"type":"object","required":["status","changed_at"],"title":"StatusChange","description":"Status change event"},"StatusChangeResponse":{"properties":{"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","required":["changes"],"title":"StatusChangeResponse","description":"Response with detected status changes."},"SubmissionStatus":{"type":"string","enum":["not_started","draft","submitted","not_participating"],"title":"SubmissionStatus","description":"User's submission status."},"SubscribeRequest":{"properties":{"feed_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Feed Url","description":"RSS feed URL"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Feed name"},"source":{"type":"string","title":"Source","description":"Source institution"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Feed category"},"update_frequency_minutes":{"type":"integer","maximum":1440.0,"minimum":5.0,"title":"Update Frequency Minutes","description":"Update frequency","default":60}},"type":"object","required":["feed_url","source"],"title":"SubscribeRequest","description":"Request for feed subscription"},"SubscribeResponse":{"properties":{"feed_id":{"type":"string","title":"Feed Id"},"message":{"type":"string","title":"Message"},"feed":{"$ref":"#/components/schemas/RSSFeedInfo"}},"type":"object","required":["feed_id","message","feed"],"title":"SubscribeResponse","description":"Response for subscription"},"SubscriptionTier":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"price_monthly":{"type":"number","title":"Price Monthly"},"price_annual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Annual"},"description":{"type":"string","title":"Description"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"},"custom_pricing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Custom Pricing","default":false},"minimum_users":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minimum Users"}},"type":"object","required":["id","name","price_monthly","price_annual","description","features","limits"],"title":"SubscriptionTier","description":"Subscription tier information"},"SuggestedResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Files"},"my_committees":{"items":{"type":"string"},"type":"array","title":"My Committees"}},"type":"object","required":["files","my_committees"],"title":"SuggestedResponse","description":"PI-relevant suggestions + the user's interest committees for the picker."},"SuggestionValidation":{"properties":{"original_verified":{"type":"boolean","title":"Original Verified","description":"Did the model faithfully echo the source element text?","default":true},"scope_ratio":{"type":"number","title":"Scope Ratio","description":"Word-change fraction, 0.0 (minimal) to 1.0 (rewritten)","default":0.0},"phantom_references":{"items":{"type":"string"},"type":"array","title":"Phantom References","description":"Internal article references not present in the loaded document"},"flags":{"items":{"type":"string"},"type":"array","title":"Flags","description":"Human-readable warning labels"}},"type":"object","title":"SuggestionValidation","description":"Deterministic fidelity check results for one suggestion"},"SummariseRequest":{"properties":{"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"kind":{"type":"string","title":"Kind","default":"meeting"},"configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Configuration"},"lang":{"type":"string","title":"Lang","default":"en"}},"type":"object","required":["title"],"title":"SummariseRequest"},"SummaryItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical EU URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (null when the resource has no inline body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (null when the resource has no inline body)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The resource's document date, when applicable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated/ingested this (server time)."},"summary_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Id"},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"lsu_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lsu Url","description":"EUR-Lex Legislative Summary (LSU) view URL."}},"type":"object","title":"SummaryItem"},"SyncAllResultResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/schemas__eu_calendar_schemas__SyncResultResponse"},"type":"array","title":"Results"},"total_added":{"type":"integer","title":"Total Added","default":0},"total_updated":{"type":"integer","title":"Total Updated","default":0},"total_errors":{"type":"integer","title":"Total Errors","default":0}},"type":"object","required":["results"],"title":"SyncAllResultResponse","description":"Result of syncing all sources."},"SystemStatsResponse":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"active_users_7d":{"type":"integer","title":"Active Users 7D"},"total_feeds":{"type":"integer","title":"Total Feeds"},"active_feeds":{"type":"integer","title":"Active Feeds"},"total_entries":{"type":"integer","title":"Total Entries"},"entries_today":{"type":"integer","title":"Entries Today"},"total_subscriptions":{"type":"integer","title":"Total Subscriptions"},"total_feedback":{"type":"integer","title":"Total Feedback"},"unresolved_feedback":{"type":"integer","title":"Unresolved Feedback"},"signups_7d":{"type":"integer","title":"Signups 7D","default":0},"signups_30d":{"type":"integer","title":"Signups 30D","default":0},"paying_users":{"type":"integer","title":"Paying Users","default":0},"wapu_7d":{"type":"integer","title":"Wapu 7D","default":0},"dormant_profiles":{"type":"integer","title":"Dormant Profiles","default":0},"sync_failures_24h":{"type":"integer","title":"Sync Failures 24H","default":0},"brief_sends_7d":{"type":"integer","title":"Brief Sends 7D","default":0}},"type":"object","required":["total_users","active_users_7d","total_feeds","active_feeds","total_entries","entries_today","total_subscriptions","total_feedback","unresolved_feedback"],"title":"SystemStatsResponse","description":"Overall system statistics"},"TRISNotificationItem":{"properties":{"id":{"type":"string","title":"Id"},"notification_number":{"type":"string","title":"Notification Number"},"notifying_country":{"type":"string","title":"Notifying Country"},"title":{"type":"string","title":"Title"},"short_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Summary"},"full_text_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text Summary"},"notification_date":{"type":"string","format":"date","title":"Notification Date"},"standstill_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Standstill Until"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"products_or_services":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Products Or Services"},"main_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Content"},"commission_observations_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commission Observations Url"},"member_state_observations":{"items":{},"type":"array","title":"Member State Observations"},"detailed_opinions":{"items":{},"type":"array","title":"Detailed Opinions"},"source_url":{"type":"string","title":"Source Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"related_celex":{"items":{},"type":"array","title":"Related Celex"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL — TRIS notification page (source_url)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Notification date (alias of notification_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (alias of last_updated)."}},"type":"object","required":["id","notification_number","notifying_country","title","notification_date","source_url"],"title":"TRISNotificationItem"},"TenderAdminUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"open, closed, awarded, cancelled"},"sme_suitability_score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Sme Suitability Score"},"cpv_main":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpv Main"},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"submission_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submission Deadline"}},"type":"object","title":"TenderAdminUpdate","description":"Schema for admin tender updates."},"TenderComplyClusterItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical URL: the Brubru EU Law Comply cluster page."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text cluster summary composed from name + description + applicability."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML cluster summary."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Always null: clusters are evergreen, not document-dated."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated."},"id":{"type":"integer","title":"Id","description":"Brubru cluster id."},"name":{"type":"string","title":"Name","description":"Cluster name (e.g. 'GDPR & ePrivacy compliance')."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Cluster description."},"applicability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicability","description":"When this cluster applies."},"policy_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Area","description":"EU policy-area taxonomy value the cluster sits under."},"priority_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority Level","description":"High / Medium / Low priority for typical applicants."},"law_count":{"type":"integer","title":"Law Count","description":"Number of laws in this cluster.","default":0},"requirement_count":{"type":"integer","title":"Requirement Count","description":"Number of requirements rolled up across all laws in this cluster.","default":0},"matched_targets":{"items":{"type":"string"},"type":"array","title":"Matched Targets","description":"Which template comply_target labels mapped to this cluster's policy_area."},"match_reason":{"items":{"type":"string"},"type":"array","title":"Match Reason","description":"Why the cluster surfaced: 'template' (declared on the template), 'ethics' (ethics flag), 'funding-mode' (equity/blended funding mode)."}},"type":"object","required":["id","name"],"title":"TenderComplyClusterItem","description":"One EU Law Comply cluster surfaced as relevant to the given tender template."},"TenderDetail":{"properties":{"publication_number":{"type":"string","maxLength":50,"title":"Publication Number","description":"TED publication number (e.g., '1776-2025')"},"title":{"type":"string","title":"Title","description":"Tender title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Tender description"},"official_name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Official Name","description":"Contracting authority name"},"buyer_country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Buyer Country","description":"ISO 3166-1 alpha-2 country code"},"id":{"type":"integer","title":"Id"},"notice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice Id"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"notice_subtype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice Subtype"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"legal_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes"},"cpv_main":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpv Main"},"nuts_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Nuts Codes"},"contract_nature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Nature"},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"estimated_value_currency":{"type":"string","title":"Estimated Value Currency","default":"EUR"},"value_range_low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Range Low"},"value_range_high":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Range High"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"submission_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submission Deadline"},"contract_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract Start Date"},"contract_duration_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Duration Months"},"award_criteria_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Award Criteria Type"},"award_criteria":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Award Criteria"},"selection_criteria":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selection Criteria"},"minimum_requirements":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Minimum Requirements"},"has_lots":{"type":"boolean","title":"Has Lots","default":false},"lot_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lot Count","default":0},"lots":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Lots"},"ted_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ted Url"},"documents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Url"},"submission_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submission Url"},"status":{"$ref":"#/components/schemas/TenderStatus","default":"open"},"is_framework":{"type":"boolean","title":"Is Framework","default":false},"is_joint_procurement":{"type":"boolean","title":"Is Joint Procurement","default":false},"sme_suitability_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sme Suitability Score"},"sme_analysis":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sme Analysis"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"procedure_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Label","description":"Plain-language procedure, e.g. \"Negotiated (with prior call)\".","readOnly":true},"contract_nature_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Nature Label","description":"Works / Supplies / Services.","readOnly":true},"award_criteria_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Award Criteria Label","description":"What the contract is awarded on, per Directive 2014/24/EU Art. 67.","readOnly":true}},"type":"object","required":["publication_number","title","id","procedure_label","contract_nature_label","award_criteria_label"],"title":"TenderDetail","description":"Full tender details for detail view"},"TenderFetchJobResponse":{"properties":{"id":{"type":"integer","title":"Id"},"job_id":{"type":"string","title":"Job Id"},"job_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"status":{"type":"string","title":"Status"},"tenders_found":{"type":"integer","title":"Tenders Found","default":0},"tenders_new":{"type":"integer","title":"Tenders New","default":0},"tenders_updated":{"type":"integer","title":"Tenders Updated","default":0},"errors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Errors"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["id","job_id","status"],"title":"TenderFetchJobResponse","description":"Schema for fetch job status"},"TenderFetchRequest":{"properties":{"days_back":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Days Back","description":"Days to look back","default":7},"countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries","description":"Countries to fetch"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes","description":"CPV codes to filter"},"max_value":{"type":"number","minimum":0.0,"title":"Max Value","description":"Maximum tender value","default":5000000},"source":{"type":"string","title":"Source","description":"Data source (ted_api or ted_sparql)","default":"ted_api"}},"type":"object","title":"TenderFetchRequest","description":"Request to trigger a tender fetch"},"TenderFileCreate":{"properties":{"title":{"type":"string","maxLength":500,"title":"Title"},"template_id":{"type":"string","title":"Template Id","description":"One of the JSON template ids in knowledge_base/funding_templates/"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topic_variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Variant"},"funding_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Mode","description":"'grant-only' | 'equity-only' | 'blended'"},"deadline_iso":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Iso"},"tender_track_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tender Track Id"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"},"seed_first_doc":{"type":"boolean","title":"Seed First Doc","description":"If true, automatically create the first doc-of-the-file from the template","default":true}},"type":"object","required":["title","template_id"],"title":"TenderFileCreate"},"TenderFilePatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Title"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"'drafting' | 'ready-to-submit' | 'submitted' | 'won' | 'lost' | 'seal-of-excellence'"},"funding_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Mode"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topic_variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Variant"},"deadline_iso":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline Iso"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","title":"TenderFilePatch"},"TenderFileResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"programme":{"type":"string","title":"Programme"},"sub_instrument":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Instrument"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topic_variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Variant"},"funding_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Mode"},"deadline_iso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deadline Iso"},"status":{"type":"string","title":"Status"},"template_id":{"type":"string","title":"Template Id"},"scaffold_version":{"type":"string","title":"Scaffold Version"},"tender_track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tender Track Id"},"extra":{"additionalProperties":true,"type":"object","title":"Extra","default":{}},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"documents":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Documents"},"template":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template"}},"type":"object","required":["id","title","programme","status","template_id","scaffold_version"],"title":"TenderFileResponse"},"TenderItem":{"properties":{"id":{"type":"integer","title":"Id"},"publication_number":{"type":"string","title":"Publication Number"},"notice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice Id"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"official_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Official Name"},"buyer_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Country"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"cpv_codes":{"items":{},"type":"array","title":"Cpv Codes"},"cpv_main":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpv Main"},"contract_nature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Nature"},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"estimated_value_currency":{"type":"string","title":"Estimated Value Currency","default":"EUR"},"publication_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publication Date"},"submission_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submission Deadline"},"has_lots":{"type":"boolean","title":"Has Lots","default":false},"lot_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lot Count"},"ted_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ted Url"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"sme_suitability_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sme Suitability Score"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","publication_number","title"],"title":"TenderItem"},"TenderMatchListResponse":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/TenderMatchWithTender"},"type":"array","title":"Matches"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["matches","total","page","page_size","total_pages"],"title":"TenderMatchListResponse","description":"Response for match listing"},"TenderMatchResponse":{"properties":{"match_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Match Score","description":"Match score (0-100)"},"match_reasons":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Match Reasons","description":"Score breakdown by criteria"},"match_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Details","description":"Human-readable match explanation"},"id":{"type":"integer","title":"Id"},"tender_id":{"type":"integer","title":"Tender Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"is_viewed":{"type":"boolean","title":"Is Viewed","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_dismissed":{"type":"boolean","title":"Is Dismissed","default":false},"is_applied":{"type":"boolean","title":"Is Applied","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"user_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"User Rating"},"notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Notified At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["match_score","id","tender_id","user_id"],"title":"TenderMatchResponse","description":"Schema for tender match response"},"TenderMatchUpdate":{"properties":{"is_saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Saved"},"is_dismissed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dismissed"},"is_applied":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Applied"},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"user_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"User Rating"}},"type":"object","title":"TenderMatchUpdate","description":"Schema for updating a tender match"},"TenderMatchWithTender":{"properties":{"match_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Match Score","description":"Match score (0-100)"},"match_reasons":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Match Reasons","description":"Score breakdown by criteria"},"match_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Details","description":"Human-readable match explanation"},"id":{"type":"integer","title":"Id"},"tender_id":{"type":"integer","title":"Tender Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"is_viewed":{"type":"boolean","title":"Is Viewed","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_dismissed":{"type":"boolean","title":"Is Dismissed","default":false},"is_applied":{"type":"boolean","title":"Is Applied","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"user_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"User Rating"},"notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Notified At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"tender":{"$ref":"#/components/schemas/TenderSummary"}},"type":"object","required":["match_score","id","tender_id","user_id","tender"],"title":"TenderMatchWithTender","description":"Match response including tender summary"},"TenderProfileCreate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Company Name","description":"Company name"},"company_size":{"anyOf":[{"$ref":"#/components/schemas/CompanySize"},{"type":"null"}],"description":"SME category"},"annual_turnover":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Annual Turnover","description":"Annual turnover in EUR"},"employee_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Employee Count","description":"Number of employees"},"years_in_business":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Years In Business","description":"Years in business"},"cpv_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Categories","description":"CPV code categories (e.g., ['72', '48'])"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes","description":"Specific CPV codes of interest"},"sectors_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sectors Description","description":"Free-text business sector description"},"countries_of_interest":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries Of Interest","description":"ISO country codes"},"nuts_regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Nuts Regions","description":"NUTS region codes"},"eu_wide":{"type":"boolean","title":"Eu Wide","description":"Open to all EU tenders","default":true},"min_tender_value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Min Tender Value","description":"Minimum tender value"},"max_tender_value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Max Tender Value","description":"Maximum tender value"},"preferred_procedures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Procedures","description":"Preferred procedure types"},"exclude_frameworks":{"type":"boolean","title":"Exclude Frameworks","description":"Exclude framework agreements","default":false},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords","description":"Keywords to look for"},"excluded_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Excluded Keywords","description":"Keywords to exclude"},"min_deadline_days":{"type":"integer","maximum":180.0,"minimum":7.0,"title":"Min Deadline Days","description":"Minimum days until deadline","default":30},"certifications":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Certifications","description":"Company certifications"},"notification_frequency":{"$ref":"#/components/schemas/NotificationFrequency","description":"How often to receive notifications","default":"weekly"},"notification_email":{"type":"boolean","title":"Notification Email","description":"Receive email notifications","default":true},"notification_in_app":{"type":"boolean","title":"Notification In App","description":"Receive in-app notifications","default":true}},"type":"object","title":"TenderProfileCreate","description":"Schema for creating a tender profile"},"TenderProfileResponse":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Company Name","description":"Company name"},"company_size":{"anyOf":[{"$ref":"#/components/schemas/CompanySize"},{"type":"null"}],"description":"SME category"},"annual_turnover":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Annual Turnover","description":"Annual turnover in EUR"},"employee_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Employee Count","description":"Number of employees"},"years_in_business":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Years In Business","description":"Years in business"},"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"cpv_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Categories"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes"},"sectors_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sectors Description"},"countries_of_interest":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries Of Interest"},"nuts_regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Nuts Regions"},"eu_wide":{"type":"boolean","title":"Eu Wide","default":true},"min_tender_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Tender Value"},"max_tender_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Tender Value"},"preferred_procedures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Procedures"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords"},"min_deadline_days":{"type":"integer","title":"Min Deadline Days","default":30},"certifications":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Certifications"},"notification_frequency":{"$ref":"#/components/schemas/NotificationFrequency","default":"weekly"},"notification_email":{"type":"boolean","title":"Notification Email","default":true},"notification_in_app":{"type":"boolean","title":"Notification In App","default":true},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_matched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Matched At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","user_id"],"title":"TenderProfileResponse","description":"Schema for tender profile response"},"TenderProfileUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"company_size":{"anyOf":[{"$ref":"#/components/schemas/CompanySize"},{"type":"null"}]},"annual_turnover":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Turnover"},"employee_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Count"},"cpv_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Categories"},"cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cpv Codes"},"countries_of_interest":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries Of Interest"},"eu_wide":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Eu Wide"},"min_tender_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Tender Value"},"max_tender_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Tender Value"},"preferred_procedures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Procedures"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords"},"min_deadline_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Deadline Days"},"certifications":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Certifications"},"notification_frequency":{"anyOf":[{"$ref":"#/components/schemas/NotificationFrequency"},{"type":"null"}]},"notification_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notification Email"},"notification_in_app":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notification In App"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TenderProfileUpdate","description":"Schema for updating a tender profile"},"TenderSearchResponse":{"properties":{"tenders":{"items":{"$ref":"#/components/schemas/TenderSummary"},"type":"array","title":"Tenders"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["tenders","total","page","page_size","total_pages"],"title":"TenderSearchResponse","description":"Response for tender search"},"TenderSectionRequest":{"properties":{"template_id":{"type":"string","title":"Template Id","description":"Template id e.g. 'eic-accelerator-stage-1'"},"section_id":{"type":"string","title":"Section Id","description":"Section or sub-section id e.g. '1.1' or '3.2'"},"funding_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Funding Mode","description":"'grant-only' | 'equity-only' | 'blended'  used for conditional sections"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topic_variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Variant"},"org_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Org Context","description":"Optional org-profile facts (company name, sector, stage, founder count, prior projects)"},"prior_sections":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Prior Sections","description":"Map of section_id -> markdown the user already drafted, for narrative coherence"},"user_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Intent","description":"Free-text user steering for this section"},"max_words":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Words","description":"Override the page_budget-derived word target"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang","description":"Language to draft in, one of Brubru's six (en, es, ca, fr, it, nl). Defaults to English. The provider chain is multilingual; it just has to be told."}},"type":"object","required":["template_id","section_id"],"title":"TenderSectionRequest"},"TenderSectionResponse":{"properties":{"template_id":{"type":"string","title":"Template Id"},"section_id":{"type":"string","title":"Section Id"},"markdown":{"type":"string","title":"Markdown"},"word_count":{"type":"integer","title":"Word Count"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"disclosure":{"additionalProperties":true,"type":"object","title":"Disclosure"},"section":{"additionalProperties":true,"type":"object","title":"Section"}},"type":"object","required":["template_id","section_id","markdown","word_count","disclosure","section"],"title":"TenderSectionResponse"},"TenderStatistics":{"properties":{"total_tenders":{"type":"integer","title":"Total Tenders","default":0},"open_tenders":{"type":"integer","title":"Open Tenders","default":0},"tenders_this_week":{"type":"integer","title":"Tenders This Week","default":0},"average_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Value"},"by_country":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Country","default":{}},"by_cpv_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Cpv Category","default":{}},"by_procedure_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Procedure Type","default":{}}},"type":"object","title":"TenderStatistics","description":"Tender statistics for dashboard"},"TenderStatus":{"type":"string","enum":["open","closed","awarded","cancelled"],"title":"TenderStatus","description":"Tender status values"},"TenderSummary":{"properties":{"id":{"type":"integer","title":"Id"},"publication_number":{"type":"string","title":"Publication Number"},"title":{"type":"string","title":"Title"},"official_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Official Name"},"buyer_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Country"},"cpv_main":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpv Main"},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"estimated_value_currency":{"type":"string","title":"Estimated Value Currency","default":"EUR"},"submission_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submission Deadline"},"status":{"$ref":"#/components/schemas/TenderStatus","default":"open"},"sme_suitability_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sme Suitability Score"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"contract_nature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Nature"},"procedure_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Label","description":"Plain-language procedure, e.g. \"Negotiated (with prior call)\".","readOnly":true},"contract_nature_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Nature Label","description":"Works / Supplies / Services, capitalised for reading.","readOnly":true}},"type":"object","required":["id","publication_number","title","procedure_label","contract_nature_label"],"title":"TenderSummary","description":"Compact tender summary for list views"},"TenderTemplateItem":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical URL: the EU funding portal page for this template when known, else the Brubru Tenderator surface."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body composed from sections + reference docs: null on list (Summary), populated on detail."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body: null on list, populated on detail."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Next call deadline if known (deadline_2026_cet / first cut-off / deadline_2027_indicative_cet); null for evergreen calls."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated."},"id":{"type":"string","title":"Id","description":"Stable template slug (filename without .json), e.g. 'eic-accelerator-stage-2', 'esf-plus-agency-procurement'."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme","description":"EU funding programme (Horizon Europe / EIC, Erasmus+, Digital Europe, CERV, LIFE, Creative Europe, CEF, ESF+)."},"sub_instrument":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Instrument","description":"Sub-instrument inside the programme (e.g. 'accelerator', 'pathfinder', 'media', 'agency-procurement')."},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Application stage (e.g. 'stage-1', 'stage-2', 'full-proposal')."},"scaffold_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scaffold Version","description":"Brubru-internal version tag for the section scaffold."},"kb_guide":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kb Guide","description":"Slug of the related Brubru knowledge guide."},"topic_id_default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id Default","description":"Default F&T Portal topic id this template is anchored to."},"deadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deadline","description":"Representative next deadline (CET)."},"official_template_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Official Template Url","description":"EU's authoritative template page: the Funding & Tenders Portal source."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Free-text note (e.g. caveats, placeholder status)."},"documents":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Documents","description":"Section structure + AI prompt seeds per document: detail only."},"comply_targets":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Comply Targets","description":"Template's comply_target labels (drives the comply-clusters cross-fetch): detail only."},"hand_offs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Hand Offs","description":"Hand-off CTAs for the next stage (chat / comply) once this template is completed: detail only."},"model_grant_agreement_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Grant Agreement Url","description":"EU's Model Grant Agreement page: detail only."},"annotated_grant_agreement_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annotated Grant Agreement Url","description":"EU's Annotated Model Grant Agreement page: detail only."},"reference_docs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Reference Docs","description":"Curated reference-doc bundle: list of {label, url, ...} entries (Model/Annotated Grant Agreement, unit-cost guidance, programme regulations, ...). Detail only."}},"type":"object","required":["id","name"],"title":"TenderTemplateItem","description":"One Brubru funding template (list / detail shape)."},"TenderatorSettings":{"properties":{"default_max_value":{"type":"number","title":"Default Max Value","description":"Default SME value threshold","default":5000000},"fetch_frequency":{"type":"string","title":"Fetch Frequency","description":"weekly, bi-weekly, or daily","default":"weekly"},"enabled_countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enabled Countries"},"enabled_cpv_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enabled Cpv Codes"},"auto_matching_enabled":{"type":"boolean","title":"Auto Matching Enabled","default":true},"auto_notifications_enabled":{"type":"boolean","title":"Auto Notifications Enabled","default":true},"match_score_threshold":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Match Score Threshold","default":50.0}},"type":"object","title":"TenderatorSettings","description":"Tenderator system settings."},"TermsListResponse":{"properties":{"terms":{"items":{"$ref":"#/components/schemas/ParliamentaryTermInfo"},"type":"array","title":"Terms"}},"type":"object","required":["terms"],"title":"TermsListResponse","description":"Response for list of available terms."},"TextAdoptedDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"ta_reference":{"type":"string","title":"Ta Reference"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"text_type":{"$ref":"#/components/schemas/schemas__texts_adopted_schemas__TextType"},"adoption_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Adoption Date"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"parliamentary_term":{"type":"integer","title":"Parliamentary Term"},"full_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text"},"committees":{"items":{"type":"string"},"type":"array","title":"Committees"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"},"celex_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex Number"},"vote_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vote Results"},"related_documents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Related Documents"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"full_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"legislative_carriage_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Legislative Carriage Id"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"is_tracked":{"type":"boolean","title":"Is Tracked","default":false},"user_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Notes"},"tracked_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tracked Since"}},"type":"object","required":["id","ta_reference","title","text_type","parliamentary_term"],"title":"TextAdoptedDetailResponse","description":"Full detail response with content and tracking info."},"TextAdoptedListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TextAdoptedSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"filters_applied":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters Applied"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From"},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To"},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note"}},"type":"object","required":["items","total","limit","offset"],"title":"TextAdoptedListResponse","description":"Paginated list response."},"TextAdoptedSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"ta_reference":{"type":"string","title":"Ta Reference"},"title":{"type":"string","title":"Title"},"text_type":{"$ref":"#/components/schemas/schemas__texts_adopted_schemas__TextType"},"adoption_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Adoption Date"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"parliamentary_term":{"type":"integer","title":"Parliamentary Term"},"committees":{"items":{"type":"string"},"type":"array","title":"Committees"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"full_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text Url"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["id","ta_reference","title","text_type","parliamentary_term"],"title":"TextAdoptedSummary","description":"Summary schema for list views."},"TextItem":{"properties":{"id":{"type":"string","title":"Id"},"ta_reference":{"type":"string","title":"Ta Reference"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"text_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Type"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"parliamentary_term":{"type":"integer","title":"Parliamentary Term","default":10},"adoption_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Adoption Date"},"committees":{"items":{},"type":"array","title":"Committees"},"rapporteur_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Name"},"rapporteur_mep_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rapporteur Mep Id"},"celex_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex Number"},"vote_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vote Results"},"related_documents":{"items":{},"type":"array","title":"Related Documents"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"full_text_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text Url"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"has_full_text":{"type":"boolean","title":"Has Full Text","default":false},"full_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Text"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — full_text_url / pdf_url / source_url fallback chain."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Adoption date (date-only view of adoption_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row (alias of last_updated)."}},"type":"object","required":["id","ta_reference","title"],"title":"TextItem"},"TextType-Input":{"type":"string","enum":["resolution","legislative_resolution","decision","recommendation","other"],"title":"TextType","description":"Types of adopted texts."},"TextileAct":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen/machine deep-link for this act (== deep_link)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body — null here (see the deep-link for the full explainer)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body — null here."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Publication/signature date of the underlying act (null for pending procedures)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru resolved this row (server time)."},"celex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Celex","description":"CELEX number (null for delegated acts / proposals identified by procedure ref)."},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref","description":"OEIL procedure reference for pending delegated acts / proposals (e.g. '2026/2615(DEA)')."},"kind":{"type":"string","title":"Kind","description":"directive | regulation | delegated_act | proposal."},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli","description":"Datapoint 1 — ELI permalink (the stable link). Null for acts not yet adopted."},"title":{"type":"string","title":"Title","description":"Datapoint 2 — plain-language title in the requested `lang`."},"titles":{"additionalProperties":{"type":"string"},"type":"object","title":"Titles","description":"Plain-language titles in ca/es/en."},"role":{"type":"string","title":"Role","description":"Why this act is in the textile-circularity corpus."},"status":{"type":"string","title":"Status","description":"Datapoint 3 — 'in_force' or 'pending'."},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force","description":"Live in-force flag resolved from Cellar (null if unresolved)."},"entry_into_force":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Entry Into Force","description":"Entry-into-force date (from Cellar or curated)."},"transposition":{"items":{"$ref":"#/components/schemas/Transposition"},"type":"array","title":"Transposition","description":"Per-Member-State transposition deadlines (directives only)."},"key_dates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Key Dates","description":"Datapoint 3 — key operational dates ({date, label}) in the requested `lang`."},"latest_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Step","description":"Datapoint 4 — latest legislative step (from legislative_carriages; pending acts only)."},"deep_link":{"type":"string","title":"Deep Link","description":"Datapoint 5 — Brubru deep-link (canon page or knowledge guide)."}},"type":"object","required":["kind","title","role","status","deep_link"],"title":"TextileAct","description":"One act in the textile-circularity corpus with the 5-datapoint contract."},"ThemeFacet":{"properties":{"theme":{"type":"string","title":"Theme"},"dataset_count":{"type":"integer","title":"Dataset Count"}},"type":"object","required":["theme","dataset_count"],"title":"ThemeFacet"},"TileEmptyState":{"properties":{"reason":{"type":"string","enum":["no_profile","no_tracked_files","no_recent_activity","no_matches"],"title":"Reason"},"message":{"type":"string","title":"Message","description":"One sentence the user reads on the empty tile."},"cta_label":{"type":"string","title":"Cta Label","description":"Button label for the empty-state CTA."},"cta_path":{"type":"string","title":"Cta Path","description":"Internal route the CTA links to (e.g. /profile)."}},"type":"object","required":["reason","message","cta_label","cta_path"],"title":"TileEmptyState","description":"Honest empty-state payload. When a tile has no real data to surface, it\nmust explain why and offer the user one concrete next action."},"TimelinePredictionResponse":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"current_status":{"type":"string","title":"Current Status"},"days_in_status":{"type":"integer","title":"Days In Status"},"predicted_days_remaining":{"type":"integer","title":"Predicted Days Remaining"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"lower_bound_25":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lower Bound 25"},"upper_bound_75":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Upper Bound 75"},"model_version":{"type":"string","title":"Model Version","default":"baseline"},"prediction_method":{"type":"string","title":"Prediction Method","default":"historical_average"},"similar_procedures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Similar Procedures","default":[]}},"type":"object","required":["procedure_ref","current_status","days_in_status","predicted_days_remaining","confidence"],"title":"TimelinePredictionResponse","description":"Timeline prediction response."},"TodayDigestResponse":{"properties":{"today_count":{"type":"integer","title":"Today Count"},"today_events":{"items":{"$ref":"#/components/schemas/CalendarEventResponse"},"type":"array","title":"Today Events"},"tomorrow_count":{"type":"integer","title":"Tomorrow Count"},"tomorrow_events":{"items":{"$ref":"#/components/schemas/CalendarEventResponse"},"type":"array","title":"Tomorrow Events"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"}},"type":"object","required":["today_count","today_events","tomorrow_count","tomorrow_events"],"title":"TodayDigestResponse","description":"Today's events digest for 'My EU Today' panel."},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"user":{"$ref":"#/components/schemas/UserResponse"},"previous_last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Previous Last Login"}},"type":"object","required":["access_token","token_type","user"],"title":"Token","description":"JWT token response"},"TopicSpike":{"properties":{"topic":{"type":"string","title":"Topic"},"weight":{"type":"integer","title":"Weight"},"brief_count":{"type":"integer","title":"Brief Count"},"eprs_count":{"type":"integer","title":"Eprs Count"},"carriage_count":{"type":"integer","title":"Carriage Count"},"sample_titles":{"items":{"type":"string"},"type":"array","title":"Sample Titles"}},"type":"object","required":["topic","weight","brief_count","eprs_count","carriage_count","sample_titles"],"title":"TopicSpike"},"TopicSpikesResponse":{"properties":{"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"items":{"items":{"$ref":"#/components/schemas/TopicSpike"},"type":"array","title":"Items"}},"type":"object","required":["period_start","period_end","items"],"title":"TopicSpikesResponse"},"TopupRequest":{"properties":{"amount_eur":{"type":"number","maximum":5000.0,"exclusiveMinimum":0.0,"title":"Amount Eur","description":"Amount in EUR. Minimum 1."}},"additionalProperties":false,"type":"object","required":["amount_eur"],"title":"TopupRequest"},"TopupResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"checkout_url":{"type":"string","title":"Checkout Url"},"amount_eur":{"type":"number","title":"Amount Eur"}},"type":"object","required":["session_id","checkout_url","amount_eur"],"title":"TopupResponse"},"TopupRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"amount_eur":{"type":"number","title":"Amount Eur"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"succeeded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Succeeded At"}},"type":"object","required":["id","amount_eur","status","created_at","succeeded_at"],"title":"TopupRow"},"TourProgressResponse":{"properties":{"completed_tours":{"items":{"type":"string"},"type":"array","title":"Completed Tours"},"skipped_tours":{"items":{"type":"string"},"type":"array","title":"Skipped Tours"}},"type":"object","required":["completed_tours","skipped_tours"],"title":"TourProgressResponse","description":"Response with tour progress"},"TourProgressUpdate":{"properties":{"completed_tours":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Completed Tours"},"skipped_tours":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Skipped Tours"}},"type":"object","title":"TourProgressUpdate","description":"Request to update tour progress"},"TrDetail":{"properties":{"identification_code":{"type":"string","title":"Identification Code"},"registration_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Registration Date"},"last_update_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Update Date"},"original_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Name"},"acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acronym"},"entity_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Form"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"registration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Category"},"head_office_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Address"},"head_office_post_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Post Code"},"head_office_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office City"},"head_office_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Country"},"head_office_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Phone"},"eu_office_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Office Address"},"eu_office_post_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Office Post Code"},"eu_office_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Office City"},"eu_office_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Office Country"},"eu_office_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Office Phone"},"goals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goals"},"eu_legislative_proposals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Legislative Proposals"},"communication_activities":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Communication Activities"},"intergroup_activities":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intergroup Activities"},"info_members":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Info Members"},"is_member_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Member Of"},"organisation_members":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Members"},"interest_represented":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interest Represented"},"complementary_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complementary Info"},"members_100_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Members 100 Percent"},"members_50_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Members 50 Percent"},"members_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Members Total"},"members_fte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Members Fte"},"ep_accredited_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ep Accredited Number"},"financial_year_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Financial Year Start"},"financial_year_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Financial Year End"},"costs_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Costs Min"},"costs_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Costs Max"},"grants_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grants Total"},"intermediaries_costs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intermediaries Costs"},"new_organisation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"New Organisation"},"levels_of_interest":{"items":{"type":"string"},"type":"array","title":"Levels Of Interest"},"interests":{"items":{"type":"string"},"type":"array","title":"Interests"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias for body_text/body_html."},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Registration date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this row (alias of fetched_at)."}},"type":"object","required":["identification_code"],"title":"TrDetail"},"TrListItem":{"properties":{"identification_code":{"type":"string","title":"Identification Code"},"original_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Name"},"acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acronym"},"registration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Category"},"head_office_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office Country"},"head_office_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Office City"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"ep_accredited_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ep Accredited Number"},"members_fte":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Members Fte"},"costs_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Costs Max"},"registration_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Registration Date"},"last_update_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Update Date"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: name + acronym + category + country + city + FTE + costs + dates."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Registration date (date-only)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Last update of this registrant (alias of last_update_date)."}},"type":"object","required":["identification_code"],"title":"TrListItem"},"TrackCommissionDocRequest":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"User notes"},"notify_on_new_documents":{"type":"boolean","title":"Notify On New Documents","description":"Notify on updates","default":true}},"type":"object","title":"TrackCommissionDocRequest","description":"Request to track a Commission document."},"TrackConsultationRequest":{"properties":{"notify_on_deadline":{"type":"boolean","title":"Notify On Deadline","default":true},"notify_on_outcome":{"type":"boolean","title":"Notify On Outcome","default":true},"notify_days_before":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Notify Days Before","default":7},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"priority":{"type":"integer","maximum":2.0,"minimum":0.0,"title":"Priority","default":0}},"type":"object","title":"TrackConsultationRequest","description":"Request to track a consultation."},"TrackLegislationRequest":{"properties":{"celex_number":{"type":"string","title":"Celex Number"}},"type":"object","required":["celex_number"],"title":"TrackLegislationRequest","description":"Request to track legislation by CELEX."},"TrackProcedureRequest":{"properties":{"procedure_reference":{"type":"string","title":"Procedure Reference"}},"type":"object","required":["procedure_reference"],"title":"TrackProcedureRequest","description":"Request to track OEIL procedure."},"TrackTextRequest":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"User notes"}},"type":"object","title":"TrackTextRequest","description":"Request to track an adopted text."},"TrackWorkItemRequest":{"properties":{"notify_on_status_change":{"type":"boolean","title":"Notify On Status Change","description":"Notify on status changes","default":true},"notify_on_rapporteur_change":{"type":"boolean","title":"Notify On Rapporteur Change","description":"Notify on rapporteur changes","default":true},"notify_on_new_documents":{"type":"boolean","title":"Notify On New Documents","description":"Notify on new documents","default":true},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"User notes"}},"type":"object","title":"TrackWorkItemRequest","description":"Request to track a work item."},"TrackedCommissionDocResponse":{"properties":{"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"document":{"$ref":"#/components/schemas/CommissionDocumentSummary"},"tracked_since":{"type":"string","format":"date-time","title":"Tracked Since"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"notify_on_new_documents":{"type":"boolean","title":"Notify On New Documents","default":true}},"type":"object","required":["document","tracked_since"],"title":"TrackedCommissionDocResponse","description":"Response for a tracked Commission document."},"TrackedCommissionDocsListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrackedCommissionDocResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"TrackedCommissionDocsListResponse","description":"Response for list of tracked Commission documents."},"TrackedConsultationResponse":{"properties":{"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"consultation":{"$ref":"#/components/schemas/ConsultationListItem"},"tracked_since":{"type":"string","format":"date-time","title":"Tracked Since"},"notify_on_deadline":{"type":"boolean","title":"Notify On Deadline","default":true},"notify_on_outcome":{"type":"boolean","title":"Notify On Outcome","default":true},"notify_days_before":{"type":"integer","title":"Notify Days Before","default":7},"submission_status":{"$ref":"#/components/schemas/SubmissionStatus","default":"not_started"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"priority":{"type":"integer","title":"Priority","default":0},"last_notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Notified At"}},"type":"object","required":["consultation","tracked_since"],"title":"TrackedConsultationResponse","description":"Response for a tracked consultation."},"TrackedConsultationsListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrackedConsultationResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"TrackedConsultationsListResponse","description":"List of tracked consultations."},"TrackedFileMovingItem":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"title":{"type":"string","title":"Title"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref"},"old_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Status"},"new_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Status"},"changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Changed At"}},"type":"object","required":["carriage_id","title"],"title":"TrackedFileMovingItem","description":"A tracked file whose status moved in the last 7 days."},"TrackedFilesMovingTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/TrackedFileMovingItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"TrackedFilesMovingTile"},"TrackedItemsResponse":{"properties":{"legislation":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Legislation"},"procedures":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Procedures"},"amendments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Amendments"}},"type":"object","required":["legislation","procedures","amendments"],"title":"TrackedItemsResponse","description":"Response with all tracked items."},"TrackedTextAdoptedResponse":{"properties":{"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"text":{"$ref":"#/components/schemas/TextAdoptedSummary"},"tracked_since":{"type":"string","format":"date-time","title":"Tracked Since"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["text","tracked_since"],"title":"TrackedTextAdoptedResponse","description":"Response for a tracked adopted text."},"TrackedTextsListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrackedTextAdoptedResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"TrackedTextsListResponse","description":"Response for list of tracked texts."},"TrackedWorkItemResponse":{"properties":{"track_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Track Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"work_item":{"$ref":"#/components/schemas/CommitteeWorkItemSummary"},"tracked_since":{"type":"string","format":"date-time","title":"Tracked Since"},"notify_on_status_change":{"type":"boolean","title":"Notify On Status Change","default":true},"notify_on_rapporteur_change":{"type":"boolean","title":"Notify On Rapporteur Change","default":true},"notify_on_new_documents":{"type":"boolean","title":"Notify On New Documents","default":true},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"last_notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Notified At"}},"type":"object","required":["work_item","tracked_since"],"title":"TrackedWorkItemResponse","description":"Response for a tracked work item."},"TrackedWorkItemsListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrackedWorkItemResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"TrackedWorkItemsListResponse","description":"Response for list of tracked work items."},"TradeDefenceDetail":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"work_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Uri"},"measure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measure Type"},"duty_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duty Status"},"target_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Country"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"resource_type_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Uri"},"resource_type_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type Label"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"date_in_force":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date In Force"},"date_end_validity":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date End Validity"},"available_languages":{"items":{"type":"string"},"type":"array","title":"Available Languages"},"eurovoc_concepts":{"items":{"type":"string"},"type":"array","title":"Eurovoc Concepts"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Source"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"DEPRECATED — back-compat alias for body_text/body_html."},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — alias of eurlex_url."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last fetched this regulation (alias of fetched_at)."}},"type":"object","required":["celex","eurlex_url"],"title":"TradeDefenceDetail"},"TradeDefenceListItem":{"properties":{"celex":{"type":"string","title":"Celex"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"measure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measure Type","description":"Brubru-derived: anti_dumping / countervailing / safeguard / registration / other."},"duty_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duty Status","description":"definitive / provisional / initiation / registration / review / expiry_review / interim_review / amendment / suspension / termination / other."},"target_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Country"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"eurlex_url":{"type":"string","title":"Eurlex Url"},"has_body":{"type":"boolean","title":"Has Body","description":"False on list rows. Call the detail endpoint for the regulation text.","default":false},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — alias of eurlex_url (EUR-Lex page for this regulation)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + measure type + duty status + target country + product + dates. Full body on the detail endpoint."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time this row was last refreshed."}},"type":"object","required":["celex","eurlex_url"],"title":"TradeDefenceListItem"},"TrainCarriage":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"oeil_procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oeil Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"is_blocked":{"type":"boolean","title":"Is Blocked","default":false},"days_in_current_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Current Status"},"lead_committee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Committee"},"ec_priority_ids":{"items":{},"type":"array","title":"Ec Priority Ids"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"expected_completion":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Completion"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"status_history":{"items":{},"type":"array","title":"Status History"},"oeil_key_events":{"items":{},"type":"array","title":"Oeil Key Events"},"law_tracker_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Law Tracker Url"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"OEIL procedure-file URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text of the cached OEIL procedure page."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML of the cached OEIL procedure page."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Date of the latest OEIL key event."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this carriage (alias of first_seen)."}},"type":"object","required":["id"],"title":"TrainCarriage"},"TrainListResponse":{"properties":{"trains":{"items":{"$ref":"#/components/schemas/LegislativeTrain"},"type":"array","title":"Trains"},"total":{"type":"integer","title":"Total"},"commission_term":{"type":"string","title":"Commission Term"}},"type":"object","required":["trains","total","commission_term"],"title":"TrainListResponse","description":"Response for train list endpoint"},"TrainStatistics":{"properties":{"train_id":{"type":"string","title":"Train Id"},"train_name":{"type":"string","title":"Train Name"},"total_files":{"type":"integer","title":"Total Files"},"files_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Files By Status"},"average_days_per_status":{"additionalProperties":{"type":"number"},"type":"object","title":"Average Days Per Status"},"blocked_files_count":{"type":"integer","title":"Blocked Files Count"},"completion_rate":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Completion Rate","description":"Proportion of completed files"}},"type":"object","required":["train_id","train_name","total_files","files_by_status","average_days_per_status","blocked_files_count","completion_rate"],"title":"TrainStatistics","description":"Statistics for a legislative train"},"TransparencyMeetingItem":{"properties":{"id":{"type":"string","title":"Id"},"host_uuid":{"type":"string","title":"Host Uuid"},"host_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Name"},"host_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Role"},"host_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Dg"},"host_cabinet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Cabinet"},"meeting_date":{"type":"string","format":"date","title":"Meeting Date"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"subject":{"type":"string","title":"Subject"},"organisation_met":{"type":"string","title":"Organisation Met"},"transparency_register_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transparency Register Id"},"organisation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Type"},"representatives":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Representatives"},"source_url":{"type":"string","title":"Source Url"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"related_celex":{"items":{},"type":"array","title":"Related Celex"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Canonical citizen URL (alias of source_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body composed from the meeting record: subject + host + organisation met + location + representatives + policy areas."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML rendering of the same composition (paragraphs + key:value rows)."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Start Date","description":"The meeting date (alias of meeting_date — this IS a meeting endpoint)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this row."}},"type":"object","required":["id","host_uuid","meeting_date","subject","organisation_met","source_url"],"title":"TransparencyMeetingItem"},"Transposition":{"properties":{"member_state":{"type":"string","title":"Member State","description":"Member State ISO code (ES, BG, ...)."},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline","description":"Transposition deadline for this Member State."}},"type":"object","required":["member_state"],"title":"Transposition"},"TypeAmendmentCount":{"properties":{"amendment_type":{"type":"string","title":"Amendment Type"},"count":{"type":"integer","title":"Count"},"percentage":{"type":"number","title":"Percentage","default":0.0}},"type":"object","required":["amendment_type","count"],"title":"TypeAmendmentCount","description":"Amendment count by type (modification, suppression, addition)."},"TypeCount":{"properties":{"measure_type":{"type":"string","title":"Measure Type"},"duty_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duty Status"},"in_force":{"type":"integer","title":"In Force"},"historical":{"type":"integer","title":"Historical"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["measure_type","duty_status","in_force","historical","total"],"title":"TypeCount"},"UnreadCountResponse":{"properties":{"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["unread_count"],"title":"UnreadCountResponse","description":"Unread notifications count response."},"UnsubscribeRequest":{"properties":{"feed_id":{"type":"string","title":"Feed Id","description":"Feed ID to unsubscribe"}},"type":"object","required":["feed_id"],"title":"UnsubscribeRequest","description":"Request for unsubscribe"},"UnsubscribeResponse":{"properties":{"message":{"type":"string","title":"Message"},"feed_id":{"type":"string","title":"Feed Id"}},"type":"object","required":["message","feed_id"],"title":"UnsubscribeResponse","description":"Response for unsubscribe"},"UpdateSavedEntryRequest":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"collection_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Name"},"is_starred":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Starred"}},"type":"object","title":"UpdateSavedEntryRequest","description":"Schema for updating a saved entry"},"UpgradeRequest":{"properties":{"plan":{"type":"string","pattern":"^(chat|bubble|amendator|comply|tenderator|starter|advocate|professional|ep)$","title":"Plan"},"billing_period":{"type":"string","pattern":"^(monthly|annual)$","title":"Billing Period"}},"type":"object","required":["plan","billing_period"],"title":"UpgradeRequest","description":"Subscription upgrade request"},"UsageRow":{"properties":{"id":{"type":"integer","title":"Id"},"endpoint":{"type":"string","title":"Endpoint"},"method":{"type":"string","title":"Method"},"cost_eur":{"type":"number","title":"Cost Eur"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"refunded":{"type":"boolean","title":"Refunded"},"is_sandbox":{"type":"boolean","title":"Is Sandbox"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","endpoint","method","cost_eur","status_code","refunded","is_sandbox","created_at"],"title":"UsageRow"},"UsageStats":{"properties":{"amendments_used":{"type":"integer","title":"Amendments Used"},"amendments_limit":{"type":"integer","title":"Amendments Limit"},"saved_searches_used":{"type":"integer","title":"Saved Searches Used"},"saved_searches_limit":{"type":"integer","title":"Saved Searches Limit"},"api_calls_used":{"type":"integer","title":"Api Calls Used"},"api_calls_limit":{"type":"integer","title":"Api Calls Limit"},"current_tier":{"type":"string","title":"Current Tier"},"subscription_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Expires At"},"can_upgrade":{"type":"boolean","title":"Can Upgrade"}},"type":"object","required":["amendments_used","amendments_limit","saved_searches_used","saved_searches_limit","api_calls_used","api_calls_limit","current_tier","subscription_expires_at","can_upgrade"],"title":"UsageStats","description":"User usage statistics"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":100,"minLength":8,"title":"Password"},"full_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Organization"}},"type":"object","required":["email","password"],"title":"UserCreate","description":"User registration schema"},"UserDocumentCreate":{"properties":{"document_type":{"type":"string","title":"Document Type","description":"Type: amendment, analysis, strategy, note"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title","description":"Document title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Main content"},"celex_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Celex Number","description":"CELEX number of related legislation"},"procedure_reference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Procedure Reference","description":"Legislative procedure reference"},"policy_areas":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Policy Areas","description":"Policy areas"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Tags","description":"User-defined tags"},"is_private":{"type":"boolean","title":"Is Private","description":"Whether document is private","default":true},"amendment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Target"},"amendment_justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Justification"},"amendment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Status"},"executive_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executive Summary"},"methodology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology"},"conclusions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusions"},"recommendations":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendations"},"objectives":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objectives"},"action_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Plan"},"timeline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeline"},"stakeholders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stakeholders"},"doc_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Doc Metadata"}},"type":"object","required":["document_type","title"],"title":"UserDocumentCreate","description":"Generic schema for creating any document type"},"UserDocumentListResponse":{"properties":{"documents":{"items":{"$ref":"#/components/schemas/UserDocumentResponse"},"type":"array","title":"Documents"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["documents","total","limit","offset","has_more"],"title":"UserDocumentListResponse","description":"Schema for paginated document list"},"UserDocumentResponse":{"properties":{"document_type":{"type":"string","title":"Document Type","description":"Type: amendment, analysis, strategy, note"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title","description":"Document title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Main content"},"celex_number":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Celex Number","description":"CELEX number of related legislation"},"procedure_reference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Procedure Reference","description":"Legislative procedure reference"},"policy_areas":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Policy Areas","description":"Policy areas"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Tags","description":"User-defined tags"},"is_private":{"type":"boolean","title":"Is Private","description":"Whether document is private","default":true},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"amendment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Target"},"amendment_justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Justification"},"amendment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Status"},"executive_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executive Summary"},"methodology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology"},"conclusions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusions"},"recommendations":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendations"},"objectives":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objectives"},"action_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Plan"},"timeline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeline"},"stakeholders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stakeholders"},"doc_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Doc Metadata"},"version":{"type":"integer","title":"Version"},"parent_document_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Document Id"},"view_count":{"type":"integer","title":"View Count"},"word_count":{"type":"integer","title":"Word Count","default":0},"storage_document_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Document Id"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"file_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Content Type"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"include_in_ai_context":{"type":"boolean","title":"Include In Ai Context","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_accessed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accessed At"}},"type":"object","required":["document_type","title","id","user_id","version","view_count","created_at","updated_at"],"title":"UserDocumentResponse","description":"Schema for document response"},"UserDocumentUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"policy_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Policy Areas"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"amendment_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Target"},"amendment_justification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Justification"},"amendment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Status"},"executive_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executive Summary"},"methodology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology"},"conclusions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conclusions"},"recommendations":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendations"},"objectives":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objectives"},"action_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Plan"},"timeline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeline"},"stakeholders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stakeholders"},"doc_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Doc Metadata"},"include_in_ai_context":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include In Ai Context"}},"type":"object","title":"UserDocumentUpdate","description":"Schema for updating a document"},"UserEngagementStats":{"properties":{"total_subscriptions":{"type":"integer","title":"Total Subscriptions"},"active_subscriptions":{"type":"integer","title":"Active Subscriptions"},"total_reads":{"type":"integer","title":"Total Reads"},"total_saves":{"type":"integer","title":"Total Saves"},"average_reading_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Reading Time Seconds"},"favorite_sources":{"items":{"type":"string"},"type":"array","title":"Favorite Sources"},"most_read_categories":{"items":{"type":"string"},"type":"array","title":"Most Read Categories"}},"type":"object","required":["total_subscriptions","active_subscriptions","total_reads","total_saves","favorite_sources","most_read_categories"],"title":"UserEngagementStats","description":"Schema for user engagement statistics"},"UserFeedSubscriptionCreate":{"properties":{"feed_id":{"type":"string","format":"uuid","title":"Feed Id","description":"RSS feed ID to subscribe to"},"notification_enabled":{"type":"boolean","title":"Notification Enabled","description":"Enable notifications for new entries","default":false}},"type":"object","required":["feed_id"],"title":"UserFeedSubscriptionCreate","description":"Schema for creating a feed subscription"},"UserFeedSubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"feed_id":{"type":"string","format":"uuid","title":"Feed Id"},"is_active":{"type":"boolean","title":"Is Active"},"notification_enabled":{"type":"boolean","title":"Notification Enabled"},"subscribed_at":{"type":"string","format":"date-time","title":"Subscribed At"},"last_viewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Viewed At"},"feed":{"anyOf":[{"$ref":"#/components/schemas/RSSFeedResponse"},{"type":"null"}]}},"type":"object","required":["id","user_id","feed_id","is_active","notification_enabled","subscribed_at"],"title":"UserFeedSubscriptionResponse","description":"Schema for feed subscription response"},"UserListResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/UserManagementResponse"},"type":"array","title":"Users"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["users","total","page","page_size"],"title":"UserListResponse","description":"Paginated user list envelope"},"UserManagementResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"is_trainer":{"type":"boolean","title":"Is Trainer","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"},"subscription_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Expires At"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"policy_interests":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Policy Interests"},"is_dormant":{"type":"boolean","title":"Is Dormant","default":false}},"type":"object","required":["id","email","full_name","role","is_active","is_verified","created_at","last_login","subscription_tier"],"title":"UserManagementResponse","description":"User details for admin panel"},"UserPositionPayload":{"properties":{"stance":{"type":"string","title":"Stance","description":"support | support_with_amendments | oppose | neutral | undecided"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"evidence_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Evidence Urls"},"priority_articles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Priority Articles"}},"type":"object","required":["stance"],"title":"UserPositionPayload"},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"preferred_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Name"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"role":{"type":"string","title":"Role"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"policy_interests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Interests"},"role_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Title"},"sectors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sectors"},"background_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Preference"},"subscription_tier":{"type":"string","title":"Subscription Tier"},"subscription_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"is_trainer":{"type":"boolean","title":"Is Trainer","default":false}},"type":"object","required":["id","email","full_name","first_name","preferred_name","timezone","language","organization","role","avatar_url","country","policy_interests","background_preference","subscription_tier","subscription_expires_at","created_at","last_login","is_active","is_verified"],"title":"UserResponse","description":"User response schema"},"UserSavedEntryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"rss_entry_id":{"type":"string","format":"uuid","title":"Rss Entry Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"collection_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Name"},"is_starred":{"type":"boolean","title":"Is Starred"},"saved_at":{"type":"string","format":"date-time","title":"Saved At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_viewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Viewed At"},"entry":{"anyOf":[{"$ref":"#/components/schemas/RSSEntryResponse"},{"type":"null"}]}},"type":"object","required":["id","user_id","rss_entry_id","is_starred","saved_at","updated_at"],"title":"UserSavedEntryResponse","description":"Schema for saved entry response"},"UserTenderStatistics":{"properties":{"total_matches":{"type":"integer","title":"Total Matches","default":0},"saved_tenders":{"type":"integer","title":"Saved Tenders","default":0},"dismissed_tenders":{"type":"integer","title":"Dismissed Tenders","default":0},"applied_tenders":{"type":"integer","title":"Applied Tenders","default":0},"average_match_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Match Score"},"matches_this_week":{"type":"integer","title":"Matches This Week","default":0}},"type":"object","title":"UserTenderStatistics","description":"User-specific tender statistics"},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Organization"},"country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country"},"policy_interests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Interests"},"role_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Role Title"},"sectors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sectors"},"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"preferred_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Preferred Name"},"timezone":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Timezone"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"background_preference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Background Preference"}},"type":"object","title":"UserUpdate","description":"User profile update schema"},"UserUpdateRequest":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"is_trainer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Trainer"},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"}},"type":"object","title":"UserUpdateRequest","description":"Request to update user details"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCitationItem":{"properties":{"ref":{"type":"string","title":"Ref","description":"Canonical reference (CELEX form for COM input)"},"kind":{"type":"string","title":"Kind","description":"celex | com_as_celex | oeil | unknown"},"status":{"type":"string","title":"Status","description":"ok | broken | unknown"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing EUR-Lex page for the document — the link humans share. Pattern: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:{celex}. Always populated for CELEX/COM refs."},"resolved_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Url","description":"Cellar manifestation URL the verifier hit — typically cellar/<UUID>/DOC_1, suitable for machine consumption. Distinct from public_url; partners should use public_url for display and resolved_url for downstream pipelines that consume the document."},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms","description":"Network latency on the verifying call (null on cache hit)"},"original_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Form","description":"The form the caller passed in"},"from_cache":{"type":"boolean","title":"From Cache","default":false},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body of the document (Cellar XHTML stripped to text). Null when document is metadata-only or body fetch failed."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body of the document (Cellar XHTML manifestation, EN). Null when XHTML manifestation is unavailable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this CELEX first entered Brubru's eu_laws corpus (our scrape date). Null when CELEX is not in the corpus."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The document's adoption or publication date (from eu_laws). Null when CELEX is not in the corpus."}},"type":"object","required":["ref","kind","status"],"title":"VerifyCitationItem"},"VerifyCitationResponse":{"properties":{"data":{"$ref":"#/components/schemas/VerifyCitationItem"}},"type":"object","required":["data"],"title":"VerifyCitationResponse"},"ViewsResult":{"properties":{"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing canonical EU URL."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (null when the resource has no inline body)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (null when the resource has no inline body)."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"The resource's document date, when applicable."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru generated/ingested this (server time)."},"celex":{"type":"string","title":"Celex"},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli"},"views":{"additionalProperties":true,"type":"object","title":"Views","description":"EUR-Lex permanent-link views keyed by code (txt, all, his, nim, lsu, pdf)."},"xml_notice":{"type":"string","title":"Xml Notice"},"cellar_resource":{"type":"string","title":"Cellar Resource"}},"type":"object","required":["celex","views","xml_notice","cellar_resource"],"title":"ViewsResult"},"VocabularyConcept":{"properties":{"uri":{"type":"string","title":"Uri"},"pref_label":{"type":"string","title":"Pref Label"},"alt_labels":{"items":{"type":"string"},"type":"array","title":"Alt Labels"},"lang":{"type":"string","title":"Lang"},"source_dataset_uri":{"type":"string","title":"Source Dataset Uri"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"The concept's authoritative URI on op.europa.eu — resolves to a real SKOS RDF page (alias of `uri`)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: preferred label + alt labels + language + source NAL."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Vocabulary concepts are not document-dated (NALs are versioned, not dated per-concept). Null by design."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this concept from the Cellar SPARQL endpoint (alias of fetched_at)."}},"type":"object","required":["uri","pref_label","lang","source_dataset_uri"],"title":"VocabularyConcept"},"VoiceOpportunitiesTile":{"properties":{"total":{"type":"integer","title":"Total","default":0},"empty_state":{"anyOf":[{"$ref":"#/components/schemas/TileEmptyState"},{"type":"null"}]},"drill_down_path":{"type":"string","title":"Drill Down Path","description":"Internal path users land on when they click the tile header."},"chat_handoff_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Handoff Prompt","description":"Pre-filled Chat prompt for the tile-level 'Talk to Brubru about this' CTA. None means handoff is hidden."},"items":{"items":{"$ref":"#/components/schemas/VoiceOpportunityItem"},"type":"array","title":"Items"}},"type":"object","required":["drill_down_path"],"title":"VoiceOpportunitiesTile"},"VoiceOpportunityItem":{"properties":{"consultation_id":{"type":"string","title":"Consultation Id"},"title":{"type":"string","title":"Title"},"initiative_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiative Id"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"days_until_deadline":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until Deadline"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas"}},"type":"object","required":["consultation_id","title"],"title":"VoiceOpportunityItem","description":"An open consultation, soon-closing, in the user's policy areas."},"VoteItem":{"properties":{"id":{"type":"string","title":"Id"},"htv_id":{"type":"integer","title":"Htv Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"display_title":{"type":"string","title":"Display Title"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"procedure_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Reference"},"procedure_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Type"},"procedure_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Stage"},"amendment_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Number"},"is_main":{"type":"boolean","title":"Is Main","default":false},"count_for":{"type":"integer","title":"Count For","default":0},"count_against":{"type":"integer","title":"Count Against","default":0},"count_abstention":{"type":"integer","title":"Count Abstention","default":0},"count_did_not_vote":{"type":"integer","title":"Count Did Not Vote","default":0},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"texts_adopted_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Texts Adopted Reference"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — HowTheyVote vote page (https://howtheyvote.eu/votes/{htv_id}) — real, specific."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + reference + procedure + tallies + result."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Vote date (date-only view of timestamp)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this vote (alias of updated_at)."}},"type":"object","required":["id","htv_id","timestamp","display_title"],"title":"VoteItem"},"WebstreamItem":{"properties":{"id":{"type":"string","title":"Id"},"committee_code":{"type":"string","title":"Committee Code"},"title":{"type":"string","title":"Title"},"meeting_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Meeting Date"},"multimedia_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Multimedia Url"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"speaker_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Speaker Count"},"word_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Word Count"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"related_procedure_refs":{"items":{},"type":"array","title":"Related Procedure Refs"},"transcribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Transcribed At"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen URL — the multimedia.europarl.europa.eu page for the meeting (alias of multimedia_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text composition: title + committee + meeting date + duration + speaker count + status + related procedures."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML composition of the same fields."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Meeting date (date-only view of meeting_date)."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru last refreshed this row (alias of last_updated)."},"meeting_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Meeting Start Date","description":"Canonical meeting-start timestamp (alias of meeting_date) — the v1 contract uses this name for meeting-bearing endpoints."}},"type":"object","required":["id","committee_code","title"],"title":"WebstreamItem"},"WhoAmIResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"tier":{"type":"string","title":"Tier"},"api_tier":{"type":"string","title":"Api Tier","default":"free"},"rate_limit_limit":{"type":"integer","title":"Rate Limit Limit"},"rate_limit_remaining":{"type":"integer","title":"Rate Limit Remaining"}},"type":"object","required":["user_id","tier","rate_limit_limit","rate_limit_remaining"],"title":"WhoAmIResponse"},"WhoIsWhoDepartmentItem":{"properties":{"id":{"type":"string","title":"Id"},"mnemonic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mnemonic"},"name":{"type":"string","title":"Name"},"institution_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Uri"},"official_count":{"type":"integer","title":"Official Count","default":0},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","name"],"title":"WhoIsWhoDepartmentItem"},"WhoIsWhoOfficialItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"honorific":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Honorific"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"mnemonic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mnemonic"},"institution_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Uri"},"person_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Uri"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","name"],"title":"WhoIsWhoOfficialItem"},"XrefResult":{"properties":{"celex":{"type":"string","title":"Celex"},"eli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli"},"oj_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oj Reference"},"procedure_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Procedure Ref","description":"The OEIL procedure that produced this act (reverse-looked-up from legislative carriages)."},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"},"in_force":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Force"},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date"},"eurovoc":{"items":{},"type":"array","title":"Eurovoc","description":"EuroVoc subject concepts attached to the work."},"legal_basis":{"items":{},"type":"array","title":"Legal Basis"},"authors":{"items":{},"type":"array","title":"Authors"},"relation_counts":{"additionalProperties":true,"type":"object","title":"Relation Counts","description":"Edge counts keyed by '{relation}:{direction}' (e.g. 'amendment:incoming')."},"relation_total":{"type":"integer","title":"Relation Total","default":0},"eurlex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eurlex Url"},"cached":{"type":"boolean","title":"Cached","description":"True when served from the law_xref cache; false when freshly computed.","default":false},"computed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Computed At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Citizen-facing EUR-Lex URL (alias of eurlex_url)."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null — call /laws/{celex}/text for the body."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null — call /laws/{celex}/text for the body."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When Brubru first ingested this CELEX (eu_laws.created_at)."}},"type":"object","required":["celex"],"title":"XrefResult"},"_AgencyBody":{"properties":{"code":{"type":"string","title":"Code"},"acronym":{"type":"string","title":"Acronym"},"name":{"type":"string","title":"Name"},"mandate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandate"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"item_counts":{"additionalProperties":true,"type":"object","title":"Item Counts"}},"type":"object","required":["code","acronym","name"],"title":"_AgencyBody"},"_CollectionFootprint":{"properties":{"collection_key":{"type":"string","title":"Collection Key"},"collection":{"anyOf":[{"$ref":"#/components/schemas/EconomyItem"},{"type":"null"}],"description":"The collection snapshot (full description)."},"recent_news":{"items":{"$ref":"#/components/schemas/EconomyItem"},"type":"array","title":"Recent News"},"recent_events":{"items":{"$ref":"#/components/schemas/EconomyItem"},"type":"array","title":"Recent Events"},"recent_solutions":{"items":{"$ref":"#/components/schemas/EconomyItem"},"type":"array","title":"Recent Solutions"}},"type":"object","required":["collection_key"],"title":"_CollectionFootprint"},"_Directory":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"item_counts":{"additionalProperties":true,"type":"object","title":"Item Counts"},"collections":{"type":"integer","title":"Collections","description":"Number of thematic collections in the directory.","default":0}},"type":"object","required":["code","name"],"title":"_Directory"},"_GenericListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Null for metadata endpoints — these are enumerations, not documents."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Null for metadata endpoints — see `data` for the enumeration."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Null for metadata endpoints."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null for metadata endpoints — reference data is not dated."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API call was served (alias of generated_at)."}},"type":"object","required":["total","data"],"title":"_GenericListResponse"},"_PipelineCreate":{"properties":{"opportunity_id":{"type":"string","title":"Opportunity Id"},"source":{"type":"string","title":"Source"},"title":{"type":"string","title":"Title"},"organisation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"programme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Programme"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","default":"EUR"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"lead"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step"},"next_step_due":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step Due"},"pm_assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pm Assignee"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["opportunity_id","source","title"],"title":"_PipelineCreate","description":"Body for POST /api/tenders/pipeline — add an opportunity to the\npipeline. opportunity_id MUST be source-qualified ('ted:123',\n'ft_proposals:uuid', 'intl_coop:456', etc.)."},"_PipelineUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step"},"next_step_due":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step Due"},"pm_assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pm Assignee"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"_PipelineUpdate","description":"Body for PUT /api/tenders/pipeline/{id} — partial update."},"_SummaryRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"_SummaryRequest"},"api__admin_api_keys__ApiKeySummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","name","key_prefix","last_used_at","created_at","revoked_at","is_active"],"title":"ApiKeySummary"},"api__legislative_tracking__ResolveRefsRequest":{"properties":{"text":{"type":"string","title":"Text"},"annotate_html":{"type":"boolean","title":"Annotate Html","default":false}},"type":"object","required":["text"],"title":"ResolveRefsRequest"},"api__me_api_keys__ApiKeySummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"is_active":{"type":"boolean","title":"Is Active"},"is_expired":{"type":"boolean","title":"Is Expired"}},"type":"object","required":["id","name","key_prefix","scopes","last_used_at","created_at","expires_at","revoked_at","is_active","is_expired"],"title":"ApiKeySummary"},"api__predictions__OutcomeProbability":{"properties":{"outcome":{"type":"string","title":"Outcome"},"probability":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Probability"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["outcome","probability"],"title":"OutcomeProbability","description":"Single outcome probability."},"api__public_consultations__FeedbackResponse":{"properties":{"consultation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Consultation Id"},"initiative_id":{"type":"string","title":"Initiative Id"},"publication_id":{"type":"integer","title":"Publication Id"},"title":{"type":"string","title":"Title"},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"feedback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Url"},"sample_size":{"type":"integer","title":"Sample Size"},"summary_total":{"type":"integer","title":"Summary Total"},"by_user_type":{"additionalProperties":true,"type":"object","title":"By User Type"},"by_country":{"additionalProperties":true,"type":"object","title":"By Country"},"items":{"items":{"$ref":"#/components/schemas/FeedbackItemResponse"},"type":"array","title":"Items"}},"type":"object","required":["initiative_id","publication_id","title","sample_size","summary_total","by_user_type","by_country","items"],"title":"FeedbackResponse","description":"Live feedback fetch for a consultation."},"api__v1___envelope__PaginatedResponse_ConsultationItem___1":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/api__v1__consultations__ConsultationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ConsultationItem]"},"api__v1___envelope__PaginatedResponse_ConsultationItem___2":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching items across all pages"},"returned":{"type":"integer","title":"Returned","description":"Items in this page (len(data))"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Items per page used for this response"},"has_more":{"type":"boolean","title":"Has More"},"next_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Page"},"remaining_pages":{"type":"integer","title":"Remaining Pages","default":0},"coverage_complete":{"type":"boolean","title":"Coverage Complete","description":"True for DB-backed results; False if upstream/live fetch may be partial","default":true},"published_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published From"},"published_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published To"},"published_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published End"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"updated_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated End"},"detail_level":{"type":"string","enum":["Minimal","Summary","Full"],"title":"Detail Level","default":"Full"},"coverage_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage From","description":"Earliest item the endpoint's corpus contains (null = undeclared)."},"coverage_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Coverage To","description":"Latest item the endpoint's corpus contains (null = undeclared)."},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"How the corpus is bounded, in plain English. Read this before concluding that an empty result means the thing does not exist."},"op_core":{"anyOf":[{"$ref":"#/components/schemas/OPCoreMetadata"},{"type":"null"}],"description":"OP Core Metadata block (Dublin-Core-derived). Populated by build_envelope() unless suppressed."},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"Envelope-level citizen URL — usually null on list endpoints (see per-item public_url inside data[])."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Envelope-level plain text — null for paginated lists; populated only for reference-data hubs."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"Envelope-level HTML — null for paginated lists."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Envelope-level document date — null for paginated lists."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"When this API response was generated (server time)."},"data":{"items":{"$ref":"#/components/schemas/api__v2__consultations__consultations_all__ConsultationItem"},"type":"array","title":"Data"}},"type":"object","required":["total","returned","pages","page","limit","has_more","data"],"title":"PaginatedResponse[ConsultationItem]"},"api__v1__calendar__CalendarEventItem":{"properties":{"id":{"type":"string","title":"Id"},"institution":{"type":"string","title":"Institution"},"event_type":{"type":"string","title":"Event Type"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"all_day":{"type":"boolean","title":"All Day","default":true},"council_configuration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Council Configuration"},"ep_activity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Activity Type"},"ep_committee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ep Committee Code"},"commission_dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commission Dg"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"procedure_refs":{"items":{},"type":"array","title":"Procedure Refs"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"agenda_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Url"},"webstream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webstream Url"}},"type":"object","required":["id","institution","event_type","title","start_date"],"title":"CalendarEventItem"},"api__v1__catalan_translations__CategoryCount":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"category_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category En"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["category","category_en","count"],"title":"CategoryCount"},"api__v1__consultations__ConsultationItem":{"properties":{"id":{"type":"string","title":"Id"},"initiative_id":{"type":"string","title":"Initiative Id"},"title":{"type":"string","title":"Title"},"short_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"consultation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consultation Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"dg_responsible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg Responsible"},"policy_areas":{"items":{},"type":"array","title":"Policy Areas"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"feedback_count":{"type":"integer","title":"Feedback Count","default":0},"portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Url"},"feedback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Url"},"com_references":{"items":{},"type":"array","title":"Com References"},"celex_numbers":{"items":{},"type":"array","title":"Celex Numbers"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"has_body":{"type":"boolean","title":"Has Body","default":false},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt"}},"type":"object","required":["id","initiative_id","title"],"title":"ConsultationItem"},"api__v1__legal_text__ResolveRefsRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Plain text containing inline EU citations (CELEX, Reg/Dir refs, COM numbers, ECLI, etc.).","examples":["Article 6 of Regulation (EU) 2016/679 and Directive 2002/58/EC apply here."]},"annotate_html":{"type":"boolean","title":"Annotate Html","default":false}},"type":"object","required":["text"],"title":"ResolveRefsRequest"},"api__v1__predictions__OutcomeProbability":{"properties":{"outcome":{"type":"string","title":"Outcome"},"probability":{"type":"number","title":"Probability"}},"type":"object","required":["outcome","probability"],"title":"OutcomeProbability"},"api__v1__predictions__TimelinePrediction":{"properties":{"procedure_ref":{"type":"string","title":"Procedure Ref"},"current_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Status"},"days_in_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days In Status"},"predicted_days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Predicted Days Remaining"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"lower_bound_25":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lower Bound 25"},"upper_bound_75":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Upper Bound 75"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"prediction_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prediction Method"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url","description":"OEIL procedure-file URL for the underlying procedure."},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text summary of the timeline prediction."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML rendering of the timeline prediction."},"document_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Document Date","description":"Null — predictions are not dated documents."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date","description":"Time the prediction was generated."}},"type":"object","required":["procedure_ref"],"title":"TimelinePrediction"},"api__v1__specialised_transparency_register__CategoryCount":{"properties":{"registration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Category"},"organisations":{"type":"integer","title":"Organisations"},"ep_passes":{"type":"integer","title":"Ep Passes"},"median_costs_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Costs Max"}},"type":"object","required":["registration_category","organisations","ep_passes"],"title":"CategoryCount"},"api__v2__consultations__consultations_all__ConsultationItem":{"properties":{"id":{"type":"string","title":"Id","description":"Aggregator id (source-prefixed: 'h<uuid>' Have Your Say register, 'e<n>' economy)."},"body_code":{"type":"string","title":"Body Code","description":"Canonical body code running the consultation."},"body_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Name"},"families":{"items":{"type":"string"},"type":"array","title":"Families","description":"Brubru policy families this body belongs to."},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution","description":"European Commission or the decentralised agency."},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"consultation_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consultation Type","description":"public_consultation | initiative | call_for_evidence."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"open | closed | outcome_published."},"dg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dg","description":"Responsible Commission DG (Have Your Say)."},"policy_areas":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Policy Areas"},"feedback_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Feedback Count"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"body_txt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Txt","description":"Plain-text body (full on detail; null on list)."},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (full on detail; null on list)."},"document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Document Date","description":"The consultation's closing date."},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","body_code","title"],"title":"ConsultationItem"},"api__v2__proprietary__packaging_waste_regulation__TimelineEntry":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"label":{"type":"string","title":"Label","description":"Plain-language milestone in the requested lang."},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article","description":"The PPWR article the milestone comes from."}},"type":"object","required":["date","label"],"title":"TimelineEntry"},"schemas__commission_document_schemas__SyncResultResponse":{"properties":{"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"type":"integer","title":"Errors"},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0.0}},"type":"object","required":["added","updated","skipped","errors"],"title":"SyncResultResponse","description":"Response after running sync."},"schemas__committee_work_schemas__SyncResultResponse":{"properties":{"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"type":"integer","title":"Errors"},"status_changes":{"type":"integer","title":"Status Changes","default":0},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0.0}},"type":"object","required":["added","updated","skipped","errors"],"title":"SyncResultResponse","description":"Response after running sync."},"schemas__committee_work_schemas__SyncStatusResponse":{"properties":{"last_sync":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync"},"total_items":{"type":"integer","title":"Total Items","default":0},"items_by_committee":{"additionalProperties":{"type":"integer"},"type":"object","title":"Items By Committee"},"items_by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"Items By Type"}},"type":"object","title":"SyncStatusResponse","description":"Response for sync status."},"schemas__committee_work_schemas__UpdateTrackingRequest":{"properties":{"notify_on_status_change":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Status Change"},"notify_on_rapporteur_change":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Rapporteur Change"},"notify_on_new_documents":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On New Documents"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"UpdateTrackingRequest","description":"Request to update tracking preferences."},"schemas__dashboard_schemas__CalendarEventItem":{"properties":{"event_id":{"type":"string","title":"Event Id"},"title":{"type":"string","title":"Title"},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"policy_areas":{"items":{"type":"string"},"type":"array","title":"Policy Areas"}},"type":"object","required":["event_id","title","start_date"],"title":"CalendarEventItem","description":"An event in the next 7 days."},"schemas__eu_calendar_schemas__PolicyAreaInfo":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"colour":{"type":"string","title":"Colour"},"ep_committee_codes":{"items":{"type":"string"},"type":"array","title":"Ep Committee Codes","default":[]},"council_configs":{"items":{"type":"string"},"type":"array","title":"Council Configs","default":[]}},"type":"object","required":["code","label","colour"],"title":"PolicyAreaInfo","description":"Policy area info for frontend display."},"schemas__eu_calendar_schemas__SyncResultResponse":{"properties":{"source":{"type":"string","title":"Source"},"added":{"type":"integer","title":"Added","default":0},"updated":{"type":"integer","title":"Updated","default":0},"skipped":{"type":"integer","title":"Skipped","default":0},"errors":{"type":"integer","title":"Errors","default":0},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0.0}},"type":"object","required":["source"],"title":"SyncResultResponse","description":"Result of a calendar sync operation."},"schemas__feedback_schemas__FeedbackResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"user":{"anyOf":[{"$ref":"#/components/schemas/FeedbackUserInfo"},{"type":"null"}]},"feedback_type":{"type":"string","title":"Feedback Type"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"priority":{"type":"string","title":"Priority"},"status":{"type":"string","title":"Status"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"affected_feature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Affected Feature"},"browser_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Browser Info"},"device_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Device Info"},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"admin_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Response"},"assigned_to":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assigned To"},"assigned_admin":{"anyOf":[{"$ref":"#/components/schemas/FeedbackUserInfo"},{"type":"null"}]},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"comments":{"items":{"$ref":"#/components/schemas/CommentResponse"},"type":"array","title":"Comments","default":[]}},"type":"object","required":["id","user_id","feedback_type","title","description","priority","status","category","affected_feature","browser_info","device_info","screenshot_url","attachments","admin_notes","admin_response","assigned_to","resolved_at","created_at","updated_at"],"title":"FeedbackResponse","description":"Schema for feedback response"},"schemas__mep_amendment_schemas__SyncStatusResponse":{"properties":{"total_documents":{"type":"integer","title":"Total Documents"},"parsed":{"type":"integer","title":"Parsed"},"failed":{"type":"integer","title":"Failed"},"pending":{"type":"integer","title":"Pending"},"total_amendments":{"type":"integer","title":"Total Amendments"},"last_sync":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync"},"by_year":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Year"},"by_committee":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Committee"}},"type":"object","required":["total_documents","parsed","failed","pending","total_amendments"],"title":"SyncStatusResponse","description":"Aggregate sync status for amendment documents."},"schemas__public_consultation_schemas__PolicyAreaInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"}},"type":"object","required":["code","name"],"title":"PolicyAreaInfo","description":"Policy area information."},"schemas__public_consultation_schemas__SyncResultResponse":{"properties":{"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"type":"integer","title":"Errors"},"status_changes":{"type":"integer","title":"Status Changes","default":0},"duration_seconds":{"type":"number","title":"Duration Seconds"}},"type":"object","required":["added","updated","skipped","errors","duration_seconds"],"title":"SyncResultResponse","description":"Result of a sync operation."},"schemas__public_consultation_schemas__SyncStatusResponse":{"properties":{"last_sync":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync"},"total_consultations":{"type":"integer","title":"Total Consultations"},"open_count":{"type":"integer","title":"Open Count"},"closed_count":{"type":"integer","title":"Closed Count"},"outcome_count":{"type":"integer","title":"Outcome Count"},"consultations_by_dg":{"additionalProperties":{"type":"integer"},"type":"object","title":"Consultations By Dg","default":{}},"consultations_by_policy_area":{"additionalProperties":{"type":"integer"},"type":"object","title":"Consultations By Policy Area","default":{}}},"type":"object","required":["total_consultations","open_count","closed_count","outcome_count"],"title":"SyncStatusResponse","description":"Status of consultation sync."},"schemas__public_consultation_schemas__UpdateTrackingRequest":{"properties":{"notify_on_deadline":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Deadline"},"notify_on_outcome":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Outcome"},"notify_days_before":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Notify Days Before"},"submission_status":{"anyOf":[{"$ref":"#/components/schemas/SubmissionStatus"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"priority":{"anyOf":[{"type":"integer","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Priority"}},"type":"object","title":"UpdateTrackingRequest","description":"Request to update tracking preferences."},"schemas__scrapers__legislative_train_schemas__TextType":{"type":"string","enum":["legislative","non_legislative","unknown"],"title":"TextType","description":"Legislative text type"},"schemas__scrapers__legislative_train_schemas__TimelineEntry":{"properties":{"year":{"type":"integer","title":"Year","description":"Year (e.g., 2024)"},"month":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Month","description":"Month (1-12)"},"status":{"$ref":"#/components/schemas/CarriageStatus","description":"Status at this month"},"is_current":{"type":"boolean","title":"Is Current","description":"Is this the current month","default":false}},"type":"object","required":["year","month","status"],"title":"TimelineEntry","description":"Monthly status snapshot for a file"},"schemas__scrapers__legislative_train_schemas__TimelinePrediction":{"properties":{"carriage_id":{"type":"string","title":"Carriage Id"},"current_status":{"$ref":"#/components/schemas/CarriageStatus"},"estimated_completion_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Completion Date"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Prediction confidence"},"remaining_steps":{"items":{"$ref":"#/components/schemas/CarriageStatus"},"type":"array","title":"Remaining Steps"},"estimated_days_per_step":{"additionalProperties":{"type":"integer"},"type":"object","title":"Estimated Days Per Step"},"based_on_historical_avg":{"type":"boolean","title":"Based On Historical Avg","default":true}},"type":"object","required":["carriage_id","current_status","confidence"],"title":"TimelinePrediction","description":"Predicted timeline for legislative file"},"schemas__texts_adopted_schemas__SyncResultResponse":{"properties":{"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"type":"integer","title":"Errors"},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0.0}},"type":"object","required":["added","updated","skipped","errors"],"title":"SyncResultResponse","description":"Response after running sync."},"schemas__texts_adopted_schemas__SyncStatusResponse":{"properties":{"last_sync":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync"},"total_items":{"type":"integer","title":"Total Items","default":0},"items_by_term":{"additionalProperties":{"type":"integer"},"type":"object","title":"Items By Term"},"items_by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"Items By Type"}},"type":"object","title":"SyncStatusResponse","description":"Sync status and statistics."},"schemas__texts_adopted_schemas__TextType":{"type":"string","enum":["resolution","legislative_resolution","decision","recommendation","other"],"title":"TextType","description":"Types of adopted texts."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"auth/login"}}}}},"tags":[]}