Seed-Key API v1

Programmatic access to the Seed â†’ Key calculator. Access is granted per account and shares the daily limit and validity window of that account's Seed-Key subscription. The daily counter resets at 00:00 UTC.

1. Authentication

Every request carries your API key in a header — either form works:

Authorization: Bearer mbseed_0f1e2d3c4b5a69788796a5b4c3d2e1f00f1e2d3c4b5a6978
X-API-Key: mbseed_0f1e2d3c4b5a69788796a5b4c3d2e1f00f1e2d3c4b5a6978
  • The key is shown once when it is created. Store it securely; it cannot be recovered.
  • One active key per account. Generating a new key immediately revokes the previous one.
  • A single key type — it can call every endpoint. Use /benchmark to test latency without spending quota (it needs an active subscription and is limited to 10 requests per minute per key).
  • Repeated requests with a missing or unknown key are blocked: 20 such 401 responses within 5 minutes from one IP ban that IP for all sites of this service. Check that your client sends the key correctly before running a loop.
  • A key may be locked to a list of allowed IP addresses. Requests from any other address get 403 ip_not_allowed.
  • HTTPS only. Send Content-Type: application/json on every request — including GET /catalog and GET /benchmark that carry no body; some requests are rejected without it.

2. Base URL & endpoints

https://mb-solution.org/api/v1/seed/{endpoint}
EndpointMethodPurposeMetered
/quotaGETCurrent access window and daily usageno
/catalogGET / POSTECU catalog + current catalog versionno
/calculatePOSTCalculate a key for a seedyes — 1 per success
/benchmarkGET / POSTRound-trip latency probe (returns an all-zero key); needs an active subscription, 10/minno

3. Response headers

HeaderMeaning
X-Request-IdUnique id for the request — quote it in support tickets.
X-Seed-Quota-LimitDaily calculation limit for the account.
X-Seed-Quota-RemainingCalculations left until 00:00 UTC.
X-Seed-Quota-ResetUnix timestamp of the next quota reset.
Retry-AfterOn 429 — seconds to wait before retrying.

4. GET /quota

GEThttps://mb-solution.org/api/v1/seed/quota

curl -s https://mb-solution.org/api/v1/seed/quota \
  -H "Authorization: Bearer $MBSEED_KEY" \
  -H "Content-Type: application/json"
{
  "ok": true,
  "allowed": true,
  "code": "ok",
  "quota": {
    "dailyLimit": 200,
    "used": 4,
    "remaining": 196,
    "accessUntil": "2026-12-31T20:00:00Z",
    "resetAt": "2026-09-05T00:00:00Z"
  },
  "requestId": "req_1a2b3c4d5e6f7a8b90"
}

5. GET /catalog

GEThttps://mb-solution.org/api/v1/seed/catalog

Returns every supported ECU algorithm plus a version hash for the whole catalog. Pass your last known hash as knownVersion to get {"unchanged": true} with no items when nothing has changed.

curl -s https://mb-solution.org/api/v1/seed/catalog \
  -H "Authorization: Bearer $MBSEED_KEY" \
  -H "Content-Type: application/json"

# conditional:
curl -s -X POST https://mb-solution.org/api/v1/seed/catalog \
  -H "Authorization: Bearer $MBSEED_KEY" \
  -H "Content-Type: application/json" \
  -d '{"knownVersion":"<64-hex>"}'
{
  "ok": true,
  "schemaVersion": 1,
  "version": "9c1f...<64-hex>",
  "count": 4445,
  "unchanged": false,
  "items": [
    {
      "definitionId": "3f8a...<64-hex>",
      "ecuName": "IC_204",
      "accessLevel": 1,
      "seedLength": 8,
      "keyLength": 8,
      "software": "1979021500",
      "SelectorMatch": null
    }
  ],
  "requestId": "req_…"
}
Item fieldMeaning
definitionIdOpaque 64-hex id. Stable, but can be absent for rows served from the file fallback — prefer matching on ECU facts.
ecuNameECU / control-unit name.
accessLevelAccess level (integer).
seedLength / keyLengthByte lengths of the seed and the resulting key.
softwareSoftware identifier, for example 1979021500 or IC907_Low_SW1_9079020707; null when absent. Calculate accepts the full value or its firmware number.
SelectorMatchSelector expression, for example ActiveDiagnosticInformation_Read.Identification=8700,8600; null when absent. The comma separates alternative identification codes.

