The EODHD Sanctions API provides programmatic access to U.S. Treasury Office of Foreign Assets Control (OFAC) sanctions data — the Specially Designated Nationals (SDN) and consolidated sanctions lists. It covers sanctioned entities and individuals, sanctioned vessels, and the sanctions programs under which designations are made. The data is refreshed every weekday from the official OFAC publication.
The API exposes four endpoints: entities (people and organizations), vessels (sanctioned ships, with maritime identifiers), programs (the list of sanctions programs with designation counts), and sources (the upstream data providers currently ingested). All endpoints share the same authentication and JSON response envelope.
Quick jump:
Sanctions Entities
Returns sanctioned entities — individuals, organizations, vessels, and aircraft — from the OFAC lists. Each record carries the primary name, known aliases, the sanctions programs it falls under, and a free-form set of identifiers (nationality, gender, document numbers, secondary-sanctions notes, and similar attributes as published by OFAC).
API Endpoint
https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN
Method: GET Auth: api_token query parameter Cost: 1 API call per request Pagination: offset / limit (default 20, max 100) Response format: JSON envelope with data, meta, and links
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| api_token | Yes | Your EODHD API token |
| q | No | Free-text search across name and aliases. Minimum 2 characters |
| type | No | Entity type: individual, entity, vessel, or aircraft |
| program | No | Sanctions program code (see the programs endpoint for the full list) |
| country | No | Country associated with the entity |
| active | No | true or false. Restrict to currently active or delisted designations |
| source | No | Data source. Currently ofac |
| page[limit] | No | Rows per page, 1 to 100. Default 20 |
| page[offset] | No | Number of rows to skip. Default 0 |
Request Example
https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN&program=RUSSIA-EO14024&type=entity
curl --location "https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN&program=RUSSIA-EO14024&type=entity&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN&program=RUSSIA-EO14024&type=entity&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN&program=RUSSIA-EO14024&type=entity&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/sanctions/entities?api_token=YOUR_TOKEN&program=RUSSIA-EO14024&type=entity&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Response Format
The response is a JSON object with data (the array of records), meta (total count and the active page window), and links (pagination links).
{
"data": [
{
"source": "ofac",
"source_uid": "31415",
"entity_type": "entity",
"name": "FEDERAL STATE AUTONOMOUS SCIENTIFIC ESTABLISHMENT",
"aliases": ["FSASE"],
"programs": ["RUSSIA-EO14024"],
"country": "Russia",
"listed_date": null,
"is_active": true,
"remarks": null,
"identifiers": { "Tax ID No.": ["7704028201"] }
}
],
"meta": { "total": 19056, "page": { "offset": 0, "limit": 20 } },
"links": { "next": "https://eodhd.com/api/sanctions/entities?page[offset]=20&page[limit]=20" }
}
| Field | Type | Description |
|---|---|---|
| source | string | Data source. Currently ofac |
| source_uid | string | Unique identifier of the record at the source |
| entity_type | string | One of individual, entity, vessel, or aircraft |
| name | string | Primary designated name |
| aliases | array | Known alternate names (AKAs) |
| programs | array | Sanctions program codes the entity is designated under |
| country | string or null | Associated country, where published |
| listed_date | string (date) or null | Designation date, where published |
| is_active | boolean | Whether the designation is currently active |
| remarks | string or null | Free-text remarks from the source |
| identifiers | object | Free-form attributes keyed by label (for example nationality, gender, passport or tax IDs, secondary-sanctions notes). Keys vary by record |
Sanctions Vessels
Returns sanctioned vessels with their maritime identifiers — IMO number, MMSI, call sign, flag, type, and tonnage — together with the owning entity and the sanctions programs involved. Use it for maritime compliance screening and dark-fleet monitoring.
API Endpoint
https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN
Method: GET Auth: api_token query parameter Cost: 1 API call per request Pagination: offset / limit (default 20, max 100) Response format: JSON envelope with data, meta, and links
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| api_token | Yes | Your EODHD API token |
| q | No | Free-text search across vessel and owner names. Minimum 2 characters |
| imo | No | Filter by IMO number |
| flag | No | Filter by flag state |
| vessel_type | No | Filter by vessel type |
| program | No | Sanctions program code |
| source | No | Data source. Currently ofac |
| page[limit] | No | Rows per page, 1 to 100. Default 20 |
| page[offset] | No | Number of rows to skip. Default 0 |
Request Example
https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN&flag=Panama
curl --location "https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN&flag=Panama&fmt=json"
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN&flag=Panama&fmt=json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$data = curl_exec($curl);
curl_close($curl);
try {
$data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
var_dump($data);
} catch (Exception $e) {
echo 'Error. '.$e->getMessage();
}
import requests url = f'https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN&flag=Panama&fmt=json' data = requests.get(url).json() print(data)
library(httr) library(jsonlite) url <- 'https://eodhd.com/api/sanctions/vessels?api_token=YOUR_TOKEN&flag=Panama&fmt=json' response <- GET(url) if (http_type(response) == "application/json") { content <- content(response, "text", encoding = "UTF-8") cat(content) } else { cat("Error while receiving data\n") }
Try it now (it's free)!
How to use it (YouTube)
Response Format
{
"data": [
{
"source": "ofac",
"entity_source_uid": "23156",
"entity_name": "7-28",
"imo_number": "8898831",
"mmsi": null,
"call_sign": null,
"flag": "Democratic People's Republic of Korea",
"vessel_type": null,
"tonnage": null,
"gross_tonnage": null,
"owner": null,
"programs": ["DPRK4"],
"country": null,
"is_active": true
}
],
"meta": { "total": 1499, "page": { "offset": 0, "limit": 20 } },
"links": { "next": "https://eodhd.com/api/sanctions/vessels?page[offset]=20&page[limit]=20" }
}
| Field | Type | Description |
|---|---|---|
| source | string | Data source. Currently ofac |
| entity_source_uid | string | Source identifier of the associated entity (joins to the entities endpoint) |
| entity_name | string | Vessel name as designated |
| imo_number | string or null | IMO ship identification number |
| mmsi | string or null | Maritime Mobile Service Identity |
| call_sign | string or null | Radio call sign |
| flag | string or null | Flag state |
| vessel_type | string or null | Vessel type (for example Crude Oil Tanker) |
| tonnage | number or null | Deadweight or registered tonnage, where published |
| gross_tonnage | number or null | Gross tonnage, where published |
| owner | string or null | Registered owner, where published |
| programs | array | Sanctions program codes |
| country | string or null | Associated country, where published |
| is_active | boolean | Whether the designation is currently active |
Sanctions Programs
Returns the full list of sanctions programs with the number of designated records under each. Use it to discover valid program codes for the program filter on the entities and vessels endpoints. This endpoint takes no parameters and is not paginated.
API Endpoint
https://eodhd.com/api/sanctions/programs?api_token=YOUR_TOKEN
Response Format
{
"data": [
{ "program": "RUSSIA-EO14024", "count": 6380 },
{ "program": "SDGT", "count": 3148 },
{ "program": "IFSR", "count": 1523 }
],
"meta": [],
"links": []
}
| Field | Type | Description |
|---|---|---|
| program | string | Sanctions program code |
| count | integer | Number of designated records under the program |
Sanctions Sources
Returns the upstream data sources currently ingested. The data set is sourced entirely from OFAC today; additional sources may be added over time. This endpoint takes no parameters and is not paginated.
API Endpoint
https://eodhd.com/api/sanctions/sources?api_token=YOUR_TOKEN
Response Format
{
"data": [
{ "name": "ofac" }
],
"meta": [],
"links": []
}
| Field | Type | Description |
|---|---|---|
| name | string | Source identifier (for example ofac) |
Response Codes
| Code | Meaning |
|---|---|
| 200 | Success. Response body carries data, meta, and links |
| 401 | Missing or invalid api_token |
| 403 | Token is valid but the plan does not include the Sanctions API (requires All-In-One) |
| 422 | Invalid parameter — unknown type or source value, invalid active value, a search term shorter than 2 characters, or page[limit] above 100 |
Notes and Limitations
- Reference data, not compliance advice. This API mirrors published OFAC data for screening and research. It is not legal or compliance advice. For binding determinations, verify against the official OFAC sources.
- OFAC coverage today. The data set currently covers U.S. Treasury OFAC lists. The sources endpoint reflects what is ingested; additional jurisdictions may be added over time.
- Weekday refresh. OFAC publishes on U.S. business days; the data set is refreshed each weekday. Same-day intraday changes are not reflected until the next refresh.
- Pagination. The entities and vessels endpoints support page[offset] and page[limit] (max 100) and report meta.total. The programs and sources endpoints return the full list in one response and are not paginated.
- Variable identifiers. The identifiers object on entity records uses free-form keys taken from OFAC (nationality, gender, document numbers, secondary-sanctions notes, and so on). The set of keys differs from record to record. Optional fields are returned as null where the source does not publish a value.
Related APIs
For interest rates and central-bank policy rates, see the Interest Rates API. For government bond yields, EURIBOR, and FX reference rates, see the Macroeconomic Data API.