Vessels

Vessel records the caller's API key can see (owned or team-member access).

GET/vessels

List vessels

Returns every vessel the API key's creator-user owns or has team-member access to. Deliberately a **bare array of `Vessel` objects wrapped only by the envelope** (`{ data: Vessel[] }`) — there is no `pagination` block on this endpoint (see "Known gaps" in `docs/api.md`: the multi-vessel downgrade-lock annotation needs the full owned-vessel set to compute `isLocked`/`lockReason` correctly, so this endpoint isn't cursor-paginated). Owned vessels beyond the caller's plan's vessel limit are annotated with `isLocked: true` rather than omitted.

Response
FieldTypeRequiredDescription
dataarray<object>required—
data[].idstring (uuid)optional—
data[].ownerIdstring (uuid)optional—
data[].vesselNamestringoptional—
data[].makestring | nulloptional—
data[].modelstring | nulloptional—
data[].yearinteger | nulloptional—
data[].hullNumberstring | nulloptional—
data[].vesselTypestring | nulloptionalVesselType enum, e.g. motor_yacht, sailing_yacht, catamaran.
data[].statusstringoptionalVesselStatus enum, e.g. in_service, laid_up, in_refit.
data[].engineTypestring | nulloptional—
data[].engineCountinteger | nulloptional—
data[].homePortstring | nulloptional—
data[].homePortLatnumber | nulloptional—
data[].homePortLonnumber | nulloptional—
data[].homePortResolvedstring | nulloptional—
data[].homePortNeedsReviewbooleanoptional—
data[].lengthnumber | nulloptional—
data[].beamnumber | nulloptional—
data[].draftnumber | nulloptional—
data[].airDraftnumber | nulloptional—
data[].loaTotalnumber | nulloptional—
data[].displacementinteger | nulloptional—
data[].grossTonnageinteger | nulloptional—
data[].fuelCapacityinteger | nulloptional—
data[].waterCapacityinteger | nulloptional—
data[].maxAccommodationinteger | nulloptional—
data[].maxRangeinteger | nulloptional—
data[].cruisingSpeednumber | nulloptional—
data[].imoNumberstring | nulloptional—
data[].mmsistring | nulloptional—
data[].callSignstring | nulloptional—
data[].flagStatestring | nulloptional—
data[].complianceProfilestring | nulloptional—
data[].multiCurrencyEnabledbooleanoptional—
data[].defaultCurrencystringoptional—
data[].photostring | nulloptional—
data[].dataConsistencyWarningsarray<object> | nulloptional—
data[].ownerobjectoptional—
data[].owner.idstring (uuid)optional—
data[].owner.firstNamestring | nulloptional—
data[].owner.lastNamestring | nulloptional—
data[].owner.emailstring | nulloptional—
data[].owner.phonestring | nulloptional—
data[].owner.profilePhotostring | nulloptional—
data[].captainobject | nulloptional—
data[].captain.idstring (uuid)optional—
data[].captain.firstNamestring | nulloptional—
data[].captain.lastNamestring | nulloptional—
data[].captain.emailstring | nulloptional—
data[].captain.phonestring | nulloptional—
data[].captain.profilePhotostring | nulloptional—
data[].permissionsobjectoptionalPer-feature read/full permission map computed for the impersonated user.
data[].isLockedbooleanoptionalPresent only when this owned vessel is over the caller's plan's vessel-count limit.
data[].lockReasonstringoptional—
data[].createdAtstring (date-time)optional—
data[].updatedAtstring (date-time)optional—
cURL
curl -sS "https://api.owlmar.com/v1/vessels" \
-H "Authorization: Bearer $OWLMAR_API_KEY"
GET/vessels/{id}

Get a vessel

Returns a single vessel with its captain, permissions, and (unlike the list endpoint) the most recent equipment, maintenance events, documents, and trip logs nested inline (each capped at the most recent 10 rows — use the dedicated list endpoints for full history). 404 if the vessel doesn't exist or the caller has no access.

Path parameters
NameInTypeRequiredDescription
idpathstring (uuid)required—
Response
FieldTypeRequiredDescription
dataanyrequiredGET /vessels/{id} — Vessel plus the 10 most recent nested equipment/maintenance/documents/trips and full inventory.
cURL
curl -sS "https://api.owlmar.com/v1/vessels/$VESSEL_ID" \
-H "Authorization: Bearer $OWLMAR_API_KEY"