Read recent API requests for your application.
GET/debug/requests
Ask Feed for an expiring debug key for your application. Send that key
in X-Feed-Debug-Key together with the same application's consumer
token and secret. Playback access tokens cannot read history. Development
and production applications have separate credentials and separate histories.
Returns successful and failed requests from the existing logs, including
client/session creation and requests made before a play starts. It covers
both v2 and v3 requests attributable to your application. Results are
newest first by default; sort=asc returns oldest first. Optional
filters are combined with AND and can only narrow your application's
history. All filter parameters accept a single value; arrays, objects,
wildcard searches and arbitrary query expressions are rejected.
client_id matches an ID recorded on the request or client/session
creation response. url matches an exact v2/v3 API path or the route
template returned in route, such as /api/v3/play/{play_id}/start.
Logged query strings are ignored when matching; do not include a host,
query string or fragment in the filter.
success=true matches HTTP 2xx/3xx responses with no recorded Feed
error. success=false includes HTTP errors and Feed errors delivered
with HTTP 200. audio_file_id and station_id match IDs recorded in
the response, not IDs submitted in a request body. Requests whose
responses did not log those fields do not match those filters.
Routes reflect the path the client requested. Offline session uploads
(POST /api/v2/session/offline) produce one record per reported event
(start, elapse, complete and so on) under that route, so several records
can share a play_id, and session-level events carry none. Filter on
url=/api/v2/session/offline to see them.
station_uuid matches the UUID recorded with the response, across
the station's publish generations. Matching is case-insensitive,
including opaque legacy identifiers. Logs without a recorded UUID
do not match this filter. An unknown UUID returns an empty page.
If both station filters are provided, the response must match both.
Station UUIDs are not added to returned records.
The window must be within the last seven days. Times in the logs and
responses are UTC; request timestamps must include Z or an explicit
UTC offset. since is inclusive and defaults to seven days ago; until
is inclusive and defaults to now. since must be before until.
Logs normally appear minutes after a request, not immediately. Requests that never authenticated cannot be attributed to an application and are omitted. For an integration attempt, an empty result usually means the request never authenticated; also check the time range and allow for ingestion delay. Log outages and incomplete searches return an error, rather than an empty list.
Each page has at most 100 records and at most 256 KiB of JSON. Follow
next_cursor by sending it as the only query parameter. Cursors are
bound to the authenticated app, window, filters, sort and page size, and expire two
minutes after the initial query. Use the latest cursor once, sequentially;
it advances a fixed snapshot of the logs. New arrivals require a new
query. next_cursor: null ends the result set; an exactly full final
page may be followed by an empty page. Expired cursors require a new query.
Fields are explicitly allowlisted. Routes are normalized templates with
query strings removed; unrecognized paths are returned as null. Every
v3 route is recognized, as are the v2 routes an app can call. Templates
are /api/v3/play/{play_id}/<action>, /api/v3/placement/{placement_id}/station,
/api/v3/access_token/{access_token_id} and /api/v2/client/{client_id}.
Client and play IDs are returned when present, including IDs from known
route paths. Credentials, cookies, signed audio URLs, raw headers, IPs,
user agents, arbitrary event parameters and free-text invalidate reasons
are never returned. Error messages use the standard Feed description for
the logged code, not raw messages that might contain submitted values.
These logs do not contain full request/response bodies. Station lists,
audio metadata, playback flags and IDs not recorded by the original
handler are unavailable. Missing fields stay omitted; a missing duration
is null. This endpoint does not add logging to playback routes.
Example (the default window is the last seven days):
curl --get --user "$FEED_CONSUMER_TOKEN:$FEED_CONSUMER_SECRET" \
--header "X-Feed-Debug-Key: $FEED_DEBUG_KEY" \
--data-urlencode 'limit=50' \
'https://feed.fm/api/v3/debug/requests'
To continue, repeat the same credentials and use
--data-urlencode "cursor=$NEXT_CURSOR" in place of all other parameters.
To inspect failures for a client in chronological order, start a new
query with client_id=YOUR_CLIENT_ID, success=false and sort=asc.
Request
Responses
- 200
- 400
- 401
- 403
- 429
- 503
- default
A bounded page of request history, including an empty page when nothing matches.
Invalid time range, page size, filter, sort order, or invalid/expired cursor.
Credentials were missing or invalid. The response carries
WWW-Authenticate: Basic realm="Feed.fm".
Response Headers
The authentication challenge. Always Basic realm="Feed.fm".
Basic realm="Feed.fm"Consumer credentials and a valid debug key for the same app are required.
The server judged the rate of requests from these credentials to be excessive and is refusing them for a time. The block lasts 30 seconds from the request that tripped it. Requests made during the block are refused and do not extend it.
The threshold is not published, and is not part of this contract. The threshold is also tuned from time to time.
The response carries a Retry-After header giving whole seconds until
the block clears. Wait at least that long. It says when to come back,
not what rate to aim for, and retrying sooner simply meets the block
again.
This exists to stop abuse, and a well-behaved client should not reach it; if yours does, the fix is to reduce your request rate rather than to retry on a timer. If you believe your application needs a rate that trips it, contact Feed.fm rather than working around it.
Log storage or station lookup is unavailable, timed out, exceeded its bounds, or returned incomplete results, or no log index exists for any day in the requested window. Retry with a new query.
An error occurred.