Self-diagnostics first
Two calls answer most questions. Run them before anything below:/v1/health confirms the API is reachable. /v1/health/sync reports each domain’s last_sync, status, and error_rate, which separates a stale-data problem from an API outage (see sync health for the full response).
Requests and authentication
My request returns 401 even though I sent a key
My request returns 401 even though I sent a key
A
401 means the request was not authenticated. Three distinct causes return the same status with a different error message:- Malformed header. The
Authorizationheader is missing, or it does not begin withBearer rw_. Check that the prefix is exactlyBearer rw_, notbeareror a bare token. - Unknown or revoked key. The prefix is correct but no active key matches it. A revoked key falls into this bucket once its cache entry expires.
- Expired key. The key exists and is active, but its expiry has passed. This one returns
{"error":"Token expired","status":401}so you can tell it apart from the other two.
401, wait a moment and retry before assuming it is wrong.On a remote MCP connection, a 401 means the request reached the server without a valid grant: re-run the GitHub consent flow, or re-check your Bearer token for token-based clients.I get 403 Forbidden on the REST API
I get 403 Forbidden on the REST API
The request authenticated successfully, but the key does not have the scope
the endpoint requires. The common case is using a read key (
rw_live_...) on
an admin-only endpoint such as a sync trigger or key management. The fix is an
admin key (rw_admin_...), not a new read key. See
Authentication for the scope each key type grants.I'm getting 429 Too Many Requests
I'm getting 429 Too Many Requests
You have exceeded the sliding 60-second window for your key. The response includes a
Retry-After header (seconds to wait) plus the X-RateLimit-* headers; see Authentication for the limit and what each header means. Back off until Retry-After passes, then retry. Heavy automated polling is the usual cause, so space out repeated calls.The window is tracked per Worker isolate, so counts reset when an isolate recycles and observed limits can be slightly more generous under load. The remote MCP server enforces its own per-minute limit the same way.Data freshness
An endpoint returns old or empty data
An endpoint returns old or empty data
If a call succeeds but the data looks old or empty, the source sync is the place to look, not the API. Call
GET /v1/health/sync and read the relevant domain:statusiscompleted,failed, ornever. A value ofnevermeans that domain has not run a sync yet.erroris populated only when the latest run failed, and carries the failure message from the sync worker.error_rateis the share of runs in the last 24 hours that failed, from0.0(all healthy) to1.0(all failing).last_syncis the timestamp of the most recent run. Compare it against the domain’s cron cadence to judge freshness.
403.Claude is showing stale or outdated data
Claude is showing stale or outdated data
Rewind answers from its last successful sync, not this exact moment, so a recent listen, run, or watch can be missing for a while. Ask the model to call
get_health first: it returns overall API health plus a last-sync timestamp per domain, and a timestamp that is hours or days old explains the gap.The MCP server itself is stateless and caches nothing locally, so there is no local store to clear. When results look wrong, the cause is upstream sync timing, not a stale cache. The fix is the same as above: check get_health, then trigger a sync with an admin key if needed.Claude and MCP
The server connects but returns no data, or will not connect
The server connects but returns no data, or will not connect
This is almost always configuration. Check these in order:
REWIND_API_KEYis set. The server reads your key from this environment variable; without it, every tool call fails authentication. A read key is sufficient, since the server is read-only.- You restarted the client. MCP configuration is read at startup. After editing the Claude Desktop JSON config, a
.mcp.jsonfile, or runningclaude mcp add, fully quit and reopen the client so it reloads the server definition. - You are using the right transport. Local clients run the server through
npx; the hosted option connects tohttps://mcp.rewind.rest/mcp. Mixing the two in one entry will not connect.
Remote access returns 403 not authorized
Remote access returns 403 not authorized
Responses are too image-heavy
Responses are too image-heavy
Many tools return cover art, posters, and artist imagery as image content
blocks, and list tools include the top few by default. If a response is larger
than you want, or your client struggles to render the images, pass
include_images: false to drop the image blocks and keep the text and
structured data. See Rich responses for the full
content model.Interactive cards are not showing up
Interactive cards are not showing up
Some tools advertise MCP
Apps UI
resources that render as inline cards, but whether you see one depends on your
client. Clients that support MCP Apps draw the card; clients that do not still
get the full response (text, images, resource links, and structured content),
so nothing is lost. If you expected a card and got plain text plus images,
your client does not support MCP Apps yet. See Rich
responses for which clients support them.
How is my API key handled
How is my API key handled
Key handling depends on the connection mode:
- Local stdio. Your
REWIND_API_KEYstays on your machine in the client config. The server runs as a child process and talks to your client over stdin and stdout. - Remote. You authenticate through GitHub OAuth (or a Bearer token, for clients that take one), and the hosted Cloudflare Worker uses a server-side Rewind key on your behalf after your GitHub identity is matched to your account.
Images and the CDN
Artwork is missing or generic
Artwork is missing or generic
Each image type resolves through a source fallback chain: if the primary source has no art for an item, Rewind tries the next source before giving up. A blank or generic image usually means every source in the chain came up empty for that item, not that the CDN is down.
A resize or format transform looks ignored
A resize or format transform looks ignored
Resize and format transforms are applied through query parameters on the
cdn.rewind.rest URL. If a transform looks ignored, confirm you are hitting
the CDN host and that the parameters are on the CDN URL, not the API URL.The placeholder stays blurry
The placeholder stays blurry
Image responses include a
thumbhash alongside dominant_color and accent_color, meant to render as a blurred placeholder while the full image loads. A placeholder that never sharpens means the full-resolution fetch did not complete, so check the image URL.Error reference
Every error response uses the same{ "error", "status" } envelope, where status matches the HTTP code.
| Status | Meaning | Common cause |
|---|---|---|
400 | Bad request | Malformed query parameter, invalid body, or unparseable input. |
401 | Unauthorized | Missing or non-Bearer rw_ header, unknown or revoked key, or expired key. |
403 | Forbidden | Authenticated, but the key lacks the required scope (read key on an admin endpoint). |
404 | Not found | The resource or route does not exist. |
429 | Too Many Requests | Rate limit exceeded; honor the Retry-After header. |
500 | Server error | Unexpected failure on the server. Retry, then report if it persists. |