Fleet
Multi-vessel financial aggregations across the caller's accessible fleet.
GET
/fleet/revenue-summaryFleet revenue/expense/fee summary for a calendar year
Aggregates charter revenue, expenses, and management fees (USD-normalized) across every vessel the caller's API key can access — no `vesselId` path/query param; scope is the key's full accessible fleet. `orgScope` narrowing is a structural no-op on this endpoint since there's no single vesselId to check against.
Query parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| year | query | integer | optional | Calendar year (UTC). Defaults to the current year. |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | object | required | — |
| data.year | integer | optional | — |
| data.vessels | array<object> | optional | — |
| data.vessels[].vesselId | string (uuid) | optional | — |
| data.vessels[].vesselName | string | optional | — |
| data.vessels[].revenue | number | optional | USD-normalized. |
| data.vessels[].expenses | number | optional | USD-normalized. |
| data.vessels[].fees | number | optional | USD-normalized. |
| data.vessels[].net | number | optional | — |
| data.totals | object | optional | — |
| data.totals.revenue | number | optional | — |
| data.totals.expenses | number | optional | — |
| data.totals.fees | number | optional | — |
| data.totals.net | number | optional | — |
cURL
curl -sS "https://api.owlmar.com/v1/fleet/revenue-summary?year=2026" \-H "Authorization: Bearer $OWLMAR_API_KEY"
Node (fetch)
const res = await fetch('https://api.owlmar.com/v1/fleet/revenue-summary?year=2026', {headers: { Authorization: `Bearer ${process.env.OWLMAR_API_KEY}` },});const { data } = await res.json();console.log(data.totals.net);
Python (requests)
resp = requests.get("https://api.owlmar.com/v1/fleet/revenue-summary",headers={"Authorization": f"Bearer {OWLMAR_API_KEY}"},params={"year": 2026},)summary = resp.json()["data"]
GET
/fleet/vessel-comparisonPer-vessel revenue/expense/budget comparison for a calendar year
Like `revenue-summary` but adds budget-vs-actual and can be narrowed to a single vessel via `?vesselId=` (still no path param — filtered server-side against the caller's accessible fleet). `hasApproximations: true` means at least one row lacked a captured exchange rate and fell back to a current-rate approximation.
Query parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| year | query | integer | optional | — |
| vesselId | query | string (uuid) | optional | Restrict to a single vessel (must be within the caller's accessible fleet). |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | object | required | — |
| data.year | integer | optional | — |
| data.vessels | array<object> | optional | — |
| data.vessels[].vesselId | string (uuid) | optional | — |
| data.vessels[].vesselName | string | optional | — |
| data.vessels[].revenue | number | optional | — |
| data.vessels[].expenses | number | optional | — |
| data.vessels[].net | number | optional | — |
| data.vessels[].budgeted | number | optional | — |
| data.vessels[].budgetVariance | number | optional | — |
| data.hasApproximations | boolean | optional | — |
