FINRA OTC Weekly
Weekly off-exchange share volume per security from FINRA's OTC Transparency data.
finra_otc_weekly — the dataset name to pass to the Obscura API.
What one row means
One venue-and-security weekly off-exchange volume summary from FINRA's OTC Transparency (weeklySummary) API: the total shares, trade count, and notional that one market participant (ATS or non-ATS OTC firm, identified by MPID) executed in one symbol during one calendar week (Monday-start), split into either the ATS (dark-pool) or non-ATS OTC summary type. Keyless FINRA Query API; only firm-level rows (both MPID and symbol present) are kept, symbol-only aggregate rows are dropped.
One row per (period_start, summary_type_code, mpid, symbol).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For finra_otc_weekly: release_calendar: available_date = period_start + 34 days (FINRA's ~2-3 week OTC Transparency publication lag after the reporting week's Monday start).
Refresh cadence
Obscura refreshes finra_otc_weekly every weekday — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 16 columns
The full public column list for finra_otc_weekly, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/finra_otc_weekly.
| Column | Type | Description |
|---|---|---|
| period_start | date · not null | The FINRA weekStartDate (Monday the reporting week begins) — the natural reporting-period column the row's volume was measured over. Part of the composite primary key. |
| summary_type_code | text · not null | FINRA's report-type flag: "ATS_W_SMBL_FIRM" for the dark-pool ATS weekly summary, "OTC_W_SMBL_FIRM" for the non-ATS off-exchange OTC weekly summary. Part of the composite primary key. |
| mpid | text · not null | FINRA Market Participant ID of the reporting venue/firm — identifies the specific ATS or non-ATS OTC market maker that executed the volume. Part of the composite primary key. |
| symbol | text · not null | The traded equity ticker symbol. Part of the composite primary key. |
| participant_name | text | Human-readable display name of the reporting venue/firm; nullable — FINRA omits it for some non-ATS OTC rows. |
| tier | text | NMS listing tier of the security: T1 (NMS Tier 1), T2, OTCE, etc. Nullable — absent on some non-ATS OTC rows. |
| share_quantity | bigint | Total shares this MPID executed in this symbol during the reporting week. Nullable when FINRA omits the field; updated on conflict. |
| trade_count | bigint | Total number of trades (executions, not shares) this MPID reported in this symbol during the week. Nullable when omitted; updated on conflict. |
| notional | double precision | Total dollar value (share price x volume, summed across the week's trades) this MPID executed in this symbol. Nullable when omitted; updated on conflict. |
| initial_published_date | date | FINRA's ACTUAL first-publication date for this row (raw `initialPublishedDate`, e.g. `2026-06-08`) — the true point-in-time public-availability date, as opposed to the estimated `available_date` (= period_start + 34 days) generated column. Canonical `available_date` is reserved for that generated column (singular per dataset), so this carries no canonical. Nullable; refreshed on conflict. |
| last_update_date | date | Date FINRA last restated/updated this row (raw `lastUpdateDate`) — revisions arrive after first publication; the provenance/vintage marker for detecting restatements, distinct from `initial_published_date`. Nullable; refreshed on conflict. |
| last_reported_date | date | The last trade/report date observed within the reporting week (raw `lastReportedDate`) — the real-world last-activity event date, finer than the Monday `period_start`. Nullable; refreshed on conflict. |
| issue_name | text | Security display name (raw `issueName`, e.g. "Apple Inc. Common Stock"); canonical security/entity name to resolve/verify the symbol and for human-readable output. Nullable. |
| firm_crd_number | text | Reporting firm's CRD (Central Registration Depository) number (raw `firmCRDNumber`) — the FINRA/BrokerCheck firm join key. Usually null on these symbol rows, populated on firm-aggregate rows. Nullable. |
| product_type_code | text | Tape/product category (raw `productTypeCode`: `UTP`, `CTS`, `OTC`, …) indicating which market plan the security trades under — distinguishes NMS UTP vs CTS vs OTC issues. Nullable. |
| available_date | date · not null | PUBLIC-availability date = period_start + 34 days, FINRA's researched OTC Transparency release-calendar lag. DB-generated (STORED), read-only; the point-in-time column to filter/join on — never period_start itself. |
Access finra_otc_weekly
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="finra_otc_weekly",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the finra_otc_weekly dataset?
Weekly off-exchange share volume per security from FINRA's OTC Transparency data. One venue-and-security weekly off-exchange volume summary from FINRA's OTC Transparency (weeklySummary) API: the total shares, trade count, and notional that one market participant (ATS or non-ATS OTC firm, identified by MPID) executed in one symbol during one calendar week (Monday-start), split into either the ATS (dark-pool) or non-ATS OTC summary type. Keyless FINRA Query API; only firm-level rows (both MPID and symbol present) are kept, symbol-only aggregate rows are dropped.
How do I avoid look-ahead bias with finra_otc_weekly?
Filter on finra_otc_weekly.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — release_calendar: available_date = period_start + 34 days (FINRA's ~2-3 week OTC Transparency publication lag after the reporting week's Monday start). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get finra_otc_weekly?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="finra_otc_weekly". The column schema is public at https://api.obscura.trade/v1/catalog/finra_otc_weekly.
Can I filter finra_otc_weekly by company or symbol?
Yes. finra_otc_weekly carries symbol, the column the API's symbols filter resolves against.
How often is finra_otc_weekly updated?
Obscura refreshes finra_otc_weekly on a every weekday schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.