ALPHA TIER
HISTORICAL
RESEARCH PACKS
Historical Research Pack Artifact API
Download one file of a pack. Only files listed in the manifest are served, and each is checked against its recorded byte length and SHA-256 before it is sent. The response carries the hash as its ETag, so you can verify the bytes you received. Background: research packs.
Host
historical
Tier
Alpha / Enterprise
at
Optional
Format
File download
Endpoint
Host:
historical.flashalpha.comAuth: X-Api-KeyTier: Alpha or EnterpriseParameters
| Name | In | Required | Description |
|---|---|---|---|
packId | path | yes | Pack ID from the catalog |
name | path | yes | An artifact name from the manifest, e.g. trades.csv |
at | query | no | ET wall-clock instant; the file is served only if its pack was available then |
Request
curl -H "X-Api-Key: YOUR_API_KEY" -o trades.csv \
"https://historical.flashalpha.com/v1/research/packs/income-spy-qqq-2024-2025-v1-db139753fe8b/artifacts/trades.csv"
import hashlib, requests
BASE = "https://historical.flashalpha.com/v1/research/packs"
PACK = "income-spy-qqq-2024-2025-v1-db139753fe8b"
H = {"X-Api-Key": "YOUR_API_KEY"}
manifest = requests.get(f"{BASE}/{PACK}", headers=H).json()
for a in manifest["artifacts"]:
body = requests.get(f"{BASE}/{PACK}/artifacts/{a['name']}", headers=H).content
assert len(body) == a["bytes"] and hashlib.sha256(body).hexdigest() == a["sha256"], a["name"]
open(a["name"], "wb").write(body)
print("all artifacts verified")
Response
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Disposition: attachment; filename=trades.csv
ETag: "6874a236528f..." (the file's SHA-256)
X-Content-Type-Options: nosniff
<file bytes>
| Field | Description |
|---|---|
Body | The file exactly as recorded in the manifest |
Content-Type | The artifact's media_type |
Content-Disposition | Always an attachment named after the artifact, including report.html |
ETag | The artifact's SHA-256, lowercase hex |
Errors
| Status | error | When |
|---|---|---|
| 400 | invalid_research_artifact | Pack ID or file name contains characters outside the allowed set |
| 400 | invalid_at | at is not a valid ET timestamp or date |
| 401 | - | Missing or invalid X-Api-Key |
| 403 | tier_restricted | Plan below Alpha |
| 404 | research_artifact_not_found | The name is not in the manifest, or the pack was not available at at |
| 503 | research_artifact_integrity_failed | The stored file no longer matches its manifest hash; nothing is served |
Files in the first pack
| Artifact | Media type | Bytes |
|---|---|---|
accounting-audit.json | application/json | 27,854 |
benchmark-curves.csv | text/csv | 88,053 |
cash-ledger.csv | text/csv | 326,096 |
equity-2025.png | image/png | 375,221 |
equity-2025.svg | image/svg+xml | 164,650 |
equity-curves.csv | text/csv | 2,550,883 |
independent-audit.json | application/json | 240 |
independent-checks.csv | text/csv | 1,663,683 |
input-hashes.json | application/json | 892 |
methodology.json | application/json | 1,721 |
report.html | text/html | 533,931 |
reproduce.zip | application/zip | 2,178,022 |
reproduction.json | application/json | 437 |
summary.json | application/json | 145,034 |
trades.csv | text/csv | 190,862 |
Start with report.html (a standalone report; download the related files with it for local browsing) or summary.json. reproduce.zip holds the frozen captured inputs, model code and commands to regenerate the results offline without a database or credentials.
Related endpoints
- Research Pack Catalog API -
GET /v1/research/packs - Research Pack Manifest API -
GET /v1/research/packs/{packId} - Historical trader context - income replays link the relevant pack through
metrics.research - The first pack's results - SPY and QQQ covered calls and cash-secured puts