Compliance answers one question: is this crew member fully certified for the role they hold on this vessel? CrewPass works that out for you by matching the role’s requirements against the crew member’s verified documents — you read the result, you don’t compute it.
Requires crew:compliance:read. Authenticated with your API key as a Bearer token over TLS; reads are not signed. It’s a read-only POST with an empty JSON body.

What feeds compliance

Three kinds of requirement are checked, and each shows up in the response:
  • Role certificates (source: "explicit") — the specific certificates the crew member’s position requires (e.g. Advanced Fire Fighting for a senior role).
  • STCW basic safety training (source: "stcw") — the standard safety modules (Personal Survival, Fire Prevention, First Aid, Personal Safety…), each with its own status and expiry.
  • Medical (source: "medical") — the ENG1 (or equivalent) seafarer medical: its fitness category and expiry. CrewPass never exposes the doctor or clinic.

Get a compliance snapshot

cURL
curl -sS "$BASE/api/v2/employers/me/crew/crew_001/compliance-checks" \
  -H "Authorization: Bearer $CPK_KEY" -H "Content-Type: application/json" \
  -d '{}'
If a crew member is on more than one of your vessels, add ?vessel_id=<ves_…> (from their fleet row) so the snapshot is for the right position.
Response
{
  "crew_unique_id": "crew_001",
  "overall_status": "at_risk",
  "requirements_total": 8,
  "requirements_met": 7,
  "requirements_expiring": 1,
  "requirements_expired": 0,
  "requirements_missing": 0,
  "stcw_completion_percentage": 100.0,
  "next_expiry_date": "2026-08-01",

  "requirements": [
    { "requirement_key": "eng1", "title": "ENG1 Medical", "source": "medical",
      "status": "expiring", "expiry_date": "2026-08-01", "days_until_expiry": 54 },
    { "requirement_key": "advanced_firefighting", "title": "Advanced Fire Fighting",
      "source": "explicit", "status": "met", "document_id": "doc_5", "expiry_date": "2027-02-01" }
  ],

  "stcw": {
    "completion_percentage": 100.0,
    "modules": [
      { "code": "A-VI/1-1", "name": "Personal Survival", "status": "met", "expiry_date": "2028-03-01" }
    ]
  },

  "medical": { "status": "valid", "expiry_date": "2026-08-01", "fit_category": "Fit" }
}

Reading the result

Start with overall_status:
overall_statusMeaning
compliantEverything met, nothing expiring within 90 days.
at_riskAll met, but at least one requirement expires soon.
non_compliantAt least one requirement is missing, expired, or rejected.
no_roleThe crew member has no assigned role to check against.
Then drill in:
  • requirements[] is the actionable list — each role/STCW/medical requirement with its status (met · expiring · expired · missing · pending), the document_id that satisfies it (for role certificates), and days_until_expiry.
  • stcw breaks out the basic-safety modules and overall percentage.
  • medical gives the fitness category and expiry only.
A practical “who needs attention” check: anyone whose overall_status is non_compliant, or at_risk with a next_expiry_date inside your renewal window.

Next