1 Authentication
Send your API key as a bearer token on every request. Keys are issued per account — the secret is shown once at creation and looks like mk_live_… (or mk_test_… for the test environment).
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/boat/models?q=nimbus"
You can also pass the key as an X-API-Key header. Requests without a valid key return 401. Resources are referenced only by uid — chain make → series → model with make_uid, series_uid and uid.
2 Plans & tiers
The depth of fields returned scales with your plan's data tier. Every list response reports the tier it was served at.
free
Identity & classification — name, make, series, category, length overall, production years, image.
standard
The full specification sheet — beam, draft, capacities, power, rig/keel, cylinders/displacement & the long-tail specs object.
premium
Everything, including data provenance (source, source_url) for auditing & attribution.
See current pricing and request access on the API access page.
3 Rate limits & quotas
Each plan has a per-minute rate limit, a monthly request quota and a monthly token budget. Every response carries the relevant counters as headers:
| Header | Meaning |
|---|
X-RateLimit-Limit / -Remaining / -Reset | Per-minute window: cap, calls left, seconds until reset. |
X-Quota-Limit / -Remaining | Monthly request quota (omitted when unlimited). |
X-Token-Cost / -Limit / -Used / -Remaining | Weighted token budget; premium responses cost 2×. |
Exceeding the per-minute limit or monthly request quota returns 429 (with Retry-After on rate limits). Exhausting the monthly token budget returns 402.
4 Errors
Errors are JSON with a stable code and a human message.
{
"code": "quota_exceeded",
"message": "Monthly quota (50000) exhausted."
}
| Status | Meaning |
|---|
400 | Missing or invalid parameter. |
401 | Missing, invalid, expired or revoked key. |
403 | Account suspended, or key lacks the required scope. |
404 | No such resource. |
429 | Per-minute rate limit or monthly quota exceeded. |
402 | Monthly token budget exhausted. |
5 Boats
GET /boat/makes
List boat manufacturers
Query parameters
| Name | Type | Req. | Description |
|---|
q | string | no | Free-text filter on manufacturer name. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/boat/makes?q=nimbus"
Response · 200
{
"makes": [
{ "uid": "01J7…", "name": "Nimbus", "country": "SE", "is_popular": true }
]
}
GET /boat/series
List boat series
Query parameters
| Name | Type | Req. | Description |
|---|
make_uid | string | no | Restrict to one manufacturer (its uid). |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/boat/series?make_uid=01J7…"
Response · 200
{
"series": [
{ "uid": "01J7…", "name": "T-serien", "boat_category": "motorboat", "year_from": 2014 }
]
}
GET /boat/models
Search boat models
Query parameters
| Name | Type | Req. | Description |
|---|
make_uid | string | no | Filter by manufacturer uid. |
series_uid | string | no | Filter by series uid. |
q | string | no | Free-text across model, series and make. |
boat_category | string | no | sailboat · motorboat · rib · inflatable · pwc · dinghy · canoe_kayak · houseboat · tender · other |
propulsion_class | string | no | sail · power · oar_paddle · hybrid |
design_category | string | no | CE design category A–D. |
in_production | boolean | no | true = current models only, false = discontinued only. |
loa_min | number | no | Minimum length overall, metres. |
loa_max | number | no | Maximum length overall, metres. |
year_from | integer | no | Earliest production year. |
year_to | integer | no | Latest production year. |
limit | integer | no | 1–200, default 50. |
offset | integer | no | Pagination offset, default 0. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/boat/models?q=t11"
Response · 200
{
"models": [
{
"uid": "01J7…",
"manufacturer": "Nimbus",
"series": "T-serien",
"name": "T11",
"boat_category": "motorboat",
"design_category": "B",
"loa_m": 11.28,
"year_from": 2018,
"is_in_production": true
}
],
"total": 1,
"limit": 50,
"offset": 0,
"has_more": false,
"tier": "free",
"visibility": "published"
}
GET /boat/model
Get one boat model
Query parameters
| Name | Type | Req. | Description |
|---|
uid | string | yes | The model uid (from a list response). |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/boat/model?uid=01J7…"
Response · 200
{
"uid": "01J7…",
"manufacturer": "Nimbus",
"series": "T-serien",
"name": "T11",
"boat_category": "motorboat",
"loa_m": 11.28,
"beam_m": 3.47,
"draft_max_m": 0.95,
"max_persons": 12,
"berths": 4,
"cabins": 2,
"fuel_capacity_l": 730,
"power_max_hp": 800,
"specs": { }
}
GET /hin/decode
Decode a Hull Identification Number
Query parameters
| Name | Type | Req. | Description |
|---|
hin | string | yes | The HIN to decode. |
domain | string | no | boat (default) or engine. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/hin/decode?hin=SE-ABC12345D404"
Response · 200
{
"decoded": { "valid": true, "errors": [] },
"tier": "free"
}
6 Engines
GET /engine/makes
List engine manufacturers
Query parameters
| Name | Type | Req. | Description |
|---|
q | string | no | Free-text filter on manufacturer name. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/engine/makes?q=volvo"
Response · 200
{
"makes": [
{ "uid": "01J7…", "name": "Nimbus", "country": "SE", "is_popular": true }
]
}
GET /engine/series
List engine series
Query parameters
| Name | Type | Req. | Description |
|---|
make_uid | string | no | Restrict to one manufacturer (its uid). |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/engine/series?make_uid=01J7…"
Response · 200
{
"series": [
{ "uid": "01J7…", "name": "T-serien", "boat_category": "motorboat", "year_from": 2014 }
]
}
GET /engine/models
Search engine models
Query parameters
| Name | Type | Req. | Description |
|---|
make_uid | string | no | Filter by manufacturer uid. |
q | string | no | Free-text across model, series and make. |
engine_category | string | no | propulsion · auxiliary · generator · bow_thruster · trolling |
drive_type | string | no | outboard · inboard · sterndrive · jet · saildrive · electric_pod |
fuel_type | string | no | petrol · diesel · electric · hybrid · lpg · none · other |
is_electric | boolean | no | Restrict to electric engines. |
power_min | integer | no | Minimum power, hp. |
power_max | integer | no | Maximum power, hp. |
year_from | integer | no | Earliest production year. |
limit | integer | no | 1–200, default 50. |
offset | integer | no | Pagination offset, default 0. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/engine/models?q=d2-40"
Response · 200
{
"models": [
{
"uid": "01J7…",
"manufacturer": "Volvo Penta",
"series": "D-serien",
"name": "D2-40",
"engine_category": "propulsion",
"fuel_type": "diesel",
"drive_type": "inboard",
"power_hp": 40,
"year_from": 2005
}
],
"total": 1,
"limit": 50,
"offset": 0,
"has_more": false,
"tier": "free",
"visibility": "published"
}
GET /engine/model
Get one engine model
Query parameters
| Name | Type | Req. | Description |
|---|
uid | string | yes | The model uid (from a list response). |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/engine/model?uid=01J7…"
Response · 200
{
"uid": "01J7…",
"manufacturer": "Volvo Penta",
"name": "D2-40",
"engine_category": "propulsion",
"fuel_type": "diesel",
"drive_type": "inboard",
"power_hp": 40,
"power_kw": 29,
"cylinders": 3,
"displacement_cc": 1130,
"rpm_max": 3600,
"weight_kg": 168
}
7 Account
GET /me
Inspect your key, plan, tier and remaining quota
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/me"
Response · 200
{
"account": { "uid": "01J7…", "name": "Acme Marine", "status": "active" },
"plan": { "name": "Standard", "slug": "standard", "data_tier": "standard" },
"tier": "standard",
"rate": { "limit": 120, "remaining": 119, "reset_seconds": 42 },
"quota": { "limit": 50000, "used": 12, "remaining": 49988 }
}
8 Change feed
GET /events
Poll catalogue changes since a cursor — requires the "events" scope
Query parameters
| Name | Type | Req. | Description |
|---|
since | integer | no | Return events with id greater than this cursor. Default 0. |
limit | integer | no | 1–500, default 100. |
Request
curl -H "Authorization: Bearer mk_live_xxxxxxxx" \
"https://smabatsregistret.se/wp-json/marine-catalog/v1/events?since=4800"
Response · 200
{
"events": [
{
"id": 4821,
"uid": "01J7…",
"entity_type": "boat_model",
"entity_uid": "01J7…",
"event": "updated",
"created_at": "2026-09-08T10:15:00Z"
}
],
"cursor": 4821,
"has_more": false
}