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:

MethodEndpointDescription
GET/api/v2/datasetsList 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.

JSON
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):

DatasetPlanCredits
zacks_consensus, zacks_surprisesStarter+2
boardex_networksPro+3
markit_credit_indicesPro+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 & pricingcompustat_annual, compustat_quarterly, compustat_segments, crsp_daily, crsp_monthly, crsp_delisting, crsp_distributions, segment_customers, supply_chain_links

Estimates & consensusibes_summary, ibes_detail, ibes_actuals, ibes_guidance, ibes_ptg, ibes_recommendations, estimize_consensus, estimize_estimates, zacks_consensus, zacks_surprises

Credit & fixed incometrace, markit_cds, markit_credit_indices, dealscan_facility, dealscan_pricing, ciq_ratings

Options & short interestoptionmetrics_daily, optionmetrics_by_ticker, optionmetrics_volsurface, markit_short

Governance, audit & ESGboardex_profile, boardex_composition, boardex_networks, execucomp, audit_fees, audit_restatements, auditor_changes, msci_esg

Ownership & fundsmutual_fund_holdings, mutual_fund_returns

Events & factorsciq_keydev, ciq_transcripts, fama_french_daily, fama_french_monthly

Examples#

List every dataset#

Shell
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#

Shell
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]'
JSON
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#

Shell
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. The note is 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_indices is index-keyed; boardex_networks is board-id-keyed. Check the note before joining on ticker.
  • Nulls are real. Research archives carry genuine gaps — a null means the source had no value, not that the API failed.

Next steps#