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/.

Base URL: https://api.isar-global.org/api/v1
Interactive 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.

Privacy: ISAR Global does not collect personal data in connection with API key issuance. Only your project label and the SHA-256 hash of your key are stored. We do not retain email addresses or contact information at this stage.
A short name to identify this key. Shown only to you when you manage your keys.

⚠ 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.

HTTP
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

GET /api/v1/parliaments Free
Returns metadata for all available corpora — labels, coverage dates, and supported query filters.
Response
{
  "data": [
    {
      "code":        "eu",
      "label":       "European Parliament",
      "flag":        "🇪🇺",
      "coverage":    { "from": "1999", "to": "present" },
      "filters":     ["year", "topic"]
    },
    // ... nz, ie
  ]
}
GET /api/v1/{parliament}/questions Free
Full-text search across questions and ministerial responses in the specified corpus. Results ordered by relevance.

Query parameters

ParameterTypeRequiredDescription
qstringYesSearch term — natural language full-text query
limitintegerNoResults to return. Default: 50. Maximum: 200
yearintegerNoEU only. Filter by year e.g. 2023
topicstringNoEU only. Filter by AI governance topic classification
parliamentintegerNoNZ only. Filter by parliament number e.g. 53
yearFromintegerNoIE only. Results from this year onwards
yearTointegerNoIE only. Results up to and including this year
housestringNoIE only. dail or seanad
Response
{
  "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
  }
}
GET /api/v1/{parliament}/questions/stats Free
Returns corpus statistics — question volumes by year and AI governance topic breakdown. Useful for understanding coverage before querying.
POST /api/v1/compare Paid
Cross-parliament search — returns matching questions from two or more corpora side by side in a single response. Requires a paid subscription.
Request body
{
  "q":           "facial recognition",
  "parliaments": ["eu", "nz", "ie"],
  "limit":       20
}
GET /api/v1/docs No auth
Interactive Swagger UI — explore and test all endpoints directly in your browser. No API key required to browse the documentation.

Available Corpora

Each corpus is identified by a short code used in the URL path. Additional jurisdictions are in development.

🇪🇺
European Parliament
code: eu
1999 – present · ~9,000 AI-classified records
🇳🇿
New Zealand Parliament
code: nz
2002 – present · 654,486 records
🇮🇪
Ireland — Oireachtas
code: ie
2004 – present · 915,636 records
Coming soon: Northern Ireland Assembly, Scottish Parliament, and Senedd Cymru (Wales). Once live, each will be accessible via the same endpoints using their respective corpus codes — no changes to your integration required.

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.

HeaderDescription
X-RateLimit-LimitMaximum requests permitted in the current hour
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds until retry (returned only on 429 responses)
TierSearch endpoints/compare
Free1,000 requests / hourNot available (403)
Paid5,000 requests / hour20 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 response
{ "error": { "code": "INVALID_PARLIAMENT", "message": "..." } }
HTTPCodeMeaning
401UNAUTHORISEDMissing or invalid API key
400MISSING_QUERYThe q parameter was not provided
400INVALID_PARLIAMENTUnknown parliament code in the URL path or request body
403SUBSCRIPTION_REQUIREDEndpoint requires a paid subscription
429RATE_LIMITEDHourly request limit exceeded
503SERVICE_UNAVAILABLEDatabase temporarily unavailable

Examples — cURL

List available corpora

bash
curl "https://api.isar-global.org/api/v1/parliaments" \
  -H "Authorization: Bearer YOUR_KEY"

Search the EU corpus

bash
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

bash
curl "https://api.isar-global.org/api/v1/ie/questions/stats" \
  -H "Authorization: Bearer YOUR_KEY"

Examples — Python

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

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));