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

ParameterTypeNotes
search2–100 charsTerm-prefix match on name
sortname, updatedAtDefault name
orderasc, descDefault asc
limit, offsetintegerlimit max 100, default 20

Response

JSON
{
  "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:

FieldTypeNotes
descriptionstring | nullPlain text
boatCountnumberPublished 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 manufacturer404 NOT_FOUND200 with data: []
Scopes requiredmanufacturers.read + boats.readboats.read
Cost on our sideTwo lookupsOne

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.