Check whether a ship is sanctioned, by IMO number, with one GET and no API key

The vessel sanctions screening API answers GET https://arcnautical.com/api/v1/vessels/{imo}/check with a verdict for that hull — screened against OFAC SDN, OpenSanctions, EU FSD, UN Consolidated and UK OFSI — plus its ownership opacity and a vetting grade. No key, no account, 100 requests an hour per IP. A self-serve key adds the full screening record with evidence, fleet screening, standing vessel monitors and signed webhooks, at 10,000 assessments a month. Every response names the lists that were actually reachable, and an INCOMPLETE result is never charged. Full documentation →
Request — no credentials
# any 7-digit IMO number
curl https://arcnautical.com/api/v1/vessels/9169067/check
Response — live, trimmed
{
  "imo": "9169067",
  "sanctions": {
    "status": "GREEN",
    "detail": "No matches across OFAC SDN, OpenSanctions,
              EU FSD, UN Consolidated, UK OFSI for this
              vessel's identifiers and current name. …",
    "coverageComplete": true,
    "coverageGaps": []
  },
  "ownership": { "opacity": "HIGH", "score": 70 },
  "vetting":   { "grade": "C", "score": 41, "status": "marginal" },
  "assessed": true,
  "checkedAt": "2026-09-13T17:10:03.138Z"
}

Four verdicts, and the lists behind each one

A sanctions status is only as good as the coverage behind it. The API tells you which of the five lists it read for this verdict, in coverageGaps — a source that was unreachable is named, never silently skipped.

statusMeaningWhat produced it
REDConfirmed match.The hull's IMO or MMSI matches a designated entry exactly — identifier-level, not a name guess.
AMBERNeeds a human.At least one name-level or potential match that could not be confirmed on the identifier — manual verification. Name collisions with a different hull are excluded from the verdict and left visible under matches.
GREENNo match found.No hit across the lists named in detail, for the vessel's identifiers and current name.
INCOMPLETENo verdict is possible.A mandatory list was unreachable, or the hull's identity could not be resolved from the IMO. Not charged; the keyed response carries a retry_after.

Scope, stated plainly: prior names are not screened. A hull designated under a former name, in a source record that carries no IMO, will not be matched here — the response says so in every detail string rather than letting a GREEN imply more than it checked.

OFAC designates hulls, not just companies — so screen the hull

OFAC's SDN list carries vessel entries with IMO numbers. An entity-screening API that matches names will miss a tanker that has been renamed twice since designation; a vessel-native API keys on the IMO, which survives renaming and reflagging. The scale of the problem, from our published datasets:

1,540
vessels currently designated by OFAC across 7 sanctions programs
as of 2026-09-10 · dataset
42.2%
of them under the Iran program (the largest); Russia is second at 29.0%
as of 2026-09-10 · dataset
33.2%
of designated vessels with a recorded flag fly a flag-of-convenience or shell-jurisdiction register
as of 2026-09-10 · dataset

The numbers above are read from the same CC BY 4.0 datasets the API is built on and refresh with them; each carries its own as-of date. All datasets →

Three lines in any language, or one line for an agent

JavaScript
const res = await fetch(
  'https://arcnautical.com/api/v1/vessels/9169067/check'
);
const v = await res.json();
console.log(v.sanctions.status, v.sanctions.coverageGaps);
Python
import requests

v = requests.get(
    "https://arcnautical.com/api/v1/vessels/9169067/check",
    timeout=15,
).json()
print(v["sanctions"]["status"], v["sanctions"]["coverageGaps"])
With a key — the full screening record
curl -X POST https://arcnautical.com/api/v1/screenings \
  -H "Authorization: Bearer $ARC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imo":"9169067","customer_reference":"fixture-4471"}'
Coding agents — MCP server
claude mcp add arcnautical -- npx -y @arcnautical/mcp
# keyless tools work with no env; add ARC_API_KEY for the rest

Pace yourself from the headers: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, on 200s and on 4xx alike. OpenAPI 3.1 · Postman collection · AGENTS.md

