Sanctions

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

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

ParameterValuesDefaultWhat it does
querytextnoneThe 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.
typesanction, pepsanctionWhich body of data to read.
pageinteger from 11The page to return.
per_pageinteger from 1 to 10050Records per page.
datasetcomma-separated namesnoneKeep records from these source datasets. Names come from GET /sanctions/datasets.
schemacomma-separated namesnoneKeep records of these kinds, for example Person,Company. Names come from GET /sanctions/schemas.
countrycomma-separated codesnoneKeep records with one of these countries.
sort_methodrelevance, alpha, daterelevance with query, else dateThe sort order. See below.
sort_orderasc, descdescThe direction for alpha and date.
targettrue, falsetruetrue returns only entities that are themselves listed. Send false for the supporting records.
whole_wordtrue, falsefalsetrue requires your text to stand as a whole word in the caption.
from_dateYYYY-MM-DDnoneKeep records changed on or after this date.
to_dateYYYY-MM-DDnoneKeep 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
}
FieldWhat it is
resultsThe records on this page.
totalEvery record that fits the query, over all pages.
pageThe page you got back.
per_pageThe page size used.
total_pagesThe 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_methodSorts byNotes
relevanceHow well the caption fits queryThe 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.
alphacaptionA to Z with sort_order=asc.
datelast_changeNewest 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:

  1. Your text can sit inside a longer word. query=Gulina returns Luopu County Gulina Muhan Clothing Co., Ltd. Send whole_word=true to require word boundaries.
  2. The word order must be the same. The caption Vladimir Putin is found by query=Vladimir Putin, and not by query=Putin Vladimir.
  3. Only the caption is read. Aliases, former names and other spellings are in properties, and search does not look there.
  4. 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

StatusCodeCause
400query_too_shortquery holds no token with three or more letters or digits.
400unknown_parameterA parameter name that does not exist.
400invalid_requestA value out of range, for example per_page=500 or page=0.

Read Errors for the rest.

On this page