Manufacturers
Three endpoints. The first two require manufacturers.read; the third requires both
manufacturers.read and boats.read.
GET /v1/manufacturers
Returns a page of manufacturer summaries.
curl -s "https://api.theboatdb.com/v1/manufacturers?search=albin" \
-H "Authorization: Bearer $THEBOATDB_API_KEY"Query parameters
| Parameter | Type | Notes |
|---|---|---|
search | 2–100 chars | Term-prefix match on name |
sort | name, updatedAt | Default name |
order | asc, desc | Default asc |
limit, offset | integer | limit max 100, default 20 |
Response
{
"data": [
{
"id": "mfr-71b0",
"slug": "albin-marine",
"name": "Albin Marine",
"website": "https://example.com",
"logo": {
"url": "https://cdn.sanity.io/images/...",
"alt": null,
"width": 512,
"height": 512,
"format": "png"
},
"updatedAt": "2026-01-08T11:04:55Z"
}
],
"pagination": { "total": 214, "limit": 20, "offset": 0 }
}There is no country or region filter, and no country or founded-year field in the response.
Our manufacturer records do not carry that data, so ?country=fr is a 400 rather than a request
that quietly returns every manufacturer. We would rather reject it than publish a field that is
permanently null — adding one later is safe, retracting one is not.
sort=boatCount is also rejected: ordering by it would mean counting every manufacturer's boats on
every request.
GET /v1/manufacturers/:idOrSlug
Returns one manufacturer, addressable by slug or id.
curl -s "https://api.theboatdb.com/v1/manufacturers/albin-marine" \
-H "Authorization: Bearer $THEBOATDB_API_KEY"The summary fields above, plus:
| Field | Type | Notes |
|---|---|---|
description | string | null | Plain text |
boatCount | number | Published boats attributed to this manufacturer |
Takes no query parameters. An unknown or unpublished manufacturer is a 404 NOT_FOUND.
boatCount is there so you can decide whether a second request is worth making, and how many pages
it will take, without us embedding a sample of boats in every manufacturer response. A manufacturer
with boatCount: 0 needs no follow-up request at all.
GET /v1/manufacturers/:idOrSlug/boats
That manufacturer's boats — the same response shape, filters and sorts as
GET /v1/boats, minus manufacturer (the path already names it, so passing it
is a 400).
curl -s "https://api.theboatdb.com/v1/manufacturers/albin-marine/boats?sort=year&order=desc" \
-H "Authorization: Bearer $THEBOATDB_API_KEY"Rows are produced by the same mapper /v1/boats uses, so a boat is byte-identical whichever
endpoint returned it.
Choosing between this and ?manufacturer=
Both get you a manufacturer's boats. They differ in one way that matters:
/v1/manufacturers/:slug/boats | /v1/boats?manufacturer=slug | |
|---|---|---|
| Unknown manufacturer | 404 NOT_FOUND | 200 with data: [] |
| Scopes required | manufacturers.read + boats.read | boats.read |
| Cost on our side | Two lookups | One |
Use the nested path when you are acting on user input and need "no such manufacturer" to be distinguishable from "this manufacturer has no boats". Use the query parameter when you already know the slug is good — it is the cheaper path, and the one to reach for in a bulk sync.