gexbot api
general

eod report

Downloads the latest available daily End-of-Day (EOD) summary report for a specified ticker.

GET/hist/eod/{ticker}Classic Tier

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 SubscriptionFiles in the EOD Archive
Classicclassic/gex_zero, classic/gex_one, classic/gex_full
StateThe 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 / QuantThe 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-Disposition file name to know which report you received.

Request

Example: /hist/eod/SPY

Path Parameters

NameTypeRequiredDescription
tickerstringYesTicker symbol for the EOD report (e.g. SPY, SPX, QQQ, IWM, VIX, AAPL, NVDA, TSLA).

Headers

NameTypeDescription
AuthorizationstringRequired. Format: "Bearer <YOUR_API_KEY>"
User-AgentstringRequired. Identify your client application.
AcceptstringOptional. Set to application/zip. The response is always application/zip.

Response

FieldTypeDescription
bodybinaryThe downloadable ZIP archive. Save the binary stream directly to disk.
Content-Typeheaderapplication/zip
Content-DispositionheaderSuggested 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.zip
import 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

StatusWhenBody
400The 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."}
401The API key is not valid.(no body)
403The account has no active paid subscription, or the key is a Research API key.(no body), or {"error": "Access denied."}
404No report exists for the ticker.{"error": "EOD report not found."}
429The account exceeded its daily or monthly quota for this endpoint.{"error": "Rate limit exceeded."}
503The 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.

On this page