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
- Take the API or Team plan.
- Open Account, Orders, API keys and create a key. It starts with
ordk_and is shown once. - 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"
}
| Field | Means |
|---|---|
t | When the parent order printed, ET. |
g | Dealer 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. |
kind | The structure, from package reconstruction rather than leg count: vertical, straddle, iron_condor, diagonal, single and the rest. |
legs | The contract, for reading: 7740P/7750P. |
lg | The 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”. |
size | Contracts in the parent order. |
net | Net premium in $M. A spread is priced at its NET, because the gross of the legs double-counts money that never changed hands. |
flip, side | Index 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
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
| Plan | Calls a day | Keys | Seats |
|---|---|---|---|
| Orders | — (the panel, not the API) | — | 1 |
| API | 20,000 | 10 | 1 |
| Team | 100,000 | 10 | 5 |
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
| Call | Gives |
|---|---|
GET /orders/api/day?day=YYYY-MM-DD | One session's ledger. |
GET /orders/api/latest | The newest session the ledger has. |
GET /orders/api/sessions | Every 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
| Status | Code | Means |
|---|---|---|
| 401 | no_key | No Authorization: Bearer ordk_..., or the key was revoked. |
| 403 | plan | The key is real but the account is not on the API or Team plan. |
| 429 | rate | The day's calls are spent. Resets at midnight ET. |
| 400 | bad_day | day is not YYYY-MM-DD. |
Rebuilt from the public tape. Not a trading signal and not investment advice.