# ICIJ Offshore Leaks Entity & Officer Network Scraper (`jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper`) Actor

Pulls entity, officer, intermediary and address records, plus the connections between them, from the ICIJ Offshore Leaks Database: Panama Papers, Paradise Papers, Pandora Papers, Bahamas Leaks and Offshore Leaks. Look up specific node ids, or enumerate the corpus with filters.

- **URL**: https://apify.com/jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ICIJ Offshore Leaks Entity & Officer Network Scraper

Pulls entity, officer, intermediary and address records from the [ICIJ Offshore Leaks Database](https://offshoreleaks.icij.org) — the Panama Papers, Paradise Papers, Pandora Papers, Bahamas Leaks and original Offshore Leaks data sets, combined. Every record comes back with its first-degree connections already attached — officer-of, intermediary-of, registered-address and similar relationships, each with a type, dates where known, and which leak set it was published in — so one call returns the ownership picture around a name, not just a name.

### ICIJ Offshore Leaks Entity & Officer Network Scraper Features

- Returns the full node record — name, jurisdiction, status, formation agent, incorporation/struck-off dates where available — plus every first-degree connection in the same call
- Look up specific ICIJ node ids directly, or enumerate using ICIJ's own published node index, so coverage reflects the actual corpus rather than only what a keyword search happens to surface
- Filter enumeration by node type (Entity, Officer, Intermediary, Address, Other) or by leak set (Panama Papers, Paradise Papers, Pandora Papers, Bahamas Leaks, Offshore Leaks), independently or together
- Every record carries the ODbL attribution ICIJ requires for redistribution, so the data is clean to resell or incorporate downstream
- Disambiguates node types automatically — an id can resolve to a company, a person, a registered agent, or an address, and the record tells you which

### Who Uses ICIJ Offshore Leaks Data?

- **KYC and enhanced due-diligence teams** — check whether a name or company surfaces in leaked offshore filings before onboarding
- **Investigative journalists and researchers** — trace which entities share a formation agent, a registered address, or an officer across five separate leaks
- **Sanctions and compliance screening teams** — supplement statutory beneficial-ownership registers with leak-derived ownership data where the official registers are closed or sealed
- **Corporate development and M\&A diligence analysts** — surface offshore vehicles connected to a counterparty before signing
- **Academic and policy researchers** — work with attributable, structured records rather than a page read by hand

### How ICIJ Offshore Leaks Entity & Officer Network Scraper Works

1. Give it specific ICIJ node ids (`startNodeIds`) to look up directly, or leave that empty to enumerate instead.
2. In enumeration mode, it works through ICIJ's published node index, optionally narrowed by `nodeTypes` and `sourceIds`, so you can pull just the officers from the Panama Papers, just the entities from Paradise Papers, or everything at once.
3. Each node's own page is read for its full record plus its first-degree connections, which come back in the `connections` field as formatted strings naming the connected node, its type, the relationship, and the dates.
4. A run covers roughly 50,000 records in a single session; the run stops at your `maxItems` cap (or that ceiling) and hands back a `resumeCursor` so a bigger pull continues across runs without re-paying for records you already have.

### Input

```json
{
  "maxItems": 15,
  "startNodeIds": [],
  "nodeTypes": ["Entity", "Officer", "Intermediary", "Address", "Other"],
  "sourceIds": ["Panama Papers", "Paradise Papers", "Pandora Papers", "Bahamas Leaks", "Offshore Leaks"]
}
```

| Field          | Type             | Default  | Description |
|----------------|------------------|----------|---|
| `maxItems`     | Integer          | 15       | Maximum number of records to save in this run. See [Resuming a large crawl](#resuming-a-large-crawl) for pulls bigger than one run. |
| `startNodeIds` | Array of strings | `[]`     | Specific ICIJ node ids to fetch directly (e.g. `10000001`). Leave empty to enumerate instead. |
| `nodeTypes`    | Array of strings | all five | Restrict enumeration to these node categories. Ignored when `startNodeIds` is set. |
| `sourceIds`    | Array of strings | all five | Restrict enumeration to these leak sets. Ignored when `startNodeIds` is set. |
| `resumeCursor` | String           | —        | Cursor from a previous run's Output. See [Resuming a large crawl](#resuming-a-large-crawl). |

Looking up two known node ids directly:

```json
{
  "maxItems": 10,
  "startNodeIds": ["10000001", "12203574"]
}
```

Pulling Officer records from the Panama Papers only:

```json
{
  "maxItems": 5000,
  "nodeTypes": ["Officer"],
  "sourceIds": ["Panama Papers"]
}
```

### ICIJ Offshore Leaks Entity & Officer Network Scraper Output Fields

```json
{
  "node_id": 10000001,
  "node_type": "Entity",
  "name": "TIANSHENG INDUSTRY AND TRADING CO., LTD.",
  "original_name": "TIANSHENG INDUSTRY AND TRADING CO., LTD.",
  "source_id": "Panama Papers",
  "jurisdiction": "SAM",
  "jurisdiction_description": "Samoa",
  "linked_countries": ["Hong Kong"],
  "country_codes": ["HKG"],
  "agent_name": "Mossack Fonseca",
  "incorporation_date": "2006-03-23",
  "inactivation_date": "2013-02-18",
  "struck_off_date": "2013-02-15",
  "status": "Defaulted",
  "address": "ORION HOUSE SERVICES (HK) LIMITED ROOM 1401; 14/F.; WORLD COMMERCE CENTRE; HARBOUR CITY; 7-11 CANTON ROAD; TSIM SHA TSUI; KOWLOON; HONG KONG",
  "icij_id": null,
  "valid_until": "The Panama Papers data is current through 2015",
  "last_edit_timestamp": "2021-11-30T22:23:40.926Z",
  "connections": [
    "Officer #12203574 \"LV PIN PIN\" — shareholder of (2006-03-23) [Panama Papers]",
    "Intermediary #11001746 \"ORION HOUSE SERVICES (HK) LIMITED\" — intermediary of [Panama Papers]"
  ],
  "connection_count": 3,
  "node_url": "https://offshoreleaks.icij.org/nodes/10000001",
  "attribution": "Data from the ICIJ Offshore Leaks Database (offshoreleaks.icij.org), licensed under the Open Database License (ODbL) 1.0. © International Consortium of Investigative Journalists."
}
```

| Field                                                          | Description |
|----------------------------------------------------------------|---|
| `node_id`                                                      | ICIJ node id — stable primary key |
| `node_type`                                                    | `Entity`, `Officer`, `Intermediary`, `Address`, or `Other` |
| `name` / `original_name`                                       | Record name, and its non-latin original where ICIJ publishes one |
| `source_id`                                                    | Which leak set this record was published in |
| `jurisdiction` / `jurisdiction_description`                    | Registration jurisdiction, where applicable |
| `linked_countries` / `country_codes`                           | Countries this record is linked to |
| `agent_name`                                                   | Registered/formation agent, where applicable |
| `incorporation_date` / `inactivation_date` / `struck_off_date` | Lifecycle dates, where ICIJ has them |
| `status`                                                       | Current status, where available |
| `address`                                                      | Registered address, where available |
| `icij_id`                                                      | ICIJ's own cross-leak dedupe hash — populated for Officer/Address/Intermediary records, not Entity |
| `valid_until`                                                  | The data-currency caveat ICIJ publishes per leak set |
| `last_edit_timestamp`                                          | When this record was last edited in ICIJ's database |
| `connections`                                                  | First-degree connections, formatted as `<type> #<node_id> "<name>" — <relationship> (<dates>) [<leak set>]` |
| `connection_count`                                             | Total known first-degree connections (may exceed the length of `connections` for very high-degree nodes) |
| `node_url`                                                     | Canonical ICIJ page for this node |
| `attribution`                                                  | Required ODbL attribution string — carry this with any redistribution of the data |

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

A single run covers roughly 50,000 records. Pulling the full ~810,000-node corpus is on the order of 15-20 chained runs with `resumeCursor` — set a `maxItems` that fits one session and let the cursor carry you to the next.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

### FAQ

#### How do I scrape the ICIJ Offshore Leaks Database?

Give it a list of specific node ids, or leave `startNodeIds` empty and let it enumerate the corpus — narrowed by node type and leak set if you want a subset. No account or login required.

#### What data can I get?

Entity, officer, intermediary and address records across all five ICIJ leak sets, plus the first-degree ownership connections between them — officer-of, intermediary-of, registered-address and similar relationships, each with its own dates and source leak.

#### Can I pull a large batch, or the whole database?

Yes. A single run covers roughly 50,000 records; the full ~810,000-node corpus is around 15-20 chained runs with `resumeCursor` (see [Resuming a large crawl](#resuming-a-large-crawl)).

#### How much does this actor cost to run?

Standard per-record PPE pricing — see the Pricing tab. There's no extra charge for using the type or leak-set filters.

#### Can I redistribute this data?

Yes, under the terms of ICIJ's Open Database License (ODbL) 1.0, provided you carry the `attribution` field (or equivalent credit) with it. See [ICIJ's database page](https://offshoreleaks.icij.org/pages/database) for the full license text.

### Need More Features?

Need a different output shape, additional ICIJ fields, or help integrating this into an existing KYC/compliance pipeline? Contact us through the Apify platform and we'll take a look.

### Why Use ICIJ Offshore Leaks Entity & Officer Network Scraper?

The statutory beneficial-ownership registers keep closing to the public — the CJEU's C-37/20 ruling shut seven EU member states' UBO registers, and the US Corporate Transparency Act keeps FinCEN's registry law-enforcement-only. ICIJ's Offshore Leaks Database is the largest openly-licensed alternative: five leak sets, roughly 810,000 nodes, and a license that explicitly permits redistribution with attribution. This actor turns that into structured, connection-aware records instead of a page you have to read by hand.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `maxItems` (type: `integer`):

Maximum number of records to save. Leave the default to take a sample; raise it to pull a larger batch. Enumeration is intentionally rate-limited to stay polite to the source, so very large pulls are best done across multiple runs — see "Resuming a large crawl".

## `startNodeIds` (type: `array`):

Specific ICIJ node ids to fetch directly (e.g. 10000001). Each returns that node's own record plus its first-degree connections. Leave empty to enumerate instead, using the Node types / Leak sets filters below.

## `nodeTypes` (type: `array`):

Restrict enumeration to these ICIJ node categories. Leave at the default (all five) for full coverage. Ignored when Start node IDs is set.

## `sourceIds` (type: `array`):

Restrict enumeration to these ICIJ leak sets. Leave at the default (all five) for full coverage. Ignored when Start node IDs is set.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "maxItems": 15,
  "startNodeIds": [],
  "nodeTypes": [
    "Entity",
    "Officer",
    "Intermediary",
    "Address",
    "Other"
  ],
  "sourceIds": [
    "Panama Papers",
    "Paradise Papers",
    "Pandora Papers",
    "Bahamas Leaks",
    "Offshore Leaks"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_contact": "Share your email here...",
    "maxItems": 15,
    "startNodeIds": [],
    "nodeTypes": [
        "Entity",
        "Officer",
        "Intermediary",
        "Address",
        "Other"
    ],
    "sourceIds": [
        "Panama Papers",
        "Paradise Papers",
        "Pandora Papers",
        "Bahamas Leaks",
        "Offshore Leaks"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_contact": "Share your email here...",
    "maxItems": 15,
    "startNodeIds": [],
    "nodeTypes": [
        "Entity",
        "Officer",
        "Intermediary",
        "Address",
        "Other",
    ],
    "sourceIds": [
        "Panama Papers",
        "Paradise Papers",
        "Pandora Papers",
        "Bahamas Leaks",
        "Offshore Leaks",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_contact": "Share your email here...",
  "maxItems": 15,
  "startNodeIds": [],
  "nodeTypes": [
    "Entity",
    "Officer",
    "Intermediary",
    "Address",
    "Other"
  ],
  "sourceIds": [
    "Panama Papers",
    "Paradise Papers",
    "Pandora Papers",
    "Bahamas Leaks",
    "Offshore Leaks"
  ]
}' |
apify call jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/icij-offshore-leaks-entity-officer-network-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FtCFDfmxCc555tfFS/builds/mYyM4Tpujh2uBlqCS/openapi.json
