Your notifications, newest first
const url = 'https://foxleague.ai/api/notifications';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://foxleague.ai/api/notifications \ --header 'Authorization: Bearer <token>'Answers your notifications, newest first, one page at a time. To read the next older page, pass the smallest id you have as before_id. A wallet without an account gets an empty list.
Who: a signed-in player, who only sees their own notifications.
Refusals:
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Notifications per page, at most 100. Default 30; a value below 1 reads as 30.
Answer only notifications older than this id, for the next page. Omit it for the newest page.
Responses
Section titled “ Responses ”Success or a refusal: read success (the refusals are in the description).
object
A machine-readable reason next to error, set only where the caller must act differently. tx_pending: the payment was not refused but could not be verified yet; keep the transaction hash and confirm again with the same hash, never pay twice.
The answer. Present when success is true.
One notification in your feed.
object
The second line; null when there is none.
When the notification was created (RFC 3339).
The app page it opens, such as /challenges/12; null when none.
Notification id. Newer notifications have higher ids.
What happened: challenge_received, challenge_accepted, challenge_declined, challenge_expired, match_ready, match_finished, tournament_won, tournament_eliminated, tournament_about_to_start, tournament_invited, marketplace_sold, fusion_complete or transfer_received.
When you read it (RFC 3339); null while unread.
The tournament or match id it is about. For a sale, a fusion and a transfer it is the transaction hash.
The headline.
Why the request was refused, in plain words. Present when success is false.
true when the request did what it asked. false is a refusal: read error.
Example
{ "data": [ { "body": "Lars Holm sold on the market", "created_at": "2026-09-30T18:04:11.532871Z", "href": "/marketplace", "id": 90417, "kind": "marketplace_sold", "read_at": null, "ref_id": "d1a4c01ea887ae221b35411b72723b9cef44c0d53ee4da5a7989e9d083a4e629", "title": "Sold for 1800 FOXSY" }, { "body": "Red Kites challenged you to a 1v1", "created_at": "2026-09-30T12:40:03.118540Z", "href": "/challenges/2231", "id": 90112, "kind": "challenge_received", "read_at": "2026-09-30T12:41:22.907316Z", "ref_id": "2231", "title": "New challenge!" } ], "success": true}No valid session. The body is plain text: Missing Authorization header, Invalid Authorization format, Invalid session token or Session expired or invalid. Sign in again.
Example
Session expired or invalid