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—