Skip to content

Your notifications, newest first

GET
/api/notifications
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:

limit
integer format: int64

Notifications per page, at most 100. Default 30; a value below 1 reads as 30.

before_id
integer format: int64

Answer only notifications older than this id, for the next page. Omit it for the newest page.

Success or a refusal: read success (the refusals are in the description).

Media type application/json
object
code

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.

string | null
data

The answer. Present when success is true.

Array<object>

One notification in your feed.

object
body

The second line; null when there is none.

string | null
created_at
required

When the notification was created (RFC 3339).

string format: date-time
href

The app page it opens, such as /challenges/12; null when none.

string | null
id
required

Notification id. Newer notifications have higher ids.

integer format: int64
kind
required

What happened: challenge_received, challenge_accepted, challenge_declined, challenge_expired, challenge_cancelled_unseated, match_ready, match_finished, tournament_won, tournament_eliminated, tournament_about_to_start, tournament_invited, marketplace_sold, fusion_complete (a fusion of yours completed: written once its result is known on chain, never while the fusion still shows as Pending), fusion_failed (a fusion of yours failed on chain: your three players and the fee are back in your wallet; the players left your lineup when the fusion was sent, so put them back in it), transfer_received, player_interest, player_interest_listed, player_injured (a player of yours was injured in a match: the title says for how many days and it opens the Shop, where Medicine is) or player_suspended (a player of yours got the yellow card that suspends him for your team’s next tournament match). The last two are written when the match that caused them has ended.

string
read_at

When you read it (RFC 3339); null while unread.

string | null format: date-time
ref_id

The tournament or match id it is about. For a sale, a fusion and a transfer it is the transaction hash. For an injury or a suspension it is the player’s nonce, a colon and the match it happened in (a tournament match by its public id).

string | null
title
required

The headline.

string
error

Why the request was refused, in plain words. Present when success is false.

string | null
success
required

true when the request did what it asked. false is a refusal: read error.

boolean
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.

Media type text/plain
string
Example
Session expired or invalid