Expenses

Vessel operating expenses.

POST/expenses

Create an expense

Requires `vesselId`, `date` (not in the future), and `amount`. `fundingSource: apa` requires `charterBookingId`.

Request body
FieldTypeRequiredDescription
vesselIdstring (uuid)required—
categoryenum(fuel | maintenance | insurance | dockage | registration | crew | provisions | equipment | upgrades | cleaning | electronics | safety | navigation | communication | entertainment | crew_gratuity | crew_food | commission | delivery | marketing | food | beverages | excursions | permits | laundry | watersports | other)optional—
descriptionstringoptional—
amountstringrequiredSerialized as string to preserve Decimal precision.
currencystringoptional—
datestring (date)requiredMust not be in the future.
vendorstringoptional—
charterBookingIdstring (uuid)optional—
fundingSourceenum(owner | charter | apa)optional`apa` requires `charterBookingId`.
notesstringoptional—
tagsarray<string>optional—
Response
FieldTypeRequiredDescription
dataobjectrequired—
data.idstring (uuid)optional—
data.vesselIdstring (uuid) | nulloptional—
data.categorystringoptionalExpenseCategory enum, e.g. fuel, maintenance, insurance, dockage, provisions, crew.
data.subcategorystring | nulloptional—
data.descriptionstringoptional—
data.amountstringoptionalSerialized as string to preserve Decimal precision.
data.currencystringoptional—
data.datestring (date)optional—
data.vendorstring | nulloptional—
data.receiptUrlstring | nulloptional—
data.maintenanceIdstring (uuid) | nulloptional—
data.equipmentIdstring (uuid) | nulloptional—
data.notesstring | nulloptional—
data.tagsarray<string>optional—
data.recurringbooleanoptional—
data.recurringPeriodstring | nulloptional—
data.charterBookingIdstring (uuid) | nulloptional—
data.charterBookingobject | nulloptional—
data.charterBooking.idstring (uuid)optional—
data.charterBooking.bookingReferencestringoptional—
data.fundingSourceenum(owner | charter | apa)optional—
data.costCenterstring | nulloptional—
data.quantitystring | nulloptionalSerialized as string to preserve Decimal precision.
data.unitstring | nulloptional—
data.quantityUsedstring | nulloptionalSerialized as string to preserve Decimal precision.
data.estimatedCoststring | nulloptionalSerialized as string to preserve Decimal precision.
data.provisionStatusstring | nulloptional—
data.tipstring | nulloptionalSerialized as string to preserve Decimal precision.
data.hasLineItemsbooleanoptional—
data.lineItemCountintegeroptional—
data.reimbursementStatusstring | nulloptional—
data.isArchivedbooleanoptional—
data.createdAtstring (date-time)optional—
data.updatedAtstring (date-time)optional—
GET/expenses/{id}

Get an expense

Returns a single expense. Pass `?include=lineItems,taxes` to inline OCR-extracted line items and taxes.

Path parameters
NameInTypeRequiredDescription
idpathstring (uuid)required—
Query parameters
NameInTypeRequiredDescription
includequerystringoptionalComma-separated related collections to inline — supports `lineItems`, `taxes`.
Response
FieldTypeRequiredDescription
dataanyrequired—
PATCH/expenses/{id}

Update an expense

Partial update — any writable `Expense` field.

Path parameters
NameInTypeRequiredDescription
idpathstring (uuid)required—
Request body
FieldTypeRequiredDescription
categorystringoptional—
descriptionstringoptional—
amountstringoptionalSerialized as string to preserve Decimal precision.
currencystringoptional—
datestring (date)optional—
vendorstring | nulloptional—
notesstring | nulloptional—
Response
FieldTypeRequiredDescription
dataobjectrequired—
data.idstring (uuid)optional—
data.vesselIdstring (uuid) | nulloptional—
data.categorystringoptionalExpenseCategory enum, e.g. fuel, maintenance, insurance, dockage, provisions, crew.
data.subcategorystring | nulloptional—
data.descriptionstringoptional—
data.amountstringoptionalSerialized as string to preserve Decimal precision.
data.currencystringoptional—
data.datestring (date)optional—
data.vendorstring | nulloptional—
data.receiptUrlstring | nulloptional—
data.maintenanceIdstring (uuid) | nulloptional—
data.equipmentIdstring (uuid) | nulloptional—
data.notesstring | nulloptional—
data.tagsarray<string>optional—
data.recurringbooleanoptional—
data.recurringPeriodstring | nulloptional—
data.charterBookingIdstring (uuid) | nulloptional—
data.charterBookingobject | nulloptional—
data.charterBooking.idstring (uuid)optional—
data.charterBooking.bookingReferencestringoptional—
data.fundingSourceenum(owner | charter | apa)optional—
data.costCenterstring | nulloptional—
data.quantitystring | nulloptionalSerialized as string to preserve Decimal precision.
data.unitstring | nulloptional—
data.quantityUsedstring | nulloptionalSerialized as string to preserve Decimal precision.
data.estimatedCoststring | nulloptionalSerialized as string to preserve Decimal precision.
data.provisionStatusstring | nulloptional—
data.tipstring | nulloptionalSerialized as string to preserve Decimal precision.
data.hasLineItemsbooleanoptional—
data.lineItemCountintegeroptional—
data.reimbursementStatusstring | nulloptional—
data.isArchivedbooleanoptional—
data.createdAtstring (date-time)optional—
data.updatedAtstring (date-time)optional—
GET/expenses/vessel/{vesselId}

List a vessel's expenses

Supports `?cursor=` pagination on the non-search path only — `?search=` runs a bounded hybrid vector+ILIKE query and does not support cursor. The aggregate `totalAmount` (USD-normalized) is returned via `meta.totalAmount`, not as a top-level field.

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) | nulloptional—
data[].categorystringoptionalExpenseCategory enum, e.g. fuel, maintenance, insurance, dockage, provisions, crew.
data[].subcategorystring | nulloptional—
data[].descriptionstringoptional—
data[].amountstringoptionalSerialized as string to preserve Decimal precision.
data[].currencystringoptional—
data[].datestring (date)optional—
data[].vendorstring | nulloptional—
data[].receiptUrlstring | nulloptional—
data[].maintenanceIdstring (uuid) | nulloptional—
data[].equipmentIdstring (uuid) | nulloptional—
data[].notesstring | nulloptional—
data[].tagsarray<string>optional—
data[].recurringbooleanoptional—
data[].recurringPeriodstring | nulloptional—
data[].charterBookingIdstring (uuid) | nulloptional—
data[].charterBookingobject | nulloptional—
data[].charterBooking.idstring (uuid)optional—
data[].charterBooking.bookingReferencestringoptional—
data[].fundingSourceenum(owner | charter | apa)optional—
data[].costCenterstring | nulloptional—
data[].quantitystring | nulloptionalSerialized as string to preserve Decimal precision.
data[].unitstring | nulloptional—
data[].quantityUsedstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].estimatedCoststring | nulloptionalSerialized as string to preserve Decimal precision.
data[].provisionStatusstring | nulloptional—
data[].tipstring | nulloptionalSerialized as string to preserve Decimal precision.
data[].hasLineItemsbooleanoptional—
data[].lineItemCountintegeroptional—
data[].reimbursementStatusstring | nulloptional—
data[].isArchivedbooleanoptional—
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).
metaobjectoptionalEndpoint-specific extra fields promoted out of the top level by envelope normalization (e.g. `totalAmount`, `planContext`, `hasApproximations`).