Every party in the transaction chain has a sanctions obligation. The call is the same.

Commodity traders and charterers

Before fixture and again before the bill of lading. Screen the nominated hull, then put it on a monitor for the life of the voyage so a mid-voyage designation reaches you as a webhook, not a news alert.

Bunker suppliers and ship chandlers

Before delivering fuel, lubricants or stores alongside. A sanctioned recipient hull is a sanctions exposure for the supplier; one GET per nomination closes it.

Shipbrokers

At the moment a hull enters a circular. Screening the IMO takes less time than typing the vessel's name into a search engine, and the result is defensible.

Freight forwarders and NVOCCs

When the carrier's vessel schedule is published. Batch the week's hulls with POST /api/v1/screening-batches and read the exceptions.

P&I clubs, hull underwriters and banks

At entry, renewal and each trade-finance drawdown. Register the insured or financed fleet once, refresh it on your cadence, and read /fleets/{id}/changes.

Port agents and terminals

On nomination and again at arrival. Ownership opacity and the vetting grade arrive in the same response as the sanctions verdict.

The keyless check is the demo. The keyed API is the compliance record.

POST /api/v1/screenings — the record

The same engine, returning everything behind the verdict: each match with the source entry it came from, how the hull's identity was resolved, and notices[] that say in words why a result is AMBER or INCOMPLETE and what would clear it. Retrievable by id for as long as your account's retention setting keeps it.

POST /api/v1/fleets — the book

Register the hulls you are exposed to once. /refresh screens every one of them; /exposure summarises the fleet; /changes lists what moved since your last read, so an integration polls one feed instead of re-screening 300 hulls.

POST /api/v1/vessel-monitors — the watch

A standing monitor re-screens a hull on a schedule and delivers a signed webhook when its verdict changes. /simulate fires a test event so you can verify your receiver before anything real happens.

Test and live are the same engine

Both key environments run production scoring against production lists; the environment only partitions quota, idempotency and webhook namespaces. Live carries 10,000 assessments a month, test 1,000. Neither is a trial and neither expires.

Vessel sanctions API, answered

Is there a free API to check if a vessel is sanctioned?

Yes. GET https://arcnautical.com/api/v1/vessels/{imo}/check needs no API key and no account, serves 100 requests an hour per IP, and returns a sanctions verdict for the vessel together with the lists that were screened. Results are cached for an hour, are not retained against any customer and consume no quota.

Which sanctions lists does the vessel screening API cover?

OFAC SDN, OpenSanctions, the EU Financial Sanctions Database (EU FSD), the UN Security Council Consolidated List and the UK OFSI list. Every response names which of the five were reachable when the verdict was computed; a missing one is listed in coverageGaps, never silently skipped.

Does the API screen by IMO number or by vessel name?

By IMO first. An exact IMO or MMSI match to a designated entry is RED. A name-only hit is AMBER, and a name that collides with a different hull is excluded from the verdict and left visible under matches for review. Prior names are not screened: a hull designated under a former name in a source record that carries no IMO will not be matched.

Do I need an API key to screen a vessel for OFAC sanctions?

Not for the verdict. The keyless check returns the sanctions status, ownership opacity and vetting grade. An API key is needed for the full screening record with evidence, fleet screening, standing monitors and webhooks. Keys are self-serve; a live key carries 10,000 assessments a month, a test key 1,000, and an INCOMPLETE result is never charged.

How do I screen a whole fleet for sanctions?

Register the hulls once with POST /api/v1/fleets (a name plus a list of IMOs), then POST /api/v1/fleets/{id}/refresh screens every hull and GET /api/v1/fleets/{id}/changes lists what moved since your last read. For a one-off list without a fleet, POST /api/v1/screening-batches takes the IMOs directly. Standing vessel monitors re-screen on a schedule and deliver a signed webhook when a verdict changes.

Screen a hull now. Mint a key when you need the record.

The check is keyless and the key is self-serve. Nobody will call you.