Identify the algorithm by ecuName, accessLevel, seedLength, keyLength and software (full value or firmware number). For SelectorMatch, send the single identification code read from the ECU, not the catalog expression.

6. POST /calculate

POSThttps://mb-solution.org/api/v1/seed/calculate

Calculate a key by ECU facts: send the ECU name, access level, seed/key lengths, optional software and identification code, and the seed.

Request fields

FieldRequiredDescription
ecuNameyes1–64 printable ASCII, from /catalog (upper-cased server-side).
accessLevelyesInteger 0–1024.
seedLengthyes1–512; must equal the byte length of seed.
keyLengthyes1–512.
seedyesHex string (even length, ≤ 512 chars). Spaces, -, : are stripped.
softwarenoFull catalog string or firmware number, for example "IC222_SW2_2059021304", "2059021304" or "000A". String of 1–255 characters without control characters. Omit, send null or an empty string to match rows without software.
SelectorMatchnoOne 4-character hex code as a string, for example "8700" or "8600". Case-insensitive; preserve leading zeros. No prefix or comma-separated list. selectorMatch is also accepted. Omit, send null or an empty string for the default selection.
catalogVersionnoThe catalog version you built against — 409 catalog_outdated on mismatch.

Software matching ignores ASCII letter case and preserves leading zeros. A complete value match takes priority. Otherwise, a short hexadecimal or decimal firmware number matches the entire token immediately after SW_, SW0_, SW1_, SW2_, etc.; partial substrings do not match. Selector selection then runs within the software matches. The response contains the full stored software value.

If several rows share the same facts the response returns the primary one with candidates > 1 — contact support if you hit an ambiguous ECU.

curl -s -X POST https://mb-solution.org/api/v1/seed/calculate \
  -H "Authorization: Bearer $MBSEED_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ecuName":"IC_204","accessLevel":1,"seedLength":8,"keyLength":8,
       "software":"1979021500","seed":"A1B2C3D4A1B2C3D4"}'

When SelectorMatch is supplied, a row containing that code takes priority. For Identification=8700,8600, either "8700" or "8600" selects that row. If no code matches, a row with an empty selector is used. If none exists, the row containing the lowest numeric HEX code is selected, considering every comma-separated code: 00FF is lower than 1000. All choices require the same ECU, level, lengths and software. The API returns 404 definition_not_found only if no eligible row exists. Omitting the selector uses the default primary row.

Example request with an identification code (use ECU facts from your catalog row):

{
  "ecuName": "YOUR_ECU",
  "accessLevel": 17,
  "seedLength": 8,
  "keyLength": 8,
  "software": null,
  "SelectorMatch": "8700",
  "seed": "A1B2C3D4A1B2C3D4"
}

Response

{
  "ok": true,
  "schemaVersion": 1,
  "catalogVersion": "9c1f...<64-hex>",
  "definitionId": "3f8a...<64-hex>",
  "ecuName": "IC_204",
  "accessLevel": 1,
  "seedLength": 8,
  "keyLength": 8,
  "software": "1979021500",
  "matchedBy": "groupPrimary",
  "candidates": 1,
  "key": "1122334455667788",
  "quota": { "dailyLimit": 200, "used": 5, "remaining": 195,
             "accessUntil": "2026-12-31T20:00:00Z", "resetAt": "2026-09-05T00:00:00Z" },
  "requestId": "req_…"
}

