Trade Activity
Read positions, resting orders, executions, fills, and history.
Read your live and historical activity, all scoped to a trade account with the x-trade-account-id header. For push updates instead of polling, subscribe to the WebSocket.
Live
| View | Endpoint |
|---|---|
| Open Position | GET /positions, GET /positions/lite |
Open Order — add ?status=ACTIVE | GET /triggers, GET /schedules, GET /ladders, GET /ladders/{ladderId} |
| Monitor TWAP | GET /schedules |
History
| View | Endpoint |
|---|---|
| Closed Position | GET /positions/closed |
| Execution | GET /executions, GET /executions/{id} |
| Fills | GET /fills, GET /fills/{positionId}, GET /fills/provisionals-lite |
| Rebalance Activity | GET /rebalance/{positionId}/events, GET /rebalance/auto |
| Trade History | Which level of history answers your question, plus GET /funding. |
| Portfolio | GET /portfolio, GET /portfolio/analytics |
| Transaction Cost Analysis | GET /tca/executions/{executionId}, GET /tca/positions/{positionId}, GET /tca/summary |
| Syncing Venue Activity | The ten POST /sync/fills/* and POST /sync/funding/* endpoints. |
Instructions and runs
Two pages above name the same three things — triggers, schedules, and ladders — which makes them easy to confuse. The difference is when each one exists. Orders and Executions defines every object in the chain; this is the short version.
An open order is an instruction that has not run yet: a trigger waiting on a condition, a TWAP schedule waiting on its clock, a ladder waiting for the market to reach a rung. An execution is one run of an instruction: the record of Pear placing orders at the venue.
| Open Order | Execution | |
|---|---|---|
| What it is | An instruction | One run of an instruction |
| Is waiting | Until it fires or is cancelled | Never; it exists because something ran |
| Holds | The condition, and the basket it will place | The venue orders actually sent |
| Read with | GET /triggers, GET /schedules, GET /ladders | GET /executions |
The instruction's record outlives the wait. A trigger that fired is still on GET /triggers, now reporting TRIGGERED, and those three endpoints return every state by default rather than only what is resting. So "open order" describes the state you usually want, not what the endpoint gives you. See Open Order.
Three consequences worth knowing:
- One instruction produces many runs. A TWAP over twelve slices produces twelve executions, each naming the same schedule.
- A market order skips the instruction step.
POST /trade/opencreates an execution directly, so there is no open order to read — only the execution. - A ladder has no executions of its own. Its rungs are triggers, so a rung's execution names the trigger, and that trigger carries
ladderIdandladderIndex.
Because of the first point, GET /executions hides schedule and trigger runs by default, so one TWAP does not bury everything else. See Execution.
There is no separate orders endpoint: orders live inside their execution, in its orders array.
Pagination
Most list endpoints use cursor pagination. Each response carries the limit it applied and a nextCursor:
{
"limit": 50,
"nextCursor": "2026-01-01T04:12:33.000Z",
"positions": []
}Pass that value back as cursor to get the next page, and stop when nextCursor is absent:
GET /positions?limit=50&cursor=2026-01-01T04:12:33.000ZTreat a cursor as opaque. Most endpoints return a bare timestamp, but GET /positions/closed returns an encoded compound token. The format is not part of the contract.
Stop on a missing nextCursor, never on a short page. Some endpoints skip rows while composing a page, so a page can hold fewer than limit items and still have more behind it.
Page size
| Endpoint | limit default | limit maximum |
|---|---|---|
| Most list endpoints | 20 | 2000 |
GET /positions/closed | 20 | 200 |
GET /tca/positions/{positionId}, GET /tca/summary | 100 | 2000 |
A limit above the maximum is a 400, not a silent clamp.
Endpoints that do not page
These return the whole result in one response, with no limit and no nextCursor:
| Endpoint | Note |
|---|---|
GET /positions/lite | Takes no query parameters. |
GET /fills/provisionals-lite | Takes no query parameters. |
GET /fills/{positionId} | Takes no query parameters. Returns the position's entire fill ledger. |
GET /portfolio, GET /portfolio/analytics | Aggregates, not lists. See Portfolio. |
GET /tca/executions/{executionId} | One execution's metrics. See Transaction Cost Analysis. |
connector never narrows a list
Every list schema accepts a connector parameter, and none of them apply it. The venue always comes from the trade account in x-trade-account-id. Sending connector changes nothing; to read another venue, send that venue's trade account id.
status does filter, on most list endpoints. The values it accepts, and the values it maps to in the response, differ per endpoint — each page names its own.