XUS Firmware API v1

Programmatic access to the firmware catalog and downloads. Access is granted per account and shares the daily limit and validity window of that account's XUS API 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 mbxus_0f1e2d3c4b5a69788796a5b4c3d2e1f00f1e2d3c4b5a6978
X-API-Key: mbxus_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 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 the GET ones that carry no body.

2. Base URL & endpoints

https://mbcare.ru/api/v1/xus/{endpoint}
EndpointMethodPurposeMetered
/listGET / POSTFirmware catalog (names) + total for change detectionno
/downloadGET / POSTResolve a firmware name to a time-limited download URLyes โ€” see ยง5

3. Response headers

HeaderMeaning
X-Request-IdUnique id for the request, on every response โ€” quote it in support tickets. It is also repeated in the body of error responses as requestId.
Retry-AfterOn 429 โ€” seconds to wait before retrying.

4. GET /list

GEThttps://mbcare.ru/api/v1/xus/list

Returns firmware names as a flat array of strings, plus total โ€” compare total to your last sync to tell whether the catalog changed without diffing the list. With no limit the whole catalog comes back in one response; use cursor to page.

FieldRequiredDescription
qnoSubstring filter on the name (โ‰ค 255 chars).
cursornoLast name from the previous page (exclusive). Keep calling with the previous nextCursor while hasMore is true.
limitnoMax rows to return. Omit for the full catalog.
curl -s "https://mbcare.ru/api/v1/xus/list?q=2239020042&limit=10" \
  -H "Authorization: Bearer $MBXUS_KEY" \
  -H "Content-Type: application/json"
{
  "ok": true,
  "total": 2,
  "count": 2,
  "hasMore": false,
  "nextCursor": null,
  "items": [ "2239020042_001-SMR-20260708_1212.zip", "2239020042_262509.bin" ]
}

5. GET /download

GEThttps://mbcare.ru/api/v1/xus/download

FieldRequiredDescription
nameyesExact firmware name, as returned by /list (โ‰ค 255 chars).
ttlnoDownload-link lifetime in seconds, 60โ€“604800. Default 86400 (24 hours).
curl -s "https://mbcare.ru/api/v1/xus/download?name=2239020042_001-SMR-20260708_1212.zip" \
  -H "Authorization: Bearer $MBXUS_KEY" \
  -H "Content-Type: application/json"
{
  "ok": true,
  "name": "2239020042_001-SMR-20260708_1212.zip",
  "downloadURL": "https://mbcare.ru/prod/symbolic/2239020042_001-SMR-20260708_1212.zip?โ€ฆ",
  "zipFileSize": 2492
}

downloadURL points at your own domain and is valid for ttl seconds (24 hours by default). Fetch it with a plain GET โ€” no API key needed on that URL โ€” and you receive the file. The upstream storage host is never exposed.

How the quota is charged

  • One file ยท one key ยท one UTC day. Issuing a /download link charges 1 against the daily limit.
  • Asking for the same file again the same day โ€” retry, resume, a fresh link โ€” does not count again.
  • /list never counts. Browsing the catalog is free.

6. Errors

Every error has the shape:

{ "ok": false, "code": "file_not_found", "error": "human-readable message", "requestId": "req_โ€ฆ" }
HTTPcodeMeaning
401missing_api_key / invalid_api_keyNo key, or malformed / unknown key.
403key_disabled / key_revoked / customer_disabledKey or account is not active.
403ip_not_allowedCaller IP is not in the key's allowed list. Response includes seenIp.
403no_access / access_expiredThe account has no XUS API subscription / it has ended.
403scope_missingThe key is not permitted for this endpoint.
429daily_limit_reachedDaily download quota spent. Resets at 00:00 UTC.
429rate_limited / ip_rate_limitedMore than 60 requests in a minute for this key / this IP.
400missing_name / invalid_name / invalid_query / invalid_cursorBad input.
404file_not_found / no_download_linkNo firmware matches name.
405method_not_allowedUse GET or POST.
500 / 503internal_error / service_unavailableTemporary server-side problem โ€” retry with backoff.

7. Limits & good practice

  • Daily quota: 200 or 2000 downloads per day depending on your plan; resets at 00:00 UTC.
  • Burst limit: 60 requests per minute per key (and per IP). Respect Retry-After.
  • Cache /list; re-fetch only when total changes or on a schedule.
  • Reuse a download link for its whole ttl window instead of calling /download again โ€” it will not re-charge for the same file that day, but it saves a request.
  • Retry 500 / 503 with exponential backoff; do not retry other 4xx.
  • Log the X-Request-Id of failed calls for support.

Need a key or a higher limit? Contact support.