FactIQ
Financial and economic data
- Category
- Data & Analytics
- Primary Subcategory
- Market & Competitive Intelligence Data
Integration details
Description
FactIQ is a research data layer for AI agents. It gives users access to source-linked economic, market and company intelligence—including official statistics, structured company financials, filings and earnings-call evidence—inside tools such as ChatGPT and Codex.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Market & Competitive Intelligence Data
- Secondary Subcategories
- None listed
- Brand
- FactIQ
- Access
- Account required
- First tracked
- 2026-09-17
- Tool count
- 15
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Market & Competitive Intelligence Data
View Category15 tools agents can invoke
List the data sources FactIQ has, plus the shared table structure. Call this once before exploring. Returns the visible schemas (organization + country), the ones with no data loaded yet (`schemas_without_data` — skip them), a per-schema dataset index, and the shared DDL for the `series`, `data_points`, `dimensions` and `compound_series` tables. schemas: optional comma-separated filter (e.g. "bls,bea"). full: heavy per-dataset descriptions instead of the compact index.
get_data_catalog
Full metadata for one dataset: topic, methodology, discontinuities, release dates, any base-change notice, plus the live dimensions and example series. Call after `search_datasets` narrows you to a dataset.
describe_dataset
Recent market data the warehouse lags on: quotes, OHLCV, company profiles, FX, and commodities. Set data_type to price_history for stocks, currency pairs, and commodities; the asset format determines which market is queried. Use search_company_filings for financial statements and reported facts.
get_market_data
Get satellite-derived indicators aggregated over a country, one state/province, or a bounding box. Use for fires, emissions-based activity, rainfall, vegetation, temperature, and soil-moisture questions. For a sub-national area, call one state/province at a time. Informal regions such as "north India" or "the Midwest" have no boundary, so cover them with one call per state or a bounding box; using the whole country answers a different question. Grid cells and fire detections are activity snapshots, never fire perimeters. For ndvi_s2 and *_tropomi grids, drop or flag cells with low valid_obs_share. Results include units, source attribution, and caveats; cite the attribution. External-provider calls can take about 30 seconds, and rainfall or grid calls can take longer.
get_geo_data
Fetch one series' data: timeseries, tabular, or COMPOUND:: all work. Returns title, units, frequency, notes and data points, with source metadata. At most 50 points come back; if the series is longer the result is flagged `"truncated": true` — narrow it with `from_year`/`to_year`, or pull the series through `run_sql` with an aggregation (e.g. monthly/quarterly via `date_trunc`) rather than trying to fetch every point.
get_series
Render a FactIQ-styled interactive chart inline, from data you have already fetched. Before calling, finish all data retrieval, calculations, source reconciliation, and title/value checks. For each intended chart, call this tool exactly once, only after its data and title are final; never render a draft and then re-render a correction. Build the final numbers from run_sql / get_series, aggregated to chart resolution. - x_values: the x axis — ISO dates ("2024-01-01") or categories, sorted. These are the positions; keep them as real ISO dates for date axes so the axis spaces correctly. - series: one or more {label, values}; each `values` list lines up 1:1 with x_values (use null for gaps, don't drop entries). - chart_type: "line" (default), "bar", or "area". - units: y-axis units, e.g. "Percent". Axis-label control (both optional — leave unset for normal date axes, which auto-format to the most compact form, e.g. '24 or Jul 24): - x_tick_format: hint the date granularity — "auto" (default), "year", "quarter", "month", or "date". Use e.g. "quarter" to label quarterly points "Q1 '24", or "date" to force full dates. The widget still chooses how many labels fit and spaces them; this only sets the text. - x_labels: fully custom tick text, one per x_value (1:1 with x_values), for labels the widget can't infer — e.g. fiscal quarters ["Q2 FY19", …, "Q2 FY26"] or custom category names. Takes precedence over x_tick_format. x_values still drives positioning; x_labels is only the text. Don't use this just to reformat dates — prefer x_tick_format. Give the chart a finding-style title with the numbers in it (see the chart style guide). Keep it to a handful of series and a few hundred points at most — aggregate in SQL first if needed.
render_chart
Run a read-only SELECT against the FactIQ data warehouse, scoped to one schema — the power tool for joins, pivots and aggregation. Read-only role, 30s statement timeout, with FactIQ's query transforms and series-metadata enrichment. Resolve ids from `series` before filtering `data_points`. `auto_retry=true` opts into a server-side reviser on zero rows. See the `factiq://guide/sql` resource. Returns at most 50 rows. If the query matches more, the result is flagged `"truncated": true` — that is your cue to **aggregate or compute in SQL** (`GROUP BY`, `date_trunc`, a SUM/AVG/rank/ratio) and return that, NOT to try to fetch the raw rows. A chart or a summary needs the aggregated result, and large raw results don't fit in context anyway. `page` is the one exception and works only on the `nasa_fires` schema, where a row is a single fire detection that belongs to no series and so cannot be aggregated into one. Each page holds 50 rows; the answer carries `page` and `has_more`, and you read the next block with `page=2`, `page=3` and so on. Give the query an ORDER BY, otherwise Postgres may return the same row on two pages and never return another. Still prefer a count or a total when that answers the question — paging through thousands of detections does not. Runs through FactIQ's read-only database role, which rejects any attempt to modify data (INSERT/UPDATE/DELETE/DROP/…).
run_sql
Find datasets by keyword across every schema — the first discovery step. Keyword ranking (not semantic) over dataset titles and topics. Returns ranked {schema, dataset_code, title, topic}. Follow up with `describe_dataset` for detail, or `run_sql` on the series/dimensions tables for exact series.
search_datasets
Search earnings-call intelligence from live calls, decomposed into atomic, quote-anchored claims and Q&A pressure points — never a raw transcript dump. Retrieval for "claims" and "pressure_points" is lexical, not semantic. A nonempty query uses an OR-of-tokens full-text candidate set; strict websearch_to_tsquery matches receive a fixed ranking boost, so strict matches rank ahead of loose partial-term matches. Lower-ranked rows may match only some query terms. If that filtered full-text search returns no rows, a trigram fallback handles typos and sub-word variants. Quoted phrases use websearch syntax, but synonyms are not inferred: try the company's own vocabulary ("capex" and "capital expenditure", segment names, abbreviations). An empty or partial result is not proof that management did not discuss a topic; coverage and vocabulary both matter. Target and filter semantics: - "claims" (default) searches or browses normalized management/analyst claim rows. company_filter, quarter_filter, claim_family, section, detail, and limit apply. claim_family matches primary or secondary families; section is "prepared_remarks" or "qa". Base rows include direction/value/unit where checkable, assertion_status, canonical_statement, verbatim_quote, speaker, speaker_role, and section. - "pressure_points" searches or browses what analysts pressed for and whether management confirmed, declined, deflected, or partially answered. company_filter, quarter_filter, claim_family (the linked family), detail, and limit apply. section is ignored because every pressure point is from Q&A. Base rows include specific_ask, response_quality, refused_number, linked_family, linked_claim_id, and verbatim_quote. - "disclosure_profile" is a direct company lookup, not text search. The ticker is the first company_filter value, or query when company_filter is empty. Profiles are curated separately from transcript coverage, so a covered company may not have one; availability is "available" or "unavailable" accordingly. quarter_filter, claim_family, section, detail, and limit do not narrow it. - "coverage" is corpus inventory, not text search. company_filter and limit apply; query, quarter_filter, claim_family, section, and detail do not narrow it. Rows report calls_covered, earliest_period, latest_period, latest_call_date, claims, and pressure_points. An empty query is a capped browse, not a completeness guarantee. Rows are ordered by newest fiscal period/call and then source-block (spoken) order within one call. Every response is limited to at most 50 rows, and a browse that reaches its limit may omit additional rows even if no truncation flag is present. For a latest-call note: (1) call "coverage" with one ticker, (2) read latest_period, (3) call "claims" with that ticker, quarter_filter=latest_period, query="", detail=true, and a deliberate limit, then (4) call "pressure_points" with the same ticker and quarter. Treat both browses as capped evidence, not a complete transcript. Narrow large result sets with ticker, quarter, target, claim_family, and (for claims) section; the restricted `transcripts` schema cannot be queried through run_sql. Evidence rules: canonical_statement is normalized and must not be quoted as verbatim. Quote only verbatim_quote, with its speaker, role, ticker, and fiscal period. assertion_status is load-bearing: analyst_hypothesized is the analyst's framing, while mgmt_declined_to_confirm is a refusal, not a management assertion. Spoken call claims are a different source class from filed XBRL actuals (`run_sql` on the `sec` schema) and formally issued targets (the `sec_guidance` dataset); label them separately. Examples: - Latest call: search_earnings_transcripts(query="", search_target="coverage", company_filter="MU"), then repeat with search_target="claims", quarter_filter=<latest_period>, detail=true, limit=50, and finally with search_target="pressure_points" for the same ticker and quarter. - Cross-company theme: search_earnings_transcripts(query="capital expenditure capacity", search_target="claims", company_filter="MU,NVDA", detail=true); inspect each returned row for topical support, do not assume every term matched, and retry vocabulary as needed. - Disclosure habits: search_earnings_transcripts(query="", search_target="disclosure_profile", company_filter="MU"). claim_family codes: driver_attribution, forward_conviction, prior_view_revision, strategic_agreement, pricing_mechanics, demand_magnitude, capacity_milestone, competitive_positioning, cohort_behavior, cost_margin_bridge, capital_allocation, stated_risk_constraint, qa_dynamics, regulatory_policy, pipeline_backlog, commodity_hedging, ma_deal, labor_org. Topic paths (topic_path column) are rooted at: demand, supply_capacity, pricing, cost_margin, capital, competition, customer, product_roadmap, risk, governance.
search_earnings_transcripts
Deterministically search precomputed intelligence from company executives' podcasts, TV interviews, and conference appearances outside earnings calls. No serving-time model interprets or expands the query. Retrieval for structured findings is lexical, not semantic: strict full-text matching is tried first, loose any-term full-text matching only when strict matching returns no candidates, then trigram matching only when both full-text stages are empty. Natural-language questions work because person names and common question scaffolding are normalized. Prefer concise topical terms; retry synonyms or the speaker's own vocabulary before concluding there is no coverage. Canonical search_target values: - "search" (default): blended structured claims and broad passage cards. - "claims": normalized decision-relevant claims only. - "passages": broad substantive paraphrase cards only. - "pressure_points": stored refusal and declined-to-confirm claim rows. - "appearances": video-level catalog rows. - "coverage": company-level structured-corpus inventory. Compatibility aliases remain accepted for older clients: "all" maps to "search", "videos" to "appearances", and "companies" to "coverage". New callers should use the six canonical values; "search" is the primary blended target, not a legacy alias. Result contracts: - search/claims/passages/pressure_points return result_kind, canonical_paraphrase, speaker, primary ticker, topic labels, video/channel/publication metadata, lexical relevance, and a timestamped YouTube URL. detail=true adds normalized claim and attribution fields but never raw transcript text or evidence spans. - appearances returns video metadata, primary ticker, attribution metadata, matching claim count, URL, and relevance score. detail has no effect. - coverage returns company-level appearance, publication-date-span, channel, claim, and low-confidence-attribution counts. It is structured coverage, not a per-person acquired-video/hour inventory; query, sort, and detail have no effect. Filter and ordering semantics: - company_filter is comma-separated exact primary tickers for structured findings. Catalog targets also match exact stored entity-reference tokens. - person is a case-insensitive substring over the finding speaker and/or appearance speaker metadata. appearance_type applies to every target. - claim_family restricts structured claims. With blended search it suppresses passage cards; pairing it with search_target="passages" is an error. For appearances/coverage it requires videos with matching structured claims. - date_from/date_to are inclusive YYYY-MM-DD bounds on the video's stored publication/upload date, which can differ from the recording or event date. - relevance orders lexical score first, then publication date; newest orders publication date first, then lexical score. Coverage has fixed inventory ordering by latest covered publication date. With an empty query, search and claims browse recent high-signal claims without generic passage cards; passages browses recent passage cards; pressure_points browses recent refusal rows; appearances browses the video catalog; coverage returns the company inventory. Each result set is capped at 1-50 rows. Evidence safety: canonical_paraphrase is a normalized paraphrase, not a transcript quotation. Cite the timestamped YouTube URL with the returned speaker, publication date, and video metadata. Do not put canonical_paraphrase in quotation marks unless you independently verify the wording at the source link. The tool never returns raw transcript text. Detail-field safety: detail adds normalized claim fields only. The extraction pipeline's internal audit flags are not published, because they describe how a row was built rather than anything checkable about the claim; judge a claim from value, assertion_status, and the timestamped source link instead. company_attribution_confidence and company_attribution_source concern only the video-to-company/ticker assignment; inferred attribution is not independent confirmation.
search_media_appearances
Search the curated news feed FactIQ continuously ingests: Bloomberg, the Financial Times, and the Wall Street Journal RSS sections, plus India-macro (Zerodha Daily Brief, ET HealthWorld) and global-health sources (WHO, ECDC, CDC MMWR, STAT, KFF, and others). Each result is the article's headline, its short publisher-written summary, and the link to the publisher — full article bodies are never stored or returned — plus FactIQ-derived metadata: tickers of listed companies explicitly named in the text ({symbol, exchange, country}) and an `analysis` block: keywords, a geography, and an `angle` — one sentence on why the story matters to an investor. Pivot macro stories into search_series / run_sql, and company stories into get_market_data / search_earnings_transcripts / run_sql on the sec schema. Coverage is recent news, not an archive: most feeds start late 2025 to mid 2026 (Bloomberg back to Dec 2024). All arguments combine (AND). - query: full-text search over headline + summary. Lexical, not semantic — every word must match, so start with ONE distinctive term ("Novartis", "copper") and add words only to narrow. If a multi-word query matches nothing, the tool automatically retries matching ANY of the words, ranked so rare words and multi-word matches come first (meta.query_mode = "any_term" when that happened). Supports quoted "exact phrases" and -exclusion. - tickers: match articles naming any of these companies (bare symbols, e.g. ["NVDA", "RELIANCE"]). Share classes and cross-listings of major companies match automatically (GOOG also matches GOOGL; TSM also matches its Taiwan listing 2330) — pass whichever symbol you know. Most macro stories legitimately name no listed company. - topic: one of markets, economics, companies, technology, politics, world, energy, health, india, opinion. Combined with a query, topic is a ranking preference — articles from that topic's feeds rank first, but matches from other sections still return (feed sections are coarse; an energy story often runs in a markets feed). Without a query it is a hard filter on the topic's feeds. - start_date / end_date: ISO dates (YYYY-MM-DD) on publication time, inclusive. Start wide or omit; narrow only after seeing results. - sources: publisher slugs, any of bloomberg, cdc-mmwr, ecdc, et-healthworld, fierce-pharma, ft, global-fund, kff, stat-news, un-news, who, wsj, zerodha. - sort: "latest" (default, newest first) or "relevance" (text-match rank; needs a non-empty query, otherwise falls back to latest). - limit: max rows (1-50, default 20). Returns {rows: [{id, published_at, source, feed, topics, title, summary, url, tickers, analysis}], meta: {matched, returned, sort, query_mode?, topic_mode?}}. `analysis` is null for articles not yet analysed or with no business/economic content.
search_news
This is FactIQ's central tool for company filings. It searches structured facts and report metadata from one company's filed reports, for every company in the filings store: US SEC filers (10-K, 10-Q, 8-K, plus 20-F, 40-F, 6-K for foreign filers) and companies listed in Germany (annual, half-year, Q1, and Q3 reports, with values in EUR; for example company="BAS" for BASF SE). The search is deterministic and does not call a language model. Every successful response is a tree and does not expose database row IDs. Set format="json" for the structured tree field. Set format="pretty" for only a human-readable rendered_tree text. The two formats are never returned together. Use an exact ticker when possible. A company name is accepted only when it identifies one issuer. A share-class sibling ticker resolves to the same SEC filer (for example GOOGL resolves to the stored GOOG). If a ticker has several exact matches, possible_matches lists every tied company and its identifiers. When nothing matches, possible_matches lists the closest stored companies. concept selects one registered financial concept and returns it over time. For example, concept="revenue" selects the best revenue concept stored for that company. The response states the selected concept. Use query instead for a broad search across several concepts. search_target controls the tree content. coverage shows available report types and dates. filings shows report records and source URLs. metrics shows available concepts, dimensions, units, and period coverage. facts shows reported numeric values. An empty facts browse is filing-first. A facts search with query or concept is concept-first so that values across reporting periods stay together. query searches concept names, source labels, source codes, XBRL concepts, aliases, definitions, and segment names. Filters are applied before search. report_type accepts a common report type (annual, quarterly, half_year) or a source form such as 10-K or 10-Q. For German filers, quarterly covers the Q1, half-year, and Q3 reports. fiscal_year and fiscal_period accept company reporting labels such as 2026 and Q3. Earnings 8-Ks take their quarter from the 10-Q or 10-K whose period ended within the 80 days before the 8-K, and keep the 8-K filing date as the reported date. A freshly announced 8-K whose periodic filing has not arrived yet carries a quarter estimated from the company's fiscal calendar, replaced by the exact period when the filing lands. If neither is available, the tool omits the fiscal label instead of guessing. Some companies file the same concept twice for one period and segment — for example a gross segment total next to a net-of-eliminations figure. Both are served: the extra line is its own series node whose name ends in "(reported line 2)", and its evidence_note says so. The two lines are alternative statements of the same item. Never add a "reported line 2" series to its ordinary counterpart — that double-counts. For non-admin callers, active_only is always enforced by the tool endpoint. With active_only enabled, every target is limited to facts currently marked active and serving; coverage and filings omit reports with no such facts. If an exact-ticker metrics or facts request has no matching serving data, the tool falls back to Twelve Data standardized consolidated statements. Resolved non-US issuers require an exchange-qualified ticker for this fallback. Company names and bare tickers without a resolved US issuer remain filings-database-only so vendor data cannot be attributed to a different issuer with the same ticker. A request that names no report_type or fiscal_period tries quarterly statements and then annual, so annual-only vendor coverage still answers. A concept the filings database already holds is never answered from the vendor, even when the other filters leave no rows. Fallback values carry no filing-document, source-page, or segment evidence. coverage, filings, and segment-filtered requests remain filings-database-only.
search_company_filings
Find series in one schema by title terms (substring match, not semantic). Supply already-decomposed terms; prefer short stems (e.g. "rare" over "rare earth"). Includes active COMPOUND:: series. For anything this misses, fall back to `run_sql` exploration on the `series` and `dimensions` tables.
search_series
Report a problem with FactIQ's data or tools to the FactIQ team. Call this when a tool result looks broken: - "data_issue" — a value that contradicts the official source, wrong units or scale, duplicated or missing periods, an obviously wrong label. - "tool_error" — a tool that errors, times out repeatedly, or returns malformed or self-contradictory results. - "missing_data" — a dataset or series the catalog advertises but that returns nothing, or coverage that ends far earlier than the source's. - "other" — anything else worth telling the team (confusing docs, a gap that forced a workaround). Write one short, specific message with the concrete identifiers: the schema, dataset_code or series_id, the SQL you ran, and what you expected vs. what you got (with the official source's value or URL if you have one). Do not include the user's personal details or your conversation. This is one-way: the FactIQ team reviews every report, but nothing comes back to you. File it and continue with the user's task — never block on it.
send_feedback
Fetch FactIQ's house-style authoring guides so anything you build matches FactIQ's conventions and look. Call this before producing a chart, a report, or written analysis from FactIQ data, and follow what it returns. By default, use FactIQ's style for all FactIQ work unless the user asks otherwise. You can fetch several at once. Pass any combination of: - "chart" — how to build and style a FactIQ chart: which chart type, finding- style titles, data hygiene, the FactIQ colour palette and plot surface, and sourcing - "report" — report structure, voice, and per-chart sourcing - "sql" — query idioms and pitfalls for FactIQ's tables - "earnings" — quoting discipline, spoken-vs-filed sourcing, guidance tables, and claim-verification patterns for anything built from search_earnings_transcripts - "all" — every guide Returns each requested guide's markdown text, keyed by name. This is free — it does not count against your tool quota.
get_style_guides
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are FactIQ alternatives on ChatGPT?
As of 2026-09-17, FactIQ competes with ABRAMS Trade Intelligence, CE Cosmos Deep Dive, CE Cosmos Signal, Clutch.co, Company Dossier, Comscore, Crunchbase, D&B Finance Analytics, Dcipher Analytics, DiligenceSquared, Dow Jones Factiva, Economic Mind, GlobalSource Partners, Grata EU, Iceflower, Impala, InfoTrack.ai, JARS LT, JoomPulse, Kindora, Lux AI, Noah, Nogogo AI, Partnership Leaders Research, Pi by Placer.ai, PolicyNote, Powerset Research, SmartCustomer, Songstats, Soundcharts, Tembi Intelligence, Trace, Website Launches, Windsock, ZINT in ChatGPT Market & Competitive Intelligence Data, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.