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`).