PearPear
API IntegrationTrade Activity

Fills

Read the individual fills behind a position, with prices and fees.

A fill is one trade print at the venue. Fills are the ledger every other number is derived from: a position's entry prices, a closed trade's realized PnL, and the fees you paid.

EndpointReturns
GET /fillsFills across the trade account, paginated.
GET /fills/{positionId}Every fill of one position, unpaginated.
GET /fills/provisionals-liteProvisional fills, trimmed to the fields a syncer needs.

Read the fills of a position

curl "https://pro-gateway.pearprotocol.io/fills/$POSITION_ID" \
  -H "x-api-key: $PEAR_API_KEY" \
  -H "x-trade-account-id: $TRADE_ACCOUNT_ID"
{
  "fills": [
    {
      "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "tradeAccountId": "5e7a1b20-8c34-4d19-b6f0-a1c2d3e4f567",
      "positionId": "9c1b2d3e-4f56-4789-a0b1-c2d3e4f56789",
      "connector": "hyperliquid",
      "symbol": "0",
      "side": "BUY",
      "status": "CONFIRMED",
      "quantity": "0.0052",
      "price": "96150.5",
      "usd": "500.00",
      "tradeFee": "0.22",
      "pearFee": "0.05",
      "reduceOnly": false,
      "isExternal": false,
      "synthetic": false,
      "cloid": "0x9f2c4a7e10b3486d",
      "exchangeFillId": "42917338",
      "timestamp": "2026-01-01T00:00:01.240Z"
    }
  ]
}

This endpoint takes no query parameters and returns no limit or nextCursor. It returns the position's entire fill ledger in one response, oldest first. It is scoped by trade account only, not by venue.

symbol is the instrument ID, not the ticker. See Instrument ID.

Fields

FieldMeaning
quantity, priceWhat filled, and at what price.
usdThe notional of the fill.
tradeFeeThe exchange's fee. Optional, and usually absent on a PROVISIONAL fill.
pearFeePear's fee. Optional, and usually absent on a PROVISIONAL fill. See Trading Fees.
reduceOnlyWhether the order that produced it was reduce-only.
tradeAccountIdThe trade account the fill belongs to.
cloidThe client order id Pear sent to the venue. Use it to match a fill to your own request. Optional.
exchangeFillIdThe venue's own id for the print. Optional.
isExternaltrue when the fill came from outside Pear, such as a trade placed on the exchange directly.
synthetictrue for a bridge fill Pear reconstructed to close a gap in the ledger, rather than a print the venue reported. On an unpriceable gone-close synthetic, price and usd are the literal string "0". "0" is otherwise a real price, so check synthetic before trusting a zero.
originalPresent only when one venue print spanned several positions. Pear splits that print into one fill per position and gives each a synthetic exchangeFillId; original carries the root print's { exchangeFillId, quantity }. Use it to fold the parts back together.

Fill status

statusMeaning
PROVISIONALRecorded from the order result, before the venue's own record arrived. Fees may still change.
CONFIRMEDSettled with the venue's own record.
RECONCILEDSuperseded. Never returned by either endpoint.

Neither fills endpoint ever returns a RECONCILED fill. When the venue's record supersedes a provisional fill, Pear marks the provisional RECONCILED and it disappears from these endpoints, replaced by a new CONFIRMED fill. So a fill can vanish and a different id take its place. Match on exchangeFillId where one is present, rather than on the fill's id. The transitions are driven by Pear's fill sync, exposed as the POST /sync/fills/* endpoints.

Treat PROVISIONAL fees as an estimate. If you compute PnL yourself, wait for CONFIRMED or read the composed numbers from Closed Position instead.

Listing across the account

curl "https://pro-gateway.pearprotocol.io/fills?limit=100&orderBy=-timestamp" \
  -H "x-api-key: $PEAR_API_KEY" \
  -H "x-trade-account-id: $TRADE_ACCOUNT_ID"
ParameterValues
orderBy-timestamp (newest first, the default) or timestamp (oldest first). Nothing else.
limitDefault 20, maximum 2000.
cursorThe nextCursor of the previous page.
connectorAccepted and ignored. The venue comes from the trade account.

GET /fills/provisionals-lite returns only id, positionId, symbol, cloid, and status. It exists so a syncer can find what still needs settling without pulling whole fill objects. Like the per-position read, it takes no query parameters and does not page.

Live updates

Fills stream over the WebSocket as part of the execution and position events. The action a fill belongs to is at Execution.

On this page