Home · Compliance Suite · Google Sheets Add-on

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.

Setup guide ↓ Full API docs

What you get

After setup, use these formulas in any cell:

FormulaResult
=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

1 Open a Google Sheet

Go to sheets.new — creates a new blank sheet.

2 Open Apps Script editor

Menu → Extensions → Apps Script.

3 Paste the 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

4 Grant permission (first run)

First time you use =SANCTIONS_CHECK(), Google will ask for permission to make external requests. Click Allow.

5 Use the formulas

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