Crew

STCW crew certifications.

GET/stcw/{vesselId}/certifications

List a vessel's STCW certifications

Supports `?cursor=` pagination. "Get one certification by ID" is not on the public surface — no such route exists internally (see `docs/api.md` "Known gaps").

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[].userIdstring (uuid)optional
data[].certTypestringoptional
data[].certNamestringoptional
data[].issuingAuthoritystring | nulloptional
data[].certNumberstring | nulloptional
data[].issuedDatestring (date-time) | nulloptional
data[].expiryDatestring (date-time) | nulloptional
data[].statusstringoptional
data[].notesstring | nulloptional
data[].userobjectoptional
data[].user.idstring (uuid)optional
data[].user.firstNamestring | nulloptional
data[].user.lastNamestring | nulloptional
data[].user.emailstring | nulloptional
data[].user.phonestring | nulloptional
data[].user.profilePhotostring | nulloptional
data[].documentobject | nulloptional
data[].document.idstring (uuid)optional
data[].document.titlestringoptional
data[].document.fileUrlstring | nulloptional
data[].document.fileSizeinteger | nulloptional
data[].document.mimeTypestring | nulloptional
data[].stcwDetailobject | nulloptional
data[].stcwDetail.idstring (uuid)optional
data[].stcwDetail.stcwCodestring | nulloptional
data[].stcwDetail.stcwRegulationstring | nulloptional
data[].stcwDetail.flagStatestring | nulloptional
data[].stcwDetail.endorsementNumberstring | nulloptional
data[].stcwDetail.endorsementExpirystring (date-time) | nulloptional
data[].stcwDetail.revalidationDatestring (date-time) | nulloptional
data[].stcwDetail.limitationsstring | 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).
GET/vessels/{id}/team

List a vessel's team

Returns the vessel's crew roster (owner + team members), plus `teamTier` (plan context — member count, pending invites, seat limit, allowed roles) and `planContext` (downgrade-lock accounting). Team members beyond the caller's plan's seat limit are annotated `isLocked: true`; roles outside the plan's role allowlist are annotated `isRoleLocked: true`. Not cursor-paginated — crew rosters are bounded lists, not growing logs (see `docs/api.md` "Known gaps").

Path parameters
NameInTypeRequiredDescription
idpathstring (uuid)required
Response
FieldTypeRequiredDescription
dataobjectrequired
data.membersarray<object>optional
data.members[].idstring (uuid)optional
data.members[].emailstringoptional
data.members[].firstNamestring | nulloptional
data.members[].lastNamestring | nulloptional
data.members[].profilePhotostring | nulloptional
data.members[].vesselRolestringoptionalVesselRole enum value, e.g. owner, co_owner, captain, crew, guest.
data.members[].permissionsarray<string>optional
data.members[].addedAtstring (date-time) | nulloptional
data.members[].isOwnerbooleanoptional
data.members[].isLockedbooleanoptional
data.members[].lockReasonstringoptional
data.members[].isRoleLockedbooleanoptional
data.members[].roleLockReasonstringoptional
data.teamTierobjectoptional
data.teamTier.tierstring | nulloptional
data.teamTier.memberCountintegeroptional
data.teamTier.pendingInvitesintegeroptional
data.teamTier.limitinteger | nulloptional
data.teamTier.allowedRolesarray<string> | nulloptional
data.planContextobjectoptional
data.planContext.planLimitinteger | nulloptional
data.planContext.totalMembersintegeroptional
data.planContext.overlimitbooleanoptional