Overview
The IPIS API provides structured, searchable access to ISAR Global's corpus of parliamentary questions and ministerial responses. The corpus spans the European Parliament, New Zealand Parliament, and Irish Oireachtas — over 1.6 million records dating from 1999 to the present, with AI governance classification applied.
All endpoints return JSON. Authentication uses a standard Bearer token. The API is versioned at /api/v1/.
https://api.isar-global.org/api/v1Interactive documentation is available at api.isar-global.org/api/v1/docs.
Get an API Key
Free API keys are issued immediately. Enter a label for your project — no email address is required or collected.
⚠ Store this key securely. It will not be shown again.
Authentication
Pass your API key as a Bearer token in the Authorization header on every request.
Authorization: Bearer ipis_a3f7c2d1e9b4f8...
Keys are prefixed ipis_ followed by 32 hex characters. Only the SHA-256 hash of your key is held on our servers — the raw key is shown once at generation and is never retrievable afterwards.
Endpoints
{
"data": [
{
"code": "eu",
"label": "European Parliament",
"flag": "🇪🇺",
"coverage": { "from": "1999", "to": "present" },
"filters": ["year", "topic"]
},
// ... nz, ie
]
}
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search term — natural language full-text query |
limit | integer | No | Results to return. Default: 50. Maximum: 200 |
year | integer | No | EU only. Filter by year e.g. 2023 |
topic | string | No | EU only. Filter by AI governance topic classification |
parliament | integer | No | NZ only. Filter by parliament number e.g. 53 |
yearFrom | integer | No | IE only. Results from this year onwards |
yearTo | integer | No | IE only. Results up to and including this year |
house | string | No | IE only. dail or seanad |
{
"data": [
{
"id": "E-002341/2024",
"parliament": "eu",
"date_tabled": "2024-03-14",
"date_answered": "2024-04-02",
"member_name": "Sophie in 't Veld",
"member_party": "Renew Europe",
"minister_or_role": "European Commission",
"question_text": "...",
"answer_text": "...",
"primary_topic": "AI Regulation & Oversight",
"relevance": "0.8741"
}
],
"meta": {
"parliament": "eu",
"query": "facial recognition",
"resultCount": 47,
"responseMs": 84
}
}
{
"q": "facial recognition",
"parliaments": ["eu", "nz", "ie"],
"limit": 20
}
Available Corpora
Each corpus is identified by a short code used in the URL path. Additional jurisdictions are in development.
Rate Limits
Limits are applied per API key on a rolling hourly window. The current limit and remaining allowance are returned in response headers on every request.
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests permitted in the current hour |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds until retry (returned only on 429 responses) |
| Tier | Search endpoints | /compare |
|---|---|---|
| Free | 1,000 requests / hour | Not available (403) |
| Paid | 5,000 requests / hour | 20 requests / hour |
If you exceed your limit, the API returns 429 RATE_LIMITED with a Retry-After header indicating when your window resets. Limits reset at the top of each UTC hour.
Error Codes
All errors follow a consistent envelope:
{ "error": { "code": "INVALID_PARLIAMENT", "message": "..." } }
| HTTP | Code | Meaning |
|---|---|---|
| 401 | UNAUTHORISED | Missing or invalid API key |
| 400 | MISSING_QUERY | The q parameter was not provided |
| 400 | INVALID_PARLIAMENT | Unknown parliament code in the URL path or request body |
| 403 | SUBSCRIPTION_REQUIRED | Endpoint requires a paid subscription |
| 429 | RATE_LIMITED | Hourly request limit exceeded |
| 503 | SERVICE_UNAVAILABLE | Database temporarily unavailable |
Examples — cURL
List available corpora
curl "https://api.isar-global.org/api/v1/parliaments" \ -H "Authorization: Bearer YOUR_KEY"
Search the EU corpus
curl "https://api.isar-global.org/api/v1/eu/questions?q=facial+recognition&year=2023&limit=20" \ -H "Authorization: Bearer YOUR_KEY"
AI governance stats for Ireland
curl "https://api.isar-global.org/api/v1/ie/questions/stats" \ -H "Authorization: Bearer YOUR_KEY"
Examples — Python
import requests API_KEY = "ipis_your_key_here" BASE_URL = "https://api.isar-global.org/api/v1" headers = {"Authorization": f"Bearer {API_KEY}"} # Search the New Zealand corpus response = requests.get( f"{BASE_URL}/nz/questions", headers=headers, params={"q": "artificial intelligence", "limit": 50} ) data = response.json() print(f"{data['meta']['resultCount']} results found") for q in data["data"]: print(f"{q['date_tabled']} {q['member_name']}: {q['question_text'][:120]}")
Examples — JavaScript
const API_KEY = 'ipis_your_key_here'; const BASE_URL = 'https://api.isar-global.org/api/v1'; async function searchParliament(parliament, query, options = {}) { const params = new URLSearchParams({ q: query, ...options }); const res = await fetch( `${BASE_URL}/${parliament}/questions?${params}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } } ); if (!res.ok) throw new Error(`API error: ${res.status}`); return res.json(); } // Search Irish Oireachtas, 2020–2024 const results = await searchParliament('ie', 'algorithmic decision making', { yearFrom: 2020, yearTo: 2024, limit: 30, }); console.log(`${results.meta.resultCount} questions found`); results.data.forEach(q => console.log(q.date_tabled, q.member_name));
Paid Tier
ISAR Global's paid API tier is currently in development and will be made available during Q2 2026. It will include access to the cross-parliament /compare endpoint, higher rate limits, and priority support.