Search
GET /sanctions/search finds records by text in the caption. Every parameter, the filters, sorting, paging, and what the contains match means for you.
GET /sanctions/searchsearch returns a page of records whose caption contains your text. It is the endpoint behind a list view: a user types a name, reads the hits and opens one.
For a screening decision, use POST /sanctions/match instead. Read Search or match.
Full field list: searchSanctions in the reference.
Parameters
All parameters go in the query string. All values are strings.
| Parameter | Values | Default | What it does |
|---|---|---|---|
query | text | none | The text to find in the caption. It needs at least one token with three or more letters or digits. Without it you get the whole (filtered) list. |
type | sanction, pep | sanction | Which body of data to read. |
page | integer from 1 | 1 | The page to return. |
per_page | integer from 1 to 100 | 50 | Records per page. |
dataset | comma-separated names | none | Keep records from these source datasets. Names come from GET /sanctions/datasets. |
schema | comma-separated names | none | Keep records of these kinds, for example Person,Company. Names come from GET /sanctions/schemas. |
country | comma-separated codes | none | Keep records with one of these countries. |
sort_method | relevance, alpha, date | relevance with query, else date | The sort order. See below. |
sort_order | asc, desc | desc | The direction for alpha and date. |
target | true, false | true | true returns only entities that are themselves listed. Send false for the supporting records. |
whole_word | true, false | false | true requires your text to stand as a whole word in the caption. |
from_date | YYYY-MM-DD | none | Keep records changed on or after this date. |
to_date | YYYY-MM-DD | none | Keep records changed on or before this date. |
An unknown parameter is an error, not something the API ignores. limit=5 returns 400 unknown_parameter. Read Errors.
The response
{
"results": [
{
"id": "es-mc-85d50463dadae4256272c2014ee57ba9ce55b92e",
"caption": "LOURDES GULINA CANEDA",
"schema": "Person",
"datasets": ["es_mayors_councillors", "ann_pep_positions"],
"last_change": "2025-11-05T14:35:45",
"properties": {
"country": ["es"],
"name": ["LOURDES GULINA CANEDA"]
}
}
],
"total": 4,
"page": 1,
"per_page": 2,
"total_pages": 2
}| Field | What it is |
|---|---|
results | The records on this page. |
total | Every record that fits the query, over all pages. |
page | The page you got back. |
per_page | The page size used. |
total_pages | The number of pages at this page size. |
A search result is a short entity: id, caption, schema, datasets, last_change and a part of properties. Call GET /sanctions/entities/{id} with the id for the full record.
Sorting
sort_method | Sorts by | Notes |
|---|---|---|
relevance | How well the caption fits query | The default when you send query. A whole-word hit ranks above a hit inside a word. For a query of two or more words, a hit with the same word order ranks highest. sort_order has no effect. |
alpha | caption | A to Z with sort_order=asc. |
date | last_change | Newest first with the default sort_order=desc. The default when you send no query. |
relevance needs a query. Without one, the API sorts by date.
Paging
Read total_pages, then walk the pages with page. The maximum page size is 100.
curl -s -G "https://api.linkinlegal.com/v1/sanctions/search" \
-H "Authorization: Bearer $LINKINLEGAL_API_KEY" \
--data-urlencode "query=Gulina" \
--data-urlencode "per_page=100" \
--data-urlencode "page=2"Both relevance and date break ties on the entity id, so a record does not jump between pages while you walk them.
Filters
Combine the filters. They all narrow the same list.
# Companies from the EU financial sanctions file, registered in Russia.
curl -s -G "https://api.linkinlegal.com/v1/sanctions/search" \
-H "Authorization: Bearer $LINKINLEGAL_API_KEY" \
--data-urlencode "schema=Company,Organization" \
--data-urlencode "dataset=eu_fsf" \
--data-urlencode "country=ru" \
--data-urlencode "per_page=25"# Everything that changed since 1 September 2026, newest first.
curl -s -G "https://api.linkinlegal.com/v1/sanctions/search" \
-H "Authorization: Bearer $LINKINLEGAL_API_KEY" \
--data-urlencode "from_date=2026-09-01" \
--data-urlencode "sort_method=date"from_date and to_date read the last_change of the record. Read Data freshness before you build a "what is new" job on them.
Ask GET /sanctions/datasets, GET /sanctions/schemas and GET /sanctions/countries for the values these filters accept. A dataset name that does not exist is not an error: it returns an empty list.
What "contains" means for you
The match is a plain case-insensitive "contains" on the caption. Four consequences:
- Your text can sit inside a longer word.
query=GulinareturnsLuopu County Gulina Muhan Clothing Co., Ltd. Sendwhole_word=trueto require word boundaries. - The word order must be the same. The caption
Vladimir Putinis found byquery=Vladimir Putin, and not byquery=Putin Vladimir. - Only the caption is read. Aliases, former names and other spellings are in
properties, andsearchdoes not look there. - The script must be the same. A caption in Cyrillic is not found with Latin text, and the other way round.
# Whole word: finds "Vladimir Putin", not "Computing".
curl -s -G "https://api.linkinlegal.com/v1/sanctions/search" \
-H "Authorization: Bearer $LINKINLEGAL_API_KEY" \
--data-urlencode "query=Putin" \
--data-urlencode "whole_word=true"Because of points 2, 3 and 4, an empty search result does not mean the subject is clean. Use
match for that answer: it compares every name and alias, it accepts a
different word order, it tolerates typos, and it reads Cyrillic and Greek names in Latin letters.
Errors
| Status | Code | Cause |
|---|---|---|
| 400 | query_too_short | query holds no token with three or more letters or digits. |
| 400 | unknown_parameter | A parameter name that does not exist. |
| 400 | invalid_request | A value out of range, for example per_page=500 or page=0. |
Read Errors for the rest.