Maritime & Telecom Compliance
Verify vessel registrations, check C-TPAT membership, search FCC radio licenses, and screen maritime entities against federal watchlists — all through the ComplianceGrid API.
Use Cases
Maritime Due Diligence
Screen vessels and owners before chartering, port calls, or cargo bookings to ensure sanctions compliance.
C-TPAT Partner Validation
Verify importer/carrier C-TPAT membership for expedited customs processing and reduced inspections.
FCC License Verification
Verify radio licenses for maritime ship stations, broadcast stations, and wireless carriers.
Port Security Compliance
Screen inbound vessels and operators against OFAC sanctioned vessel lists before granting port access.
Workflow Steps
Step 1: Vessel Search
Search for vessels by IMO number, MMSI, vessel name, or flag state. Verify registration, ownership, and flag details.
Step 2: C-TPAT Verification
Verify Customs-Trade Partnership Against Terrorism (C-TPAT) membership for importers, carriers, and brokers. C-TPAT members receive expedited customs processing.
Step 3: FCC License Search
Search the FCC Universal Licensing System (ULS) for radio station licenses — including maritime ship stations, aviation ground stations, and commercial radio.
Step 4: Sanctions Screening
Screen vessel owners, operators, and flag states against OFAC SDN (which includes sanctioned vessels by IMO number) and other federal watchlists.
Step 1: Vessel Search
Search for vessels by IMO number (unique 7-digit identifier), MMSI (Maritime Mobile Service Identity), vessel name, or flag state.
import ComplianceGrid from "@compliancegrid/sdk";
const cg = new ComplianceGrid({
apiKey: process.env.COMPLIANCEGRID_API_KEY,
});
// Search by IMO number
const vessel = await cg.maritime.vesselSearch({
imoNumber: "9321483",
});
const v = vessel.data.results[0];
console.log("Vessel:", v.vesselName);
console.log("IMO:", v.imoNumber);
console.log("MMSI:", v.mmsi);
console.log("Flag:", v.flagState);
console.log("Type:", v.vesselType);
console.log("Gross Tonnage:", v.grossTonnage);
console.log("Owner:", v.registeredOwner);
console.log("Operator:", v.operator);
console.log("Classification:", v.classificationSociety);
console.log("Year Built:", v.yearBuilt);
// Search by vessel name
const results = await cg.maritime.vesselSearch({
vesselName: "Ever Given",
});
console.log(`Found ${results.data.totalResults} matching vessels`);
// Search by flag state
const flaggedVessels = await cg.maritime.vesselSearch({
flagState: "PA", // Panama
limit: 10,
});Step 2: C-TPAT Verification
C-TPAT (Customs-Trade Partnership Against Terrorism) is a voluntary CBP program. Members receive reduced inspections, priority processing, and front-of-line privileges.
// Verify C-TPAT membership
const ctpat = await cg.maritime.ctpatVerify({
companyName: "Maersk Line",
});
console.log("Company:", ctpat.data.companyName);
console.log("C-TPAT Member:", ctpat.data.isMember);
console.log("Membership Status:", ctpat.data.status); // "ACTIVE", "SUSPENDED", "NOT_FOUND"
console.log("Tier:", ctpat.data.tier); // "Tier 1", "Tier 2", "Tier 3"
console.log("Valid Through:", ctpat.data.validThrough);
if (!ctpat.data.isMember) {
console.warn("Not a C-TPAT member — standard customs processing applies");
}
// Also verify by SVI (Status Verification Interface) number
const byNumber = await cg.maritime.ctpatVerify({
sviNumber: "CT-12345",
});Tier 1
Basic membership — reduced inspections, front-of-line processing
Tier 2
Enhanced — further reduced exams, priority FAST lane access
Tier 3
Top tier — lowest exam rates, green lane customs clearance
Step 3: FCC License Search
Search the FCC Universal Licensing System (ULS) for radio station licenses. This covers maritime ship stations, aviation ground stations, amateur radio, and commercial wireless licenses.
// Search FCC ULS by callsign
const license = await cg.fcc.ulsSearch({
callsign: "WDA1234",
});
const lic = license.data.results[0];
console.log("Callsign:", lic.callsign);
console.log("Licensee:", lic.licenseeName);
console.log("Service:", lic.serviceDescription); // "Ship Station", "Land Mobile", etc.
console.log("Status:", lic.licenseStatus); // "Active", "Expired", "Cancelled"
console.log("Grant Date:", lic.grantDate);
console.log("Expiration:", lic.expirationDate);
console.log("Frequency:", lic.frequency);
// Search by licensee name
const byName = await cg.fcc.ulsSearch({
licenseeName: "Carnival Corporation",
});
console.log(`Found ${byName.data.totalResults} FCC licenses`);
// Search by service type
const shipStations = await cg.fcc.ulsSearch({
serviceCode: "SA", // Ship Station (Voluntary)
state: "FL",
limit: 20,
});Step 4: Maritime Sanctions Screening
OFAC's SDN list includes sanctioned vessels identified by IMO number. Screen both the vessel and its owner/operator.
// Screen the vessel owner and operator
const screening = await cg.compliance.screenParties([
{
name: v.registeredOwner,
country: v.flagState,
type: "COUNTERPARTY",
},
{
name: v.operator,
country: v.flagState,
type: "COUNTERPARTY",
},
{
// Also screen the vessel name itself — OFAC lists sanctioned vessels
name: v.vesselName,
type: "VESSEL",
identifiers: [{ type: "IMO", value: v.imoNumber }],
},
]);
if (screening.data.overallResult === "HIT") {
console.error("SANCTIONS HIT — vessel or owner/operator is sanctioned");
for (const r of screening.data.results) {
if (r.matchCount > 0) {
console.error(` ${r.party.name}: ${r.matchCount} matches`);
for (const m of r.matches) {
console.error(` ${m.source}: ${m.name} (score: ${m.matchScore})`);
}
}
}
} else {
console.log("All clear — vessel, owner, and operator pass sanctions screening");
}Complete Maritime Verification
async function verifyVessel(imoNumber: string) {
// Step 1: Look up vessel
const vessel = await cg.maritime.vesselSearch({ imoNumber });
const v = vessel.data.results[0];
if (!v) return { valid: false, reason: "Vessel not found" };
// Step 2: Check flag state risk
const highRiskFlags = ["KP", "IR", "SY", "CU"]; // North Korea, Iran, Syria, Cuba
const flagRisk = highRiskFlags.includes(v.flagState) ? "HIGH" : "LOW";
// Step 3: Screen vessel + owner + operator
const screening = await cg.compliance.screenParties([
{ name: v.registeredOwner, country: v.flagState, type: "COUNTERPARTY" },
{ name: v.vesselName, type: "VESSEL" },
]);
// Step 4: Check C-TPAT if applicable
let ctpatStatus = "NOT_CHECKED";
if (v.operator) {
try {
const ctpat = await cg.maritime.ctpatVerify({ companyName: v.operator });
ctpatStatus = ctpat.data.isMember ? "MEMBER" : "NOT_MEMBER";
} catch { ctpatStatus = "NOT_FOUND"; }
}
return {
valid: screening.data.overallResult !== "HIT" && flagRisk !== "HIGH",
vessel: v.vesselName,
imo: imoNumber,
flag: v.flagState,
flagRisk,
owner: v.registeredOwner,
sanctionsClear: screening.data.overallResult !== "HIT",
ctpatStatus,
verifiedAt: new Date().toISOString(),
};
}
const result = await verifyVessel("9321483");
console.log(result.valid ? "VESSEL CLEARED" : "VESSEL BLOCKED");Regulatory Context
- • OFAC maintains a list of sanctioned vessels identified by IMO number — check before any port call or cargo booking.
- • The Maritime Transportation Security Act (MTSA) requires screening of vessels and cargo for security threats.
- • C-TPAT is a voluntary CBP program — non-membership is not a compliance failure, but members receive processing benefits.
- • FCC ship station licenses are required for maritime radio communications under 47 CFR Part 80.
- • Flag state sanctions (Iran, North Korea, Syria, Cuba) may prohibit all transactions regardless of vessel-level screening.
Party screening through AES filing
Full endpoint documentation