eod report
Downloads the latest available daily End-of-Day (EOD) summary report for a specified ticker.
Downloads the daily End-of-Day summary ZIP report for a specified ticker. Available to all active subscriptions (Classic, State, Orderflow, Quant).
Use daily EOD reports to continuously forwardfill and maintain local backtesting databases. Available via the web portal (Account → Historical Data) and programmatically via this endpoint.
Subscription Tier Inclusions
The contents of the downloaded ZIP archive reflect your active subscription tier:
| Active Subscription | Files in the EOD Archive |
|---|---|
| Classic | classic/gex_zero, classic/gex_one, classic/gex_full |
| State | The Classic files plus state/gex_zero, state/gex_one, state/gex_full, state/delta_zero, state/delta_one, state/gamma_zero, state/gamma_one, state/vanna_zero, state/vanna_one, state/charm_zero, state/charm_one |
| Orderflow / Quant | The Classic and State files plus orderflow/orderflow |
The archive does not include the volume_zero and volume_one (options profile) files. Each entry is a gzip JSON file of the intraday history, at the path {TICKER}/{package}/{category}/{date}_{TICKER}_{package}_{category}.json.gz, where {TICKER} is the upper-case symbol. The archive contains only the files that exist for that date.
Purchased marketplace bundles are not included in the API report. Download the portal report (Account → Historical Data) to get them.
Availability Schedule
- Eligibility: The report for the current Eastern date becomes eligible at 5:00 PM ET and is included after the nightly cold-storage export has completed.
- Fallback: Until then the endpoint returns the most recent earlier report that exists (for example, Friday's report on a Monday morning). Read the date from the
Content-Dispositionfile name to know which report you received.
Request
Example: /hist/eod/SPY
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ticker | string | Yes | Ticker symbol for the EOD report (e.g. SPY, SPX, QQQ, IWM, VIX, AAPL, NVDA, TSLA). |
Headers
| Name | Type | Description |
|---|---|---|
Authorization | string | Required. Format: "Bearer <YOUR_API_KEY>" |
User-Agent | string | Required. Identify your client application. |
Accept | string | Optional. Set to application/zip. The response is always application/zip. |
Response
| Field | Type | Description |
|---|---|---|
body | binary | The downloadable ZIP archive. Save the binary stream directly to disk. |
Content-Type | header | application/zip |
Content-Disposition | header | Suggested filename, e.g. attachment; filename=eod_report_SPY_2026-06-26.zip. |
BASE_URL="<your host and version>"
curl -X GET "$BASE_URL/hist/eod/SPY" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "User-Agent: YourClientApp/1.0" \
-H "Accept: application/zip" \
--output eod_report_SPY.zipimport os
import requests
API_KEY = os.environ.get("GEXBOT_API_KEY")
BASE_URL = "<your host and version>"
url = f"{BASE_URL}/hist/eod/SPY"
headers = {
"Authorization": f"Bearer {API_KEY}",
"User-Agent": "BacktestingEngine/1.0",
"Accept": "application/zip",
}
response = requests.get(url, headers=headers, stream=True)
response.raise_for_status()
filename = "eod_report_SPY.zip"
if "Content-Disposition" in response.headers:
disposition = response.headers["Content-Disposition"]
if "filename=" in disposition:
filename = disposition.split("filename=")[1].strip('"')
with open(filename, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Saved EOD report to {filename}")Errors
| Status | When | Body |
|---|---|---|
400 | The ticker is unknown or has an invalid format, the Authorization or User-Agent header is missing, or the report has more than 1000 files. | {"error": "Unknown ticker symbol: X"}, {"error": "Invalid ticker format."}, {"error": "Authorization header not found."}, {"error": "User-Agent not found."} or {"error": "EOD report is too large."} |
401 | The API key is not valid. | (no body) |
403 | The account has no active paid subscription, or the key is a Research API key. | (no body), or {"error": "Access denied."} |
404 | No report exists for the ticker. | {"error": "EOD report not found."} |
429 | The account exceeded its daily or monthly quota for this endpoint. | {"error": "Rate limit exceeded."} |
503 | The storage fetch failed. Retry later. | {"error": "Fetch failed."} |
A ticker that is not 1 to 6 letters or underscores returns an empty 404 from the host.