The daily counter is incremented only on a successful calculation. key is upper-case hex.

matchedBy is selector for an identification-code match, selectorFallback for an empty-selector row, selectorLowest for the lowest HEX code, or groupPrimary for the default selection.

7. GET /benchmark

GEThttps://mb-solution.org/api/v1/seed/benchmark

Runs the real database read path on the calculation server and returns an all-zero key, so you can measure end-to-end latency without spending quota. Requires an API key with an active Seed-Key subscription. Limit: 10 requests per minute per key; exceeding it returns 429 rate_limited with Retry-After.

FieldRequiredDescription
seednoAny valid hex; defaults to A5A5A5A5A5A5A5A5.
keyLengthno1–512; length of the returned zero key.
curl -s https://mb-solution.org/api/v1/seed/benchmark \
  -H "Authorization: Bearer $MBSEED_KEY" \
  -H "Content-Type: application/json"
{
  "ok": true,
  "matchedBy": "benchmark",
  "upstreamMs": 41.7,
  "catalogVersion": "9c1f...<64-hex>",
  "keyLength": 8,
  "key": "0000000000000000",
  "probe": { "ecuName": "IC_204", "accessLevel": 1, "seedLength": 8, "software": "1979021500" },
  "requestId": "req_…"
}

8. Errors

Every error has the shape:

{ "ok": false, "code": "invalid_seed", "error": "human-readable message", "requestId": "req_…" }
HTTPcodeMeaning
401missing_api_key / invalid_api_keyNo key, or malformed / unknown key.
403key_revoked / key_disabled / customer_disabledKey or account is not active.
403ip_not_allowedCaller IP is not in the key's allowed list.
403access_expired / no_accessSubscription ended / the account has no Seed-Key subscription.
403scope_missingThe key is not permitted for this endpoint.
429daily_limit_reachedDaily quota spent. Retry-After = seconds to 00:00 UTC.
429rate_limitedMore than 60 requests in a minute for this key (10 for /benchmark).
401missing_api_key / invalid_api_keyNo key, or a malformed / unknown key. Twenty of these from one IP within 5 minutes block the IP.
429upstream_rate_limitedThe calculation service is briefly saturated (a limit shared by all API clients). Retry shortly.
400invalid_json / invalid_seed / invalid_catalog_versionBad input.
400invalid_ecu_name / invalid_access_level / invalid_length / invalid_software / invalid_selector_matchBad ECU-facts field.
400seed_length_mismatchSeed byte length ≠ the algorithm's. Response includes expectedLength.
404definition_not_foundNo algorithm matches the given facts.
405method_not_allowedWrong HTTP method for the endpoint.
409catalog_outdatedReload /catalog; the response includes currentVersion.
502upstream_unavailable / upstream_auth_failedCalculation service unreachable or gateway misconfigured.
503service_unavailable / resolve_unavailable / benchmark_unavailableTemporary server-side / catalog-database problem — retry with backoff.

9. Limits & good practice

  • Daily quota is shared with the website Seed-Key page — both draw from the same bucket, resetting at 00:00 UTC.
  • Burst limit: 60 requests per minute per key (10 per minute for /benchmark). Respect Retry-After.
  • The calculation service also has a short shared budget across all API clients; a burst can yield 429 upstream_rate_limited — retry with a small backoff.
  • Cache /catalog; refresh it only on 409 catalog_outdated or on a schedule (e.g. daily). Match algorithms on ecuName + accessLevel + software + SelectorMatch + seedLength + keyLength.
  • Retry 502 / 503 / upstream_rate_limited with exponential backoff; do not retry other 4xx except 409 (after reloading the catalog).
  • Log the X-Request-Id of failed calls for support.
  • schemaVersion in every success body only increments on a breaking change (a field removed, renamed, or retyped); new fields may appear without a bump, so read fields by name.

Need a key or a higher limit? Contact support.