Skip to content

Realized PnL by day

GET
/portfolio/{wallet}/pnl-calendar
curl --request GET \
--url 'https://api.getchord.xyz/v1/portfolio/example/pnl-calendar?chain=5042'

Day-by-day realized PnL (UTC days) with the trade count, from the same average-cost model as /pnl, so the day sums reconcile with realized by construction.

Portfolio routes answer an empty 200 shape rather than a 5xx when the tape read fails — treat an empty tokens list as “nothing yet” and retry later.

wallet
required

EVM address, hex, case-insensitive.

string
/^0x[a-fA-F0-9]{40}$/
chain
integer
default: 143
Allowed values: 5042 4663 143

Chain id: 5042 Arc · 4663 Robinhood Chain · 143 Monad. Omitted = 143.

Media typeapplication/json
object
days
Array<object>
object
date

YYYY-MM-DD

string
realizedUsd
number
trades
integer
firstDate
string | null
realizedTotal
number
updatedAt

Unix time, milliseconds — when the server built this answer.

integer
Example
{
"days": [
{
"date": "2026-08-19",
"realizedUsd": 0,
"trades": 6
},
{
"date": "2026-08-20",
"realizedUsd": 0,
"trades": 2
}
],
"firstDate": "2026-08-19",
"realizedTotal": 34046.5607144201,
"updatedAt": 1789891871239
}

Invalid parameters — error names the check that failed (INVALID_PARAMS, BAD_ADDRESS, BAD_LIMIT, BAD_HOURS, …).

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}