Research Datasets
Direct, row-level access to the licensed multi-decade research archives behind the API — 43 datasets covering fundamentals, estimates, credit, options, governance, ownership, and factor returns. Where the product endpoints give you a curated answer, these give you the underlying table.
What's inside#
Two endpoints cover the whole surface:
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/datasets | List every available dataset slug. Metered (4 credits — read X-Credits-Cost). |
GET | /api/v2/datasets/{dataset} | Read rows from one dataset. ?limit= and dataset-specific filters. |
Every response carries a note describing that dataset's coverage, row count, refresh cadence, and any keying quirks — read it before building against a dataset, it is the authoritative description.
1{2 "ok": true,3 "timestamp": "...",4 "dataset": "zacks_consensus",5 "n": 1,6 "rows": [ ... ],7 "source": "...",8 "note": "Daily sell-side EPS consensus (mean/std/count by reference period), 2.9M rows 2024-08 → present, ~5-week lag."9}Access & cost#
Each dataset bills at the credit cost of the product group it belongs to, and is gated by that group's plan. Cost is reported per call in the X-Credits-Cost response header — read it rather than assuming.
Representative costs (verified live):
| Dataset | Plan | Credits |
|---|---|---|
zacks_consensus, zacks_surprises | Starter+ | 2 |
boardex_networks | Pro+ | 3 |
markit_credit_indices | Pro+ | 4 |
Recently added#
zacks_consensus — Starter+ · 2 credits. Daily sell-side EPS consensus (mean / std / count by reference period), 2.9M rows, 2024-08 → present, ~5-week lag. Columns include ticker, est_type, reference_period, observation_date, est_mean, est_std, number_of_est.
zacks_surprises — Starter+ · 2 credits. Quarterly EPS actual-vs-consensus surprises (68.7k rows) with report dates. Columns include ticker, report_date, reference_period, actual_eps, consensus_eps, surprise_pct, number_of_est.
Not every surprise row has a consensus — consensus_eps and surprise_pct are null where no estimate existed (number_of_est: 0). Filter on number_of_est > 0 when computing surprise statistics.
markit_credit_indices — Pro+ · 4 credits. CDX + iTraxx (EU / Asia / SovX) daily composite spreads and prices by series / version / tenor, 2018 → T-2, 3.8M rows. Index-keyed (indexfamily, indexticker) — there is no equity ticker column. For the curated view with on-the-run filtering, use /api/v3/credit/indices instead.
boardex_networks — Pro+ · 3 credits. Director interlock edges — which boards share directors — 5.0M rows, weekly refresh. Keyed by boardid pairs; resolve ids via boardex_profile. Columns include associationtype, boardname, companyname, directorname, overlapyearstart, overlapyearend, role.
Governance archives now refresh weekly#
boardex_profile and boardex_composition were repointed on 2026-08-01 from a frozen 2026-03 archive to a weekly-refreshing pull. Columns now follow the licensed-research-native shape rather than the previous normalized one — if you built against the old column names, re-read the note and adjust. boardex_composition carries role spells keyed by boardid / directorid; resolve both via boardex_profile.
The full catalogue#
Fetch it live with GET /api/v2/datasets — the list below is current as of manifest 2.109.
Fundamentals & pricing — compustat_annual, compustat_quarterly, compustat_segments, crsp_daily, crsp_monthly, crsp_delisting, crsp_distributions, segment_customers, supply_chain_links
Estimates & consensus — ibes_summary, ibes_detail, ibes_actuals, ibes_guidance, ibes_ptg, ibes_recommendations, estimize_consensus, estimize_estimates, zacks_consensus, zacks_surprises
Credit & fixed income — trace, markit_cds, markit_credit_indices, dealscan_facility, dealscan_pricing, ciq_ratings
Options & short interest — optionmetrics_daily, optionmetrics_by_ticker, optionmetrics_volsurface, markit_short
Governance, audit & ESG — boardex_profile, boardex_composition, boardex_networks, execucomp, audit_fees, audit_restatements, auditor_changes, msci_esg
Ownership & funds — mutual_fund_holdings, mutual_fund_returns
Events & factors — ciq_keydev, ciq_transcripts, fama_french_daily, fama_french_monthly
Examples#
List every dataset#
1curl -H "X-API-Key: $TENGU_API_KEY" \2 "https://firm.tengu.co/api/v2/datasets" | jq '.count, .datasets'Listing is metered at 4 credits, not free — cache the slug list rather than re-fetching it per query.
Read EPS surprises#
1curl -H "X-API-Key: $TENGU_API_KEY" \2 "https://firm.tengu.co/api/v2/datasets/zacks_surprises?limit=5" \3 | jq '.note, .rows[0]'1{2 "entry_date": "2026-06-29T00:00:00",3 "report_date": "2026-06-29T00:00:00",4 "ticker": "AIRT",5 "reference_period": "2026-03-01T00:00:00",6 "actual_eps": 28.75,7 "consensus_eps": null,8 "surprise_pct": null,9 "number_of_est": 010}Read director interlocks#
1curl -H "X-API-Key: $TENGU_API_KEY" \2 "https://firm.tengu.co/api/v2/datasets/boardex_networks?limit=5" | jq '.rows[0]'Notes for agents#
- Always read
note. Coverage windows, lags, row counts, and keying differ per dataset and change as archives are repointed. Thenoteis generated from the live table, so it cannot drift from reality. - Column names are archive-native. These are raw research tables — expect lowercase concatenated names (
indexfamily,overlapyearstart,number_of_est), not a normalized schema. - Not every dataset is ticker-keyed.
markit_credit_indicesis index-keyed;boardex_networksis board-id-keyed. Check thenotebefore joining onticker. - Nulls are real. Research archives carry genuine gaps — a
nullmeans the source had no value, not that the API failed.
Next steps#
- Credit & Fixed-Income — curated credit endpoints over these archives.
- Fundamentals — curated statements, ratios, and screening.
- API reference — every endpoint, per-plan access, and credit costs.