Developers menu

Developers / LIVE / Volume delta (CVD) of a day

Markdown copy

Volume delta (CVD) of a day

SPX options printed as calls minus those printed as puts, the terminal's CVD band, one row a minute: what printed in the minute and the running totals since 09:30 at its end. Three scopes: today's expiry (0DTE), the near expiries the book models (_next; all expiries is the two summed), and each weighted by the option's delta at the print (cvd_delta, delta-contracts). The volume book's own sign (a call printed is a call), never a guess at which side hit which. ES answers with SPX's: these are counts of SPX options, no basis moves them. Today's rows follow the session with a minute's lag.

GET/api/v1/cvd
Plan LIVEKey scope liveLimit 120 a minute per key; the last 90 days, older with DATASETVersion 1.0.0Since 2026-10-27

This endpoint serves

Plan: LIVE. LIVE: today's session every second, alerts, ASK, the levels API and the platform integrations, and 5 LAB credits a month. Every finished session is free in REPLAY. Pricing.

Parameters

NameWhat it doesDefaultError
symrequiredquery · stringSPX or ES (MES answers as ES). Other symbols answer spx_only.missing_sym, spx_only
dayquery · stringYYYY-MM-DD, within the last 90 days; older with the DATASET licence.the running or most recent sessionbad_day, history_too_old
errorsquery · 200200: an error answers 200 with the same body and the real status in X-FirmTape-Status, for clients that cannot read a status.
keyquery · stringLegacy: the key in the address, for platforms that cannot send headers. Prefer the header.

Response

Columns and rows.

FieldMeaningUnit
symstringThe symbol asked: SPX or ES.
daystringThe ET trading day.
index"SPX"The options counted: SPX's, whatever was asked.
step"1m"One row a minute.
unit"contracts"calls, puts, cvd and their _next twins count contracts.
unit_delta"delta_contracts"cvd_delta and cvd_delta_next count delta-contracts: each print's size times its delta, not times 100.
sourcerecording | rebuiltrecording: the live engine's per-second counts; rebuilt: rebuilt from the raw tape after the day.
as_ofstringThe last second counted, ISO 8601 with the ET offset.
columnsarrayt, calls, puts, cvd, calls_next, puts_next, cvd_next, cvd_delta, cvd_delta_next.
rowsarrayOne row a minute: its ET start (HH:MM), the contracts printed in it as calls and as puts (today's expiry), the running calls minus puts since 09:30 at its end, the same three for the near expiries, then the two running totals in delta-contracts. A series the day does not carry is null (days before 2026-10-08 carry no delta).

Errors

StatusCodeWhat to do
400missing_sym, bad_day, spx_onlyA parameter is wrong. Pass sym, one symbol or a comma list.
401no_key, bad_keyNo key, or an unknown or revoked one. Send Authorization: Bearer <key> with a key of the product's scope.
403live_required, history_too_oldNo LIVE plan, or a day older than 90 days without DATASET. Start or renew LIVE; pricing names the page.
404unknown_symbol, no_cvdNo such symbol, or no volume delta for that day. Pick one from GET /api/v1/symbols.
429rate_limitedOver a limit. Wait Retry-After seconds; poll with If-None-Match, a 304 is free.
503unavailableThe volume archive did not answer. Retry shortly.

Every code: Errors.

Caching

Answers carry an ETag: send it back as If-None-Match and an unchanged reading answers 304 with no body, not counted against the limit.

Changes

  • 2026-10-27 Added.

OpenAPI operation getCvd in /docs/developers/openapi.json.

Measurements of dealer positioning, never a forecast or a trade call. This page is built from FirmTape's public contract, the same files the OpenAPI document is built from; the tests hold them against the route code. Markdown: /docs/developers/live/cvd.md.