The entities API
Everything we hold about one record: its fields, its listings, the other registers that name the same party, and the merged view across them.
Fetch a record
Pass a record ID from a match or search result. /api/entity/<id> and /api/entity?id=<id> are equivalent; the path form is preferred.
curl "https://api.crownintelligence.net/api/entity/379781867"
import requests
BASE = "https://api.crownintelligence.net"
rec = requests.get(f"{BASE}/api/entity/379781867", timeout=60).json()
print(rec["name"], rec["register"], rec["topics"])
for listing in rec["listings"]:
print(" -", listing["register"], listing["programme"], listing["listed_on"])const BASE = "https://api.crownintelligence.net";
const rec = await (await fetch(`${BASE}/api/entity/379781867`)).json();
console.log(rec.name, rec.register, rec.topics);
for (const l of rec.listings) console.log(" -", l.register, l.programme, l.listed_on);The answer (shortened):
{
"id": 379781867,
"register": "UK FCDO — Consolidated UK Sanctions List",
"name": "IGOR ALEXANDROVICH PUTIN",
"alt_names": "ИГОРЬ АЛЕКСАНДРОВИЧ ПУТИН",
"program": "The Russia",
"list_type": "SANCTION",
"entity_type": "INDIVIDUAL",
"dob": "1953-03-30",
"nationality": null,
"entity_id": "deee1587-7cfd-4652-ba74-e81c176b84cd",
"first_seen": "2026-09-24T11:23:00.065456+00:00",
"loaded_at": "2026-09-24T11:23:00.065456+00:00",
"topics": [
"sanction"
],
"merged_entity_url": "/api/entity/deee1587-7cfd-4652-ba74-e81c176b84cd",
"related": [],
"listings": [
{
"record_id": 379781867,
"register": "UK FCDO — Consolidated UK Sanctions List",
"list_type": "SANCTION",
"topics": [
"sanction"
],
"programme": "The Russia",
"listed_on": null,
"delisted_at": null,
"status": null,
"source_url": null,
"first_seen": "2026-09-24T11:23:00.065456+00:00",
"last_seen": "2026-09-24T11:23:00.065456+00:00"
}
]
}
The record carries every field we hold for it, plus:
related: other active records of the same party, from other registers (up to 100). They are the records that share its merged entity ID or, where there is none, its exact name and birth date.listings: the record and its related records reduced to the listing facts (register, programme, list type and topics, listing and delisting dates, source link, first and last seen), nested in one list.merged_entity_url: where to fetch the merged view, when the record has one.
Our own presentation of the same record is its page on this site: record 379781867.
Fetch a merged entity
When registers name the same party, their records share a merged entity ID (entity_id, shown as merged_entity in match results). Fetch it the same way:
curl "https://api.crownintelligence.net/api/entity/deee1587-7cfd-4652-ba74-e81c176b84cd"
import requests
BASE = "https://api.crownintelligence.net"
ent = requests.get(f"{BASE}/api/entity/deee1587-7cfd-4652-ba74-e81c176b84cd", timeout=60).json()
print(ent["caption"], ent["schema"], ent["datasets"], ent["referents"])The merged view combines the records: caption (the most frequent name), schema, properties (every name, alias, birth date, nationality, IMO number and programme), datasets, topics, first_seen, last_seen and referents (the record IDs it was built from). By default it also nests listings and the full records. With ?nested=false:
{
"id": "deee1587-7cfd-4652-ba74-e81c176b84cd",
"entity_id": "deee1587-7cfd-4652-ba74-e81c176b84cd",
"caption": "IGOR ALEXANDROVICH PUTIN",
"schema": "Person",
"properties": {
"name": [
"IGOR ALEXANDROVICH PUTIN"
],
"alias": [
"ИГОРЬ АЛЕКСАНДРОВИЧ ПУТИН"
],
"birthDate": [
"1953-03-30"
],
"nationality": [],
"imoNumber": [],
"programme": [
"The Russia"
]
},
"datasets": [
"UK FCDO — Consolidated UK Sanctions List"
],
"topics": [
"sanction"
],
"first_seen": "2026-09-24T11:23:00.065456+00:00",
"last_seen": "2026-09-24T11:23:00.065456+00:00",
"referents": [
379781867
]
}
The older query forms /api/entity?id= and /api/entity?entity_id= still work.
Flat or nested
?nested=false returns the record (or merged entity) alone, without related, listings or records. Use it when you only need to confirm a record is still active, or when you poll many IDs.
FollowTheMoney format
Add ?format=ftm to get one record in the same FollowTheMoney shape as a line of entities.ftm.json in the bulk files; add &nested=true for the shape of targets.nested.json, with the Sanction entity under properties.sanctions. The bulk-file ID (crown-379781867) is accepted in the path too.
curl "https://api.crownintelligence.net/api/entity/crown-379781867?format=ftm"
{
"id": "crown-379781867",
"caption": "IGOR ALEXANDROVICH PUTIN",
"schema": "Person",
"properties": {
"name": [
"IGOR ALEXANDROVICH PUTIN"
],
"topics": [
"sanction"
],
"alias": [
"ИГОРЬ АЛЕКСАНДРОВИЧ ПУТИН"
],
"birthDate": [
"1953-03-30"
],
"notes": [
"Nat: Russia · DOB: 30/03/1953 · Individual · Ref: RUS1424"
]
},
"referents": [],
"datasets": [
"uk_fcdo_consolidated_uk_sanctions_list"
],
"first_seen": "2026-09-24T11:23:00.065456+00:00",
"last_seen": "2026-09-24T11:23:00.065456+00:00",
"last_change": "2026-09-24T11:23:00.065456+00:00",
"target": true,
"canonical_id": "crown-e-deee1587-7cfd-4652-ba74-e81c176b84cd"
}
Keeping your stored IDs current
If you store record IDs with your screening decisions, check them from time to time:
- An active record answers
200. - A record that is no longer active, but whose merged entity still has active records, answers
308with aLocationheader pointing to/api/entity/<entity_id>. Most HTTP clients follow it automatically. Update your stored reference to the merged entity. - A record that is no longer active and has no live merged entity answers
404. The party is no longer on that register; review the case.
Merged entity IDs can change when records are linked or unlinked. Store the record IDs (referents) alongside a merged ID so you can rebuild the link.
Related records beyond 100
Each record returns at most 100 related records. There is no pagination of related records yet; for parties listed on more registers, use the merged entity, which returns up to 200 records, or the bulk files.
Last updated 2026-10-03