Sanctions check in your Google Sheet
Screen any name against OFAC, EU, UK, UN sanctions lists right inside Google Sheets. Free 5 checks/day. Setup takes 2 minutes.
What you get
After setup, use these formulas in any cell:
| Formula | Result |
|---|---|
=SANCTIONS_CHECK("Rosneft") | HIT: OFAC_SDN — OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY (100%) |
=SANCTIONS_CHECK("Acme LLC") | CLEAR |
=SANCTIONS_CHECK("Rosneft", "OFAC_SDN") | Only checks OFAC SDN list |
=PEP_CHECK("Biden") | HIT: PEP — (head of state) |
=ENTITY_CHECK("Acme LLC") | Company registration lookup |
=SANCTIONS_CHECK_JSON("Rosneft") | Full JSON response as text |
Setup — 2 minutes
Menu → Extensions → Apps Script.
Delete everything in Code.gs. Copy the script below and paste it. Then Ctrl+S to save.
/**
* Compliance Suite — Google Sheets Apps Script
* Full source: https://jsonexlab.com/google-sheets/sanctions-check.gs
*/
var API_BASE = "https://compliance-engine.boring-saas-infra.workers.dev";
function SANCTIONS_CHECK(query, list) {
return sanctionsCheckImpl(query, list);
}
function PEP_CHECK(query) {
return sanctionsCheckImpl(query, null, "pep");
}
function ENTITY_CHECK(query) {
return sanctionsCheckImpl(query, null, "entity");
}
function sanctionsCheckImpl(query, list, kind) {
if (!query || String(query).trim() === "") return "ERROR: empty query";
var q = String(query).trim();
var path = "/check/sanctions";
if (kind === "pep") path = "/check/pep";
if (kind === "entity") path = "/check/entity";
var url = API_BASE + path + "?q=" + encodeURIComponent(q);
if (list) url += "&list=" + encodeURIComponent(list);
try {
var response = UrlFetchApp.fetch(url, {
method: "get", muteHttpExceptions: true,
headers: { "User-Agent": "GoogleSheets-ComplianceSuite/1.0" }
});
var code = response.getResponseCode();
var body = response.getContentText();
if (code !== 200) return "ERROR: HTTP " + code + " — " + body.slice(0, 120);
var data = JSON.parse(body);
if (data.error) return "ERROR: " + data.error;
if (data.status === "CLEAR" || data.matches === false) return "CLEAR";
var top = (data.results || [])[0];
if (!top) return "CLEAR";
var label = top.name || q;
var listName = top.list || "SANCTIONS";
var score = top.score ? Math.round(top.score * 100) + "%" : "";
if (data.status === "HIT") return "HIT: " + listName + " — " + label + (score ? " (" + score + ")" : "");
if (data.status === "POSSIBLE_MATCH") return "POSSIBLE: " + listName + " — " + label + (score ? " (" + score + ")" : "");
return data.status || "UNKNOWN";
} catch (e) {
return "ERROR: " + String(e).slice(0, 120);
}
}
function SANCTIONS_CHECK_JSON(query) {
if (!query || String(query).trim() === "") return "";
var url = API_BASE + "/check/sanctions?q=" + encodeURIComponent(String(query).trim());
try {
var response = UrlFetchApp.fetch(url, {
method: "get", muteHttpExceptions: true,
headers: { "User-Agent": "GoogleSheets-ComplianceSuite/1.0" }
});
return response.getContentText();
} catch (e) {
return "ERROR: " + String(e);
}
}
Download the full file: sanctions-check.gs
First time you use =SANCTIONS_CHECK(), Google will ask for permission to make external requests. Click Allow.
In cell A1 type a name. In cell B1 type:
=SANCTIONS_CHECK(A1)
Result appears in B1 within ~2 seconds.
Free tier: 5 checks per day. No API key required. For higher volume (500/day), upgrade to Pro $99/mo.
Sample sheet
Example formulas with real results:
| A (input) | B (formula) | C (result) |
|---|---|---|
| Rosneft | =SANCTIONS_CHECK(A2) | HIT: OFAC_SDN — OPEN JOINT-STOCK COMPANY ROSNEFT OIL COMPANY (100%) |
| Sberbank | =SANCTIONS_CHECK(A3) | HIT: OFAC_SDN — ... |
| Acme LLC | =SANCTIONS_CHECK(A4) | CLEAR |
Troubleshooting
Error: "Unknown function SANCTIONS_CHECK"
Apps Script saved but not reloaded. Close the sheet tab and reopen it.
Error: "HTTP 429"
Free tier exceeded (5/day). Upgrade to Pro or wait until midnight UTC.
Error: "HTTP 1102" or timeout
Apps Script has a 30-second timeout on UrlFetchApp. If you screen 100 rows at once, split into batches of 20.
Nothing happens — empty cell
Check that the formula starts with = (not + or −). Also check locale — in some locales formula is =SANCTIONS_CHECK("Rosneft") with ; instead of ,.
Full API
Same functions available via REST API for any language:
curl "https://compliance-engine.boring-saas-infra.workers.dev/check/sanctions?q=Rosneft"
Docs: jsonexlab.com/compliance