The order ledger from code

Every large SPX order of a session, rebuilt from the tape as an ORDER rather than a print: legs folded back into the parent, the structure named, and each one placed against the measured dealer book at the minute it printed. Over REST with a key, and over MCP for an assistant.

Machine-readable: OpenAPI 3.1.

Quick start

  1. Take the API or Team plan.
  2. Open Account, Orders, API keys and create a key. It starts with ordk_ and is shown once.
  3. Ask for a session.
curl -H "Authorization: Bearer $ORDERS_KEY" \
  "https://firmtape.com/orders/api/day?day=2026-08-17"

The newest session the ledger has, which is today's while the market is open:

curl -H "Authorization: Bearer $ORDERS_KEY" "https://firmtape.com/orders/api/latest"

A row

The same rows the panel draws, with the fields it has to abbreviate on screen.

{
  "oid": "p79654",
  "t": "13:43",
  "g": 7.25,
  "kind": "vertical",
  "legs": "7740P/7750P",
  "lg": [[7740.0, "P", 1], [7750.0, "P", -1]],
  "exp": "Aug 17",
  "size": 1958,
  "net": 0.15,
  "flip": 38,
  "side": "over"
}
FieldMeans
tWhen the parent order printed, ET.
gDealer gamma the order ADDED, in $M per index point. null when the order could not be priced — typically one printing inside the last half hour of its own expiry, where Black-Scholes gamma is true and meaningless.
kindThe structure, from package reconstruction rather than leg count: vertical, straddle, iron_condor, diagonal, single and the rest.
legsThe contract, for reading: 7740P/7750P.
lgThe same legs as data: [strike, "C"|"P", sign]. The sign is what the package rule concluded the CUSTOMER did, and 0 means it could not tell — never “flat”.
sizeContracts in the parent order.
netNet premium in $M. A spread is priced at its NET, because the gross of the legs double-counts money that never changed hands.
flip, sideIndex points from the zero-gamma flip at that minute, and which side of it.

Rows come sorted by what the order did to the book, largest first, with the unpriced ones after them rather than among them. That is the column no other feed has, and it is not the size of the cheque: measured over the sessions the ledger has run on, the rank agreement between premium and effect on the book is 0.017. Eight of the ten biggest cheques of a day are not the ten that moved it.

Half of them have no side

A package signs or it does not. Over 684 sessions, between a quarter and a half of the orders above $100k carry g: null or an unsigned package — the rule could not work out which way the customer went, and we would rather leave the column empty than print a guess. Every rival prints a side on every row.

The session totals say so out loud, so a program can weigh them:

"stats": { "n": 312, "net": 96.3, "no_side": 177, "no_gamma": 0,
           "gamma_up": 47, "gamma_dn": 74 }

no_side counts orders the package rule could not orient. no_gamma counts orders it could not price. Those are two different admissions and they are reported apart.

Limits

PlanCalls a dayKeysSeats
Orders— (the panel, not the API)1
API20,000101
Team100,000105

Counted per account rather than per key: five keys are for five machines, not for five times the budget. The count resets at midnight ET, and every response carries X-RateLimit-Limit and X-RateLimit-Remaining.

Finished sessions stay free, on the site and in the terminal, with a plan or without one. What the plan buys is TODAY — the session as it trades — and reading it from code.

Endpoints

CallGives
GET /orders/api/day?day=YYYY-MM-DDOne session's ledger.
GET /orders/api/latestThe newest session the ledger has.
GET /orders/api/sessionsEvery day a ledger exists for, oldest first.

A day whose ledger has not run answers 200 with an empty list and a note, not 404: a missing ledger is a normal state, not an error to handle.

SPX only, and that is not a backlog item. An order is placed against the MEASURED book, which is signed from the trade tape, and SPX is the only root that has one. The other hundred symbols have a five-minute chain book, which can price a ladder and cannot tell you who was the aggressor — a row for them would be a guess with a timestamp on it.

MCP

An assistant can read the ledger directly. The server is at https://firmtape.com/orders/mcp; the key goes in the same header.

{
  "mcpServers": {
    "firmtape-orders": {
      "url": "https://firmtape.com/orders/mcp",
      "headers": { "Authorization": "Bearer ordk_..." }
    }
  }
}

Tools: orders_day, orders_latest, orders_sessions — the three calls above, with the same answers.

Errors

StatusCodeMeans
401no_keyNo Authorization: Bearer ordk_..., or the key was revoked.
403planThe key is real but the account is not on the API or Team plan.
429rateThe day's calls are spent. Resets at midnight ET.
400bad_dayday is not YYYY-MM-DD.

Rebuilt from the public tape. Not a trading signal and not investment advice.