# Changelog of Sanctions Screening API (`sourcing-data-studio/sanctions-screening-api`) Actor

- **URL**: https://apify.com/sourcing-data-studio/sanctions-screening-api/changelog.md
- **Full Actor documentation**: https://apify.com/sourcing-data-studio/sanctions-screening-api.md

## Changelog

### 0.1.7 (2026-10-10)

- The Actor now checks the security certificate of the source. If a certificate does not verify, the download of that list fails. Before, the check was skipped, because the crawler library skips it unless it is told not to. data.trade.gov and sanctionslist.fcdo.gov.uk, the two addresses the lists are downloaded from, passed this check from the development machine on 2026-10-10. The build went live only after test runs on Apify's servers had downloaded both lists with the check switched on. The default is no proxy. With Apify Proxy the check stays on unless the proxy reports that it decrypts traffic, and on 2026-10-10 it did not report that.
- No change to the input or the output.

### 0.1.6 (2026-10-09)

- README: the Python example now works with version 3 of Apify's Python client, the version `pip install apify-client` installs today (it needs Python 3.11 or later). The example read the dataset id as `run["defaultDatasetId"]`. Client 3 returns a typed object, so that line stopped with `TypeError: 'Run' object is not subscriptable`, after the run had finished and been charged. It now reads `run.default_dataset_id`, and the line above it says `pip install "apify-client>=3"`.
- The faulty example was added on 2026-10-09 and had not been run before it was published. The corrected one was run against this Actor the same day with client 3.3.0.
- No change to the code, the input or the output.

### 0.1.5 (2026-10-09)

- README: the opening now states the price: what one saved row costs on the Free tier and what a typical query costs, from the same figures as the cost section. The sentence above the sample rows no longer names a "quick-test example".
- README: the output example now comes right after the feature list; the API section shows a curl, a JavaScript and a Python example; the cost section adds the price of a typical query. No change to the code, the input or the output.

### 0.1.4 (2026-10-06)

- **Listed companies, groups and ships are shown, also when their name contains a person's name (owner ruling M20.2, 2026-10-06: "show listed companies and ships").** Before, an entry whose name or alias contained the full name of a listed individual, or read like the name of a person, was left out before matching, also when the list typed it as an organisation, a vessel or an aircraft, so screening it gave `no_match` although it is listed. Now every entry that a list types as an organisation, a vessel or an aircraft is screened and shown with all its names and aliases, and the row says what it is in `entityType`. On the lists of 2026-10-05 this shows 275 more entries (58 companies and groups, 217 ships) and 212 more aliases. Private individuals are never shown: an entry that a list types as an individual is left out as before. Where a list gives no type (parts of the US list) the conservative tests stay: such an entry is kept only when its name is clearly an organisation, and a name or alias on it that reads like the name of a person or contains the full name of a listed individual is left out. In the run summary `personLikeNames` and `personLikeAliases` now count only entries and aliases of that kind. The README (Limits, FAQ, field table), the dataset schema (`entityType`) and the key-value store schema say so. The disclaimer in every row is unchanged: no match is not a clearance.

### 0.1.3 (2026-10-06)

