Compliance

ISM compliance records — drill cadences, permits to work, MARPOL regulatory record entries.

GET/compliance/vessel/{vesselId}/drills/cadences

List a vessel's ISM drill cadences

Returns EVERY active `DrillCadence` row for the vessel (typically fewer than 15 — one per ISM-required drill type), plus pre-computed `overdue` and `dueSoon` sub-lists. Not a flat list at the top level and not cursor-paginated — this is a bounded ISM registry, not a growing log (see `docs/api.md` "Known gaps").

Path parameters
NameInTypeRequiredDescription
vesselIdpathstring (uuid)required
Response
FieldTypeRequiredDescription
dataobjectrequired
data.cadencesarray<object>optional
data.cadences[].idstring (uuid)optional
data.cadences[].drillTypestringoptionalDrillType enum, e.g. fire, abandon_ship, man_overboard, lifeboat_launch, steering_gear_test.
data.cadences[].frequencystringoptionalRecurringFrequency enum, e.g. monthly, quarterly, annually.
data.cadences[].isActivebooleanoptional
data.cadences[].lastCompletedAtstring (date-time) | nulloptional
data.cadences[].nextDueAtstring (date-time) | nulloptional
data.cadences[].alertDaysBeforeDueintegeroptional
data.cadences[].checklistTemplateIdstring (uuid) | nulloptional
data.cadences[].cadenceOverrideNotestring | nulloptional
data.cadences[].createdAtstring (date-time)optional
data.cadences[].updatedAtstring (date-time)optional
data.overduearray<any>optional
data.dueSoonarray<object>optional
data.dueSoon[].idstring (uuid)optional
data.dueSoon[].drillTypestringoptionalDrillType enum, e.g. fire, abandon_ship, man_overboard, lifeboat_launch, steering_gear_test.
data.dueSoon[].frequencystringoptionalRecurringFrequency enum, e.g. monthly, quarterly, annually.
data.dueSoon[].isActivebooleanoptional
data.dueSoon[].lastCompletedAtstring (date-time) | nulloptional
data.dueSoon[].nextDueAtstring (date-time) | nulloptional
data.dueSoon[].alertDaysBeforeDueintegeroptional
data.dueSoon[].checklistTemplateIdstring (uuid) | nulloptional
data.dueSoon[].cadenceOverrideNotestring | nulloptional
data.dueSoon[].createdAtstring (date-time)optional
data.dueSoon[].updatedAtstring (date-time)optional
GET/compliance/vessel/{vesselId}/ptw

List a vessel's permits to work

Supports `?cursor=` pagination. Returns a trimmed summary projection (not every `PermitToWork` column) — see `Permit` schema.

Path parameters
NameInTypeRequiredDescription
vesselIdpathstring (uuid)required
Query parameters
NameInTypeRequiredDescription
cursorquerystringoptionalOpaque pagination cursor from a previous response's `pagination.cursor`. Omit this param entirely for the first page of cursor mode; pass `cursor=` (empty) is also accepted as "start from the beginning in cursor mode." Omitting `cursor` altogether (not even as an empty string) falls back to legacy `?page=` semantics on endpoints that still support it.
limitqueryintegeroptional
Response
FieldTypeRequiredDescription
dataarray<object>required
data[].idstring (uuid)optional
data[].permitTypestringoptionalPtwType enum: hot_work, enclosed_space, working_aloft, working_overside, diving.
data[].titlestringoptional
data[].statusstringoptionalPtwStatus enum: pending_approval, issued, active, suspended, closed, cancelled.
data[].issuedAtstring (date-time)optional
data[].validFromstring (date-time)optional
data[].validUntilstring (date-time)optional
data[].checklistInstanceIdstring (uuid) | nulloptional
data[].holderNamestring | nulloptional
data[].issuerNamestring | nulloptional
data[].isExpiredbooleanoptional
paginationobjectoptionalCanonical cursor-pagination block. On endpoints not yet retrofitted for true cursor support, `cursor` is a best-effort display-only value (not decodable, no `?cursor=` branch accepts it back) — see each endpoint's description for whether it has full cursor support.
pagination.cursorstring | nulloptionalOpaque token for the next page, or `null` when `hasMore` is `false`.
pagination.limitintegerrequired
pagination.hasMorebooleanrequired
pagination.totalintegerrequiredTotal row count matching the filter (not just this page).
GET/compliance/vessel/{vesselId}/regulatory-records

List a vessel's MARPOL regulatory record entries

ORB Annex I (oily-water), GRB Annex V (garbage), and BWM (ballast water) log entries. Supports `?cursor=` pagination — cursor mode always sorts `(createdAt DESC, id DESC)`, NOT `operationDate` (the default page-mode sort field), because `operationDate` isn't guaranteed unique/monotonic.

Path parameters
NameInTypeRequiredDescription
vesselIdpathstring (uuid)required
Query parameters
NameInTypeRequiredDescription
cursorquerystringoptionalOpaque pagination cursor from a previous response's `pagination.cursor`. Omit this param entirely for the first page of cursor mode; pass `cursor=` (empty) is also accepted as "start from the beginning in cursor mode." Omitting `cursor` altogether (not even as an empty string) falls back to legacy `?page=` semantics on endpoints that still support it.
limitqueryintegeroptional
Response
FieldTypeRequiredDescription
dataarray<object>required
data[].idstring (uuid)optional
data[].vesselIdstring (uuid)optional
data[].entryTypeenum(orb_annex_i | grb_annex_v | bwm_record)optional
data[].operationDatestring (date-time)optional
data[].operationTimestring | nulloptional"HH:MM" UTC.
data[].positionLatstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].positionLonstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].positionTextstring | nulloptional
data[].officerUserIdstring (uuid) | nulloptional
data[].officerobject | nulloptional
data[].officer.idstring (uuid)optional
data[].officer.firstNamestring | nulloptional
data[].officer.lastNamestring | nulloptional
data[].officer.emailstring | nulloptional
data[].officer.phonestring | nulloptional
data[].officer.profilePhotostring | nulloptional
data[].signatureUrlstring | nulloptional
data[].operationCodestring | nulloptionalORB Annex I code A-H.
data[].operationDescriptionstring | nulloptional
data[].quantityLitresstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].disposalMethodstring | nulloptional
data[].retentionTankIdstring | nulloptional
data[].grbCategorystring | nulloptionalGRB Annex V category A-H.
data[].grbDisposalLocationstring | nulloptional
data[].grbMassKgstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].bwmOperationTypestring | nulloptional
data[].bwmSourceWaterstring | nulloptional
data[].bwmTreatmentSystemstring | nulloptional
data[].bwmVolumeM3string | nulloptionalSerialized as string to preserve Decimal precision.
data[].receiptUrlstring | nulloptional
data[].createdAtstring (date-time)optional
data[].updatedAtstring (date-time)optional
paginationobjectoptionalCanonical cursor-pagination block. On endpoints not yet retrofitted for true cursor support, `cursor` is a best-effort display-only value (not decodable, no `?cursor=` branch accepts it back) — see each endpoint's description for whether it has full cursor support.
pagination.cursorstring | nulloptionalOpaque token for the next page, or `null` when `hasMore` is `false`.
pagination.limitintegerrequired
pagination.hasMorebooleanrequired
pagination.totalintegerrequiredTotal row count matching the filter (not just this page).