PearPear
API Integration

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

History

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 OrderExecution
What it isAn instructionOne run of an instruction
Is waitingUntil it fires or is cancelledNever; it exists because something ran
HoldsThe condition, and the basket it will placeThe venue orders actually sent
Read withGET /triggers, GET /schedules, GET /laddersGET /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/open creates 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 ladderId and ladderIndex.

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.000Z

Treat 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

Endpointlimit defaultlimit maximum
Most list endpoints202000
GET /positions/closed20200
GET /tca/positions/{positionId}, GET /tca/summary1002000

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:

EndpointNote
GET /positions/liteTakes no query parameters.
GET /fills/provisionals-liteTakes no query parameters.
GET /fills/{positionId}Takes no query parameters. Returns the position's entire fill ledger.
GET /portfolio, GET /portfolio/analyticsAggregates, 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.

On this page