- The price of a screened name is now $0.005 (Free and Bronze), $0.0045 (Silver) and $0.004 (Gold), set as the first price before the Actor is published. In the earlier draft it was $0.008, $0.008, $0.007 and $0.006. 1,000 screened names cost $5.00 on the Free tier, and a run of the most it screens, 200 names, costs at most $1.00.
- **Maximum names screened** is no longer prefilled with 10 in the Console form, and the API example no longer sends `maxItems: 10`. The prefilled 10 dropped every name beyond the tenth without a word, and the progress read "Screened 10 of 10". The field now stays at its default of 200, which screens every name. The progress counts all the names of the input ("Screened 10 of 25 names"). When the limit does leave names out, the closing status message and the run summary say so: "N of M names were NOT screened (limit X)", and `totals.namesNotScreenedByLimit` in the run summary counts them. Names beyond the limit are still neither screened nor charged. A run that ends at its time limit with names left says so in the same way.
- New field `confidenceBand` in every row: `match` (best score 0.95 or more), `possible` (best score at or above your minimum score and below 0.95) or `none` (no entry reached your minimum score). It ranks the row as `status` does, in one word for filters and agents. It is also in the dataset views and in the README.
- A refusal by a source is no longer answered with another address. Before, an answer of HTTP 401, 403, 407 or 429 retired the session and the next try left from a new session, which with a proxy list meant another proxy of yours. Now HTTP 401, 403 and 407 are final: one request, the list is recorded as `blocked` in the run summary (before it was `failed`), the run fails as for any missing list and nothing is charged. After HTTP 429 the Actor waits the time the source asks for in `Retry-After` (up to 60 seconds, else the back-off) and asks again from the same address; it gives up at once when the source asks for more than 60 seconds or sends `x-ratelimit-remaining: 0`. All tries of a run go out from one session; only a connection error still replaces it. A proxy that refuses to open the connection (it answers 401, 403, 407 or 429 to the request for a tunnel) is final in the same way: the next proxy of your list is not tried, the failure names the status, and the start of the proxy's answer is cut from the run summary and from the log events. A block or verification page that arrives instead of a list is also tried again from the same address only.
- Store listing: new search terms ("OFAC SDN check", "UK sanctions list check" replace the "list search" terms), new SEO title and description, a new opening paragraph in the README and a README section for AI agents. The **Proxy configuration** and **Retries per list download** descriptions no longer advise switching a proxy on after a failure and say how refusals are handled.
- A list you select that cannot be downloaded now fails the run, and nothing is charged for names. Before, the names were screened against the other list and charged, and `listsChecked` said which list was missing. Now every row is screened against all the lists you selected. The failure message names the missing list and says to run again later, or to select only the list that works. The run summary has the new field `listsFailed`, the selected lists that could not be downloaded.
- A list you did not select is still downloaded only to recognise private individuals. If that file cannot be downloaded, the run continues as before and the run summary says so.

### 0.1 (2026-10-05)

- First version: screens up to 200 company names per run against the US Consolidated Screening List and the UK Sanctions List (organisations, vessels and aircraft only; private individuals are left out) and returns one row per name with match, possible_match or no_match, scores and the matching list entries.
- Personal data: names and aliases that read like the name of a person are left out, also on entries the lists type as an organisation or a vessel (sole traders under the owner's name, ships named after a person). An entry that names a person and a company together is kept as the company only. The run summary counts both (`personLikeNames`, `personLikeAliases`).
- Coverage: an entry without a record type whose own name has no organisation word is kept when an alias proves it is an organisation ("DJI"). List names with legal boilerplate ("...; and any successor, sub-unit, or subsidiary thereof") also match under the plain company name.
- Scoring: a full legal name with a province or city in front finds the short list entry as a `possible_match` (0.90).
- Reliability: an empty or implausibly small list is treated as not downloaded. Error answers of the sources never reach the log or the run summary. **Maximum names screened** counts saved rows.
- `city` no longer holds a province or region, also not a Chinese province from the US list.
- Personal data: a company name, alias or ship name that contains the full name of an individual on either list is left out, at any length and with any organisation words. Both list files are downloaded in every run so that the individuals of both are known; a list you did not select is not screened against.
- End dates: an entry is no longer left out because its end date has passed (some denial orders are renewed while the published date stays old). New field `endDate` in every match shows the date as published; the run summary counts such entries (`recordsWithPastEndDate`).
- Coverage: organisations that were left out because of the words "Mrs", "a.k.a.", "f.k.a." or "President" in their name are kept, and so are airlines named "... Air".
- Personal data: the given name with the family name of a listed individual now counts as the full name, so a company, alias or ship named with it is left out also when the list gives the person a middle name, a second family name or several spellings, or when an initial stands between the two words.
- Coverage: companies of the Denied Persons List whose legal form stands alone after a comma ("..., S.L.") are kept.
- A connection failure without an error text is reported with its error code in the log and the run summary.
