The stable channel is what you want in production. The preview channel is how we ship breaking changes without breaking you.
Backwards-compatible. We never remove fields or change types. Additive only.
New shapes live here for 90 days before promotion. Pin with Boateros-Version.
Inventory of every hull: HIN, specs, photos, pricing, syndication state.
Jump to section →Buyer intent signals, consent captures, assignment, and lifecycle events.
Jump to section →Unified buyer and owner records. Phones, emails, addresses, vessels owned.
Jump to section →Offers, F&I structures, funding states, document packets.
Jump to section →RO lifecycle from estimate through parts, labor, and payment.
Jump to section →Published listings across Boat Trader, YachtWorld, and your own site.
Jump to section →Deposits, balances, refunds. Stripe-backed, idempotent, auditable.
Jump to section →Register endpoints, rotate signing secrets, replay missed events.
Jump to section →Authorization header, an Accept header, optional API version pin. The response carries the resource, a request ID for support, and rate-limit headers.
# Fetch a single hull by ID curl https://api.boater.os/v1/hulls/hull_YDV48219 \ -H "Authorization: Bearer $BOATEROS_KEY" \ -H "Accept: application/json" \ -H "Boateros-Version: 2026-04-01"
{
"id": "hull_YDV48219",
"hin": "GRT40912B324",
"make": "Grady-White",
"model": "Freedom 307",
"year": 2024,
"length_ft": 31.17,
"price_usd": 324900,
"status": "available",
"location_id": "loc_ftmyers",
"created_at": "2026-03-22T14:12:04Z"
} Every error returns the same shape: an HTTP status, a machine-readable code, a human message, and a request_id for when you need to talk to us.
List endpoints accept limit, starting_after, and ending_before. The response returns has_more and the next cursor. No offset math, no duplicate rows on insert, no skipped rows on delete.
{
"data": [ /* up to 50 hulls */ ],
"has_more": true,
"next_cursor": "hull_ZXK20441",
"prev_cursor": "hull_YDV48219"
} Every POST, PUT, and PATCH accepts an Idempotency-Key header. Send the same UUID on retry, get the same response back. Kept for 24 hours.
curl -X POST https://api.boater.os/v1/deals \ -H "Authorization: Bearer $BOATEROS_KEY" \ -H "Idempotency-Key: 7c4f1a0e-2d8b-4c3a-9f12-ab12e34d5f67" \ -H "Content-Type: application/json" \ -d '{"hull_id":"hull_YDV48219","buyer_id":"con_4412","offer_usd":298000}'
Email api@boater.os with a request ID. Reply within one business day.