Practical guide

OFAC batch screening: upload a list and review every result

Run bulk OFAC screening for customers or suppliers. Prepare a CSV, check each row, resolve matches, and keep failed checks visible.

OFAC screening4 min read
On this page

What does a batch screening do?

Batch screening lets you submit many people or businesses together. Each row still needs its own screening result. Use SanctionsKit for a customer list, supplier register or other group your policy requires you to check. Give each legal party a stable reference, the correct subject type and the facts you know. A shared name is not a safe way to join records.

Rehearse with invented data in Sandbox first. Those checks use synthetic coverage, not live OFAC records. Before a real portfolio check, confirm Production access, the required available sources and enough allowance for the subjects you expect to complete.

Prepare and upload the CSV

Open Bulk screening, start a batch and choose CSV. Upload the list, map the columns and inspect the preview. Check names, subject types, dates and identifiers. Keep leading zeros in an ID. If you know only a birth year, do not let a spreadsheet turn it into January 1 of that year.

Choose screenings only or the permitted option to save records with explicit external references. Names do not merge customer profiles on their own. Fix invalid rows and conflicting references, then select the policy or sources. If a required source is unavailable, resolve that gap rather than sending a narrower check by mistake.

Send a small batch through the API

POST /api/v1/batches accepts subjects that each contain a screening request. Create a Sandbox key with batches:write and results:read. Keep it on your server as SANCTIONSKIT_API_KEY. Generate BATCH_KEY once for this exact submission. The two rows below are fictional and use synthetic coverage.

If the response is lost, retry with the same BATCH_KEY and unchanged body. For Production, replace the sandbox package with the required available sources and policy. See the batch API guide for current row limits and the private upload steps for larger files.

Send a small batch through the API code example
curl --fail-with-body "https://www.sanctionskit.com/api/v1/batches" \
  -H "Authorization: Bearer $SANCTIONSKIT_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $BATCH_KEY" \
  --data '{
  "name": "Synthetic OFAC workflow rehearsal",
  "subjects": [
    {
      "subject": {
        "name": "Example Trading Company",
        "entityType": "organization"
      },
      "package": "sandbox@1",
      "reference": "demo-supplier-001",
      "retention": "standard"
    },
    {
      "subject": {
        "name": "Alex Morgan",
        "entityType": "person",
        "birthDate": "1984"
      },
      "package": "sandbox@1",
      "reference": "demo-contact-002",
      "retention": "standard"
    }
  ]
}'

Match every submitted row to its outcome

An accepted batch returns a reference, not a decision for every row. Check GET /api/v1/batches/{id}?limit=100&offset=0 at a bounded interval until the run is completed, failed or cancelled. Read rows and nextOffset under data. Use the returned offset to request more rows until nextOffset is null. In the dashboard, open the batch details to inspect the same row outcomes.

Use row_number and the original row order to connect each result to your input reference. For a completed row, pass screening_id to GET /api/v1/results/{id} to read no_match or potential_match. Failed rows need attention; cancelled rows did not complete. Do not join results by name or treat the end of processing as approval for the whole list.

Separate review work from failed checks

Open retained match cases in Review queue. Review every candidate, complete outside checks and record the business action, with approval when required. If you correct a failed row, submit it with a new operation key and link it to the original row. A changed subject is a new check.

Imagine a fictional batch with three rows. One returns no_match. One returns potential_match. The third has an invalid date and fails. You have one result with no candidate, one result needing review, and one party still waiting for a valid check. Retrying the same accepted request after a lost response is different from correcting that failed row.

Keep the totals and plan the next check

Record how many rows you submitted and how many completed, failed or were cancelled. Assign the remaining work. Keep business references and any required screening and case evidence. Your record should show both when the batch finished and when the review work finished.

A batch does not enroll its subjects in ongoing monitoring. Set up Monitoring for the relationships that need repeat checks, and confirm its initial results. Use Usage & limits to plan for both the initial portfolio and future rescreens. This helps avoid a successful first import followed by missed scheduled work.

Sources and references

Frequently asked questions

Is bulk OFAC screening one result for the whole file?

No. A batch has a processing state, and each subject has its own row outcome. Read every row and match it to the original input. Some rows can need review or fail even when other rows complete.

Can a CSV use just the year of birth?

Use only the date detail you actually know and check the mapped preview. Do not invent a month or day to make a spreadsheet accept a value. Keep identifiers as text when needed so their leading zeros survive the import.

Should I upload the whole batch again after one row fails?

First check the existing batch and identify the failed work. A corrected row is a new screening request with a new operation key. A retry after a lost response uses the original key and unchanged body. Keep links between the original row and any correction.

Does uploading a customer list turn on ongoing monitoring?

No. Bulk screening checks the submitted list. Create monitors separately for relationships that need repeat checks. Verify the first completed monitoring run and plan for its recurring usage.