FactIQ Catalog API

The Catalog API from FactIQ — 13 operation(s) for catalog.

GitHub OpenAPI

Operations 13

GET /catalog/series_counts Get Series Counts #
GET /catalog/schemas Get Schemas #
GET /catalog/search Catalog Search #
GET /catalog/datasets/{schema} Get Datasets #
GET /catalog/datasets/{schema}/{dataset_code} Get Dataset Detail #
GET /catalog/sample/{schema}/{series_id} Get Series Sample #
GET /catalog/series/{schema} List Series #
GET /catalog/facets/{schema}/{dataset_code} Get Dataset Facets #
GET /catalog/sparklines/{schema} Get Sparklines #
GET /catalog/companies List Markets #
GET /catalog/companies/{slug} List Market Companies #
GET /catalog/companies/{slug}/{ticker} Get Company #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/factiq-com:factiq-com-catalog-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

factiq-com-catalog-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: FactIQ Catalog API
  description: Programmatic access to curated economic time series data sourced from the BLS, Census, BEA, and OEWS pipelines. Endpoints cover direct series lookups, authentication, and MCP-based data tools for analysis.
  contact:
    name: FactIQ
    url: https://www.factiq.com/contact
  version: 1.0.0
tags:
- name: Catalog
paths:
  /catalog/series_counts:
    get:
      tags:
      - Catalog
      summary: Get Series Counts
      description: 'Latest series count per schema, plus the grand total.


        Only publicly visible schemas are counted, so this endpoint and

        `/catalog/schemas` describe the same set of sources — a hidden or

        admin-only schema is not named here either.


        Response: {"counts": {schema: count, ...}, "total": int,

        "counted_at": ISO timestamp of the newest snapshot | null}'
      operationId: get_series_counts_catalog_series_counts_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /catalog/schemas:
    get:
      tags:
      - Catalog
      summary: Get Schemas
      description: 'Every publicly visible schema with its identity, summary and counts.


        Response: {"schemas": [{schema, organization, country, acronym, summary,

        dataset_count, series_count, has_series_tables}],

        "tables": TABLE_REFERENCE, "example_sql": str,

        "counted_at": str | null}


        `dataset_count` is the number of datasets loaded in the database when that

        has been computed (see `_db_dataset_counts`), else the number described in

        the catalog metadata; any schema still on the metadata figure is queued

        for a background warm.'
      operationId: get_schemas_catalog_schemas_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /catalog/search:
    get:
      tags:
      - Catalog
      summary: Catalog Search
      description: Search public datasets and companies with verified FactIQ holdings.
      operationId: catalog_search_catalog_search_get
      parameters:
      - name: q
        in: query
        required: true
        schema:
          type: string
          minLength: 1
          maxLength: 200
          title: Q
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 50
          minimum: 1
          default: 20
          title: Limit
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/datasets/{schema}:
    get:
      tags:
      - Catalog
      summary: Get Datasets
      description: 'Datasets loaded in one schema: [{dataset_code, title, topic,

        series_count}] sorted by title.


        Described-but-unloaded datasets are dropped; loaded-but-undescribed ones

        are included with their code as the title. If the database cannot be

        reached the described list is returned without counts.'
      operationId: get_datasets_catalog_datasets__schema__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/datasets/{schema}/{dataset_code}:
    get:
      tags:
      - Catalog
      summary: Get Dataset Detail
      description: 'Full detail for one dataset: topic, methodology, live dimensions and

        example series. Cached for six hours — the dimension scan can be slow on

        the largest schemas.'
      operationId: get_dataset_detail_catalog_datasets__schema___dataset_code__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: dataset_code
        in: path
        required: true
        schema:
          type: string
          title: Dataset Code
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/sample/{schema}/{series_id}:
    get:
      tags:
      - Catalog
      summary: Get Series Sample
      description: 'A series'' catalog row plus its most recent rows.


        Response: {"series": {...series columns...}, "columns": [...],

        "rows": [[...], ...], "total_rows": int}'
      operationId: get_series_sample_catalog_sample__schema___series_id__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: series_id
        in: path
        required: true
        schema:
          type: string
          title: Series Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/series/{schema}:
    get:
      tags:
      - Catalog
      summary: List Series
      description: 'The series of one dataset, in pages.


        Response: {"schema", "dataset_code", "query", "dimension_type",

        "dimension_code", "series": [{series_id, title, units, frequency,

        seasonally_adjusted, state, county_or_metro_area, begin_time, end_time,

        data_type}], "offset", "limit", "has_more", "total", "order", "ranking",

        "error"}.


        ``total`` is the dataset''s series count when nothing is filtered, the

        number of matches when a filter is set and counting them finished in

        time, else null. ``error`` is set, with an empty list, when the

        statement exceeded its time limit on a very large dataset.


        ``order=storage`` (the default) pages through the matches in series_id

        order. ``order=headline`` pages through the first 480 matches in that

        order ranked the way the dataset''s example series are picked: the series

        that report every period up to the dataset''s latest date come first, one

        per group of near-identical titles before any group''s second. When the

        dataset has a hand-picked list of headline series (``headline_series`` in

        dataset_catalog) and nothing is filtered, those come first in their

        curated order and the ranked series follow. ``ranking`` says what the

        page is: ``curated`` when it starts with the hand-picked list, ``ranked``

        when every match was scored, ``sampled`` when only the first 480 of more

        matches were, ``storage`` when the order is storage order (asked for, or

        the ranking exceeded its time limit).'
      operationId: list_series_catalog_series__schema__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: dataset
        in: query
        required: true
        schema:
          type: string
          minLength: 1
          maxLength: 64
          title: Dataset
      - name: q
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            maxLength: 120
          - type: 'null'
          title: Q
      - name: dimension_type
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            maxLength: 64
          - type: 'null'
          title: Dimension Type
      - name: dimension_code
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            maxLength: 120
          - type: 'null'
          title: Dimension Code
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          default: 50
          title: Limit
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          maximum: 5000
          minimum: 0
          default: 0
          title: Offset
      - name: order
        in: query
        required: false
        schema:
          type: string
          pattern: ^(storage|headline)$
          default: storage
          title: Order
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/facets/{schema}/{dataset_code}:
    get:
      tags:
      - Catalog
      summary: Get Dataset Facets
      description: 'Frequencies, date range and the common dimension values of a dataset.


        Response: {"schema", "dataset_code", "summary": {frequencies: [{frequency,

        series_count}], begin_time, end_time, series_count, sampled?,

        sample_size?, error?}, "facets": [{dimension_type, distinct_values,

        sampled, values: [{code, name, series_count}]}], "error"?}.


        Cached for six hours. On the largest datasets the exact grouping exceeds

        the time limit and the values come from a sample of the series, marked

        ``sampled``; a dataset without series answers 404.


        With ``summary_only=true`` the dimension values are not computed and

        ``facets`` is empty. Grouping the dimension rows is the slow part on the

        largest datasets (up to 37 million rows), so a caller that only shows the

        summary should ask for it alone. A full cached response answers such a

        request too; a summary-only response is cached under its own key and is

        never served to a request that wants the values.'
      operationId: get_dataset_facets_catalog_facets__schema___dataset_code__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: dataset_code
        in: path
        required: true
        schema:
          type: string
          title: Dataset Code
      - name: summary_only
        in: query
        required: false
        schema:
          type: boolean
          default: false
          title: Summary Only
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/sparklines/{schema}:
    get:
      tags:
      - Catalog
      summary: Get Sparklines
      description: 'The last sixty observations of up to twenty-four series of a schema.


        ``ids`` is repeated (``?ids=A&ids=B``); duplicates are dropped and the

        order is kept. Response: {"schema", "series": {series_id: {title, units,

        frequency, data_type, points: [[date, value], ...] oldest first,

        first_time, latest_time, latest_value}}, "missing": [ids not in the

        schema], "error"?}. A tabular series has no points. Each series is cached

        for an hour under the schema''s series generation, so a load of new data

        replaces it at once.'
      operationId: get_sparklines_catalog_sparklines__schema__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: ids
        in: query
        required: true
        schema:
          type: array
          items:
            type: string
          title: Ids
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/related/{schema}/{series_id}:
    get:
      tags:
      - Catalog
      summary: Get Related Series
      description: 'The eight series of the same dataset most like one series.


        The candidates are the 24 series on each side of it in series_id order

        (ids of one dataset are built from the same code parts, so neighbours

        share area, measure or product). Each is scored on shared frequency,

        state, county and title words; the best eight are returned as listing

        rows. Response: {"schema", "series_id", "dataset_code", "dataset_title",

        "related": [rows], "error"?}. 404 when the series does not exist. Cached

        for six hours.'
      operationId: get_related_series_catalog_related__schema___series_id__get
      parameters:
      - name: schema
        in: path
        required: true
        schema:
          type: string
          title: Schema
      - name: series_id
        in: path
        required: true
        schema:
          type: string
          title: Series Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/companies:
    get:
      tags:
      - Catalog
      summary: List Markets
      description: 'Every filing market with its company and report counts.


        Response: {"markets": [{key, slug, country_code, country, regulator,

        company_count, filing_count, first_period, last_period,

        companies_with_calls, companies_with_media}],

        "basis": str, "counted_at": ISO timestamp}


        Markets are in a fixed order (United States first); a market with no

        company is listed with zero counts.'
      operationId: list_markets_catalog_companies_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /catalog/companies/{slug}:
    get:
      tags:
      - Catalog
      summary: List Market Companies
      description: 'Every company of one market that has a filing or an earnings call.


        Response: {"market": {...}, "companies": [{ticker, name, country_code,

        filing_count, first_period, last_period, transcript_count,

        appearance_count}], "basis": str, "counted_at": str}


        A company without a ticker in this market is left out, because its page

        could not be addressed; the count of such rows is logged.'
      operationId: list_market_companies_catalog_companies__slug__get
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /catalog/companies/{slug}/{ticker}:
    get:
      tags:
      - Catalog
      summary: Get Company
      description: 'Exactly what FactIQ holds for one company of one market.


        The ticker is resolved against the securities of that market, so the

        same company can be reached as ``united-states/TM`` and ``japan/7203.T``;

        both pages show every market''s reports. 404 when the market or ticker is

        unknown. Only counts, names, periods, source links and the filing-backed

        headline figures (``headline_figures``) are returned.'
      operationId: get_company_catalog_companies__slug___ticker__get
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: ticker
        in: path
        required: true
        schema:
          type: string
          title: Ticker
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer