OCCRP APIoccrp.org ↗
Access OCCRP investigative journalism via API. Search articles, retrieve investigations, filter by region or section, and fetch full article details including authors and partners.
What is the OCCRP API?
The OCCRP API provides 8 endpoints for retrieving articles, investigations, and projects from the Organized Crime and Corruption Reporting Project. Use search_articles to run full-text queries across the entire article index with facet filters, or get_article_detail to fetch a complete article record — including body text, authors, partner organizations, and tags — for any specific URL.
curl -X GET 'https://api.parse.bot/scraper/c1247c1e-9818-4a07-a48d-e339774986d7/search_articles?page=0&limit=5&query=corruption®ion=Asia§ion=Corruption&article_type=News' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace occrp-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
OCCRP API – Search investigative journalism, filter by region/section, and read full articles.
"""
from parse_apis.occrp_api import OCCRP, Section, Region, ArticleType, ArticleNotFound
occrp = OCCRP()
# Search for corruption-related articles in Europe
for article in occrp.articles.search(query="corruption", region=Region.EUROPE, limit=5):
print(article.title, article.date, article.uri)
# List investigations filtered by the Money Laundering section
for article in occrp.articles.list_by_section(section=Section.MONEY_LAUNDERING, limit=3):
print(article.title, article.type, article.sections)
# Fetch full detail for a specific article
detail = occrp.articledetails.get(url="https://www.occrp.org/en/investigation/fatal-liver-transplants-in-georgia-were-rush-jobs")
print(detail.title, detail.date, detail.authors)
# Browse investigative projects
for project in occrp.projects.list(limit=5):
print(project.title, project.url, project.date)
Full-text search over OCCRP articles with optional facet filters. Returns paginated results from the Algolia search index with article metadata including title, description, type, date, regions, sections, organizations, and keywords. Supports filtering by article type, thematic section, and geographic region simultaneously. An empty query returns all articles matching the filters.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed) |
| limit | integer | Number of results per page (max 1000) |
| query | string | Search keywords to match against article titles and content |
| region | string | Geographic region filter |
| section | string | Thematic section filter |
| article_type | string | Type of article filter |
{
"type": "object",
"fields": {
"hits": "array of article objects with title, uri, type, description, date, date_timestamp, regions, sections, keywords, organizations, people, image",
"page": "integer, current page number (0-indexed)",
"nbHits": "integer, total number of matching articles",
"nbPages": "integer, total number of pages available",
"hitsPerPage": "integer, results per page"
},
"sample": {
"data": {
"hits": [
{
"uri": "/project/first-bank-first-family/zavala-cape-corruption",
"date": "Jun 11, 2012",
"type": "Investigation",
"title": "Zavala: Cape Corruption",
"locale": "en",
"people": [],
"regions": [],
"keywords": [],
"objectID": "entry::891",
"sections": [
"Money Laundering"
],
"description": "First Bank loan funds were used in illegal construction on Cape Zavala.",
"organizations": [],
"date_timestamp": 1339365600
}
],
"page": 0,
"nbHits": 4899,
"nbPages": 980,
"hitsPerPage": 5
},
"status": "success"
}
}About the OCCRP API
Article Discovery and Search
The search_articles endpoint accepts a query string plus optional region, section, and article_type filters and returns paginated hits. Each hit includes title, uri, type, description, date, date_timestamp, regions, sections, keywords, organizations, and people. Results are 0-indexed; use the page parameter alongside nbPages to paginate. get_latest_articles returns the same shape without filters, ordered by relevance rank from the index. Dedicated endpoints get_news and get_investigations narrow results to articles with type News or Investigation respectively, keeping the same pagination contract.
Filtering by Region and Section
get_articles_by_region and get_articles_by_section each require one mandatory parameter (region or section) and return hits matching that facet. The regions and sections fields on each hit reflect how OCCRP classifies its own content, so values like "Eastern Europe" or "Corruption" passed as filter parameters need to match OCCRP's taxonomy exactly. Both endpoints return the same nbHits and nbPages fields for pagination.
Full Article Detail
get_article_detail accepts a full URL or a relative path (e.g. /en/investigation/fatal-liver-transplants-...) and returns a structured record with title, body (full article text), description, date, authors (array of name strings), partners (array of partner organization names), tags, and type. This is the only endpoint that returns body text; the search and list endpoints return summaries only. Each call fetches one article.
Projects
get_projects retrieves multi-article investigative series from the OCCRP projects listing. Each project object includes title, url, summary, date, and image (banner URL). Pagination here is 1-indexed, unlike the article endpoints which use 0-indexed pages.
The OCCRP API is a managed, monitored endpoint for occrp.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when occrp.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official occrp.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new OCCRP investigations mentioning a specific country using
get_articles_by_regionwith a region parameter - Build a corruption-tracking dashboard by polling
get_investigationsfor the latest in-depth investigative reports - Extract author and partner organization networks by calling
get_article_detailacross a set of article URLs - Index OCCRP content into an internal search tool using
search_articleswith keyword and section filters - Track multi-article investigative series with
get_projectsto surface ongoing reporting campaigns - Compile keyword and organization metadata from article hits to map relationships across OCCRP's coverage
- Filter breaking news separately from investigations using
get_newsto distinguish brief reports from long-form pieces
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does OCCRP offer an official developer API?+
What does `get_article_detail` return that the search and list endpoints do not?+
get_article_detail is the only endpoint that returns the full body text of an article. The search and listing endpoints (search_articles, get_investigations, etc.) return only description — a short summary — along with metadata like title, date, regions, and sections. To get the actual article content you need to call get_article_detail with the article's URL.Are there any quirks to pagination across endpoints?+
search_articles, get_latest_articles, get_news, get_investigations, get_articles_by_section, get_articles_by_region) use 0-indexed pagination — the first page is page=0. The get_projects endpoint uses 1-indexed pagination — the first page is page=1. Mixing these up will cause you to miss the first page of projects or request a non-existent page 0.Can I retrieve individual journalist profiles or author pages?+
authors as an array of name strings within get_article_detail results, and organizations and people fields on search hits, but there are no dedicated endpoints for author profiles, bios, or a full list of articles by a specific author. You can fork the API on Parse and revise it to add an author-filtering or profile endpoint.