Realized PnL by day
GET
/portfolio/{wallet}/pnl-calendar
const url = 'https://api.getchord.xyz/v1/portfolio/example/pnl-calendar?chain=5042';const options = {method: 'GET'};
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://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.
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”wallet
required
EVM address, hex, case-insensitive.
string
Query Parameters
Section titled “Query Parameters”chain
integer
Chain id: 5042 Arc · 4663 Robinhood Chain · 143 Monad. Omitted = 143.
Responses
Section titled “ Responses ”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"}