OQRO REST API

Read-only JSON for insider trades, politician trades (Congress), 13F fund moves, federal contracts, lobbying, prices and a screener. Every row carries source_url, the official record, and oqro_url, the matching OQRO page. It is the same data as the MCP server, for your own code.

Base URL https://oqro.io/api/v1. The API is part of OQRO Pro. This page is public; every request needs a key from a member account with an active subscription.

Quick start

  1. Unlock OQRO Pro, or log in.
  2. Open API keys, name a key and copy it. It is shown once.
  3. Send it in the Authorization header.
export OQRO_API_KEY=oqro_...

curl "https://oqro.io/api/v1/insider-trades?ticker=NVDA&side=sell&days=180&limit=5" \
  -H "Authorization: Bearer $OQRO_API_KEY"

Authentication

Send the key as Authorization: Bearer oqro_..., or in an X-API-Key header. If both are present, Authorization is used. Keys are personal: they act for your account, and the API stops answering if your subscription ends. OQRO stores only a one-way hash of a key, so a lost key cannot be recovered: revoke it and create another. You can hold 5 active keys.

Call the API from your servers or notebooks. Do not put a key in a web page or an app you distribute: the API does not send CORS headers, on purpose.

Endpoints

All endpoints are GET. Responses are JSON and are never cached. The same endpoints are described in an OpenAPI file you can import into Postman or a code generator.

GET /api/v1/companies/{ticker}

One company: profile, latest close and 12-month change next to the S&P 500, annual revenue and net income from SEC filings, latest FINRA short interest, and counts of recent disclosures.

No query parameters.

curl "https://oqro.io/api/v1/companies/AAPL" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/companies/{ticker}/context

What has been happening at one company, in one answer: its latest weekly note written from OQRO's own facts, its recent Form 8-K reports (executive changes, results, auditor and listing notices, deals) with the company's own opening sentence, mergers and acquisitions it is part of, and its 30 and 90 day price moves. Descriptive only: it never says why anyone traded.

days int
How far back the Form 8-K reports and deals go, 7 to 365 (default 120).
curl "https://oqro.io/api/v1/companies/AAPL/context" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/insider-trades

SEC Form 4 insider trades (open-market purchases and sales by default) or Form 144 notices of planned sales, newest filing first.

ticker string
A covered ticker, for example AAPL. Omit for the whole market.
side string
buy or sell. Omit for both.
kind string
open_market (default), form144 (a notice of a planned sale, not a completed one) or all (adds grants, option exercises, tax withholding, gifts).
days integer
Look back this many days by filing date. 1 to 730, default 90.
min_value number
Minimum transaction value in US dollars.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/insider-trades?ticker=NVDA&side=sell&days=180&limit=10" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/congress-trades

Stock transactions disclosed by members of Congress in periodic transaction reports (House Clerk and Senate eFD), newest disclosure first. Amounts are the official ranges.

ticker string
A covered ticker, for example AAPL. Omit for all companies.
member string
Part of the member's name, for example Pelosi.
side string
buy or sell (sell includes partial sales). Omit for all, exchanges included.
days integer
Look back this many days by disclosure date. 1 to 730, default 180.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/congress-trades?ticker=MSFT&days=365" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/fund-moves

Position changes disclosed in SEC Form 13F by the managers OQRO follows (well-known funds first when no ticker or fund is given), newest filing first.

ticker string
A covered ticker, for example AAPL. Omit for all companies.
fund string
Part of the manager's name, for example Berkshire.
change string
new, increased, reduced or exited. Omit for all.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/fund-moves?fund=Berkshire&change=new" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/contracts

Prime federal contract awards mapped to covered public companies (USAspending.gov), newest first. Grants and loans are excluded.

ticker string
A covered ticker, for example AAPL. Omit for all companies.
days integer
Look back this many days by action date. 1 to 730, default 365.
min_amount number
Minimum obligated amount in US dollars.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/contracts?ticker=LMT&min_amount=100000000" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/lobbying

Federal lobbying spending for one company from Lobbying Disclosure Act reports (lda.gov). The rows are the individual reports, newest first; the quarter totals are in meta.quarter_totals.

ticker string, required
A covered ticker, for example AAPL.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/lobbying?ticker=MSFT" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/prices/{ticker}

Daily, weekly or monthly closing prices for one company next to the S&P 500 (SPY). The rows are the points; meta holds the period's change, high, low and drawdown. About two years of history are stored. Not paginated.

days integer
Look back this many calendar days. 5 to 750, default 365.
interval string
daily, weekly or monthly. Default: daily up to 120 days, weekly up to 400, monthly beyond.
include_sp500 boolean
Add the S&P 500 close to each point and its change over the period. Default true.
curl "https://oqro.io/api/v1/prices/AAPL?days=90&interval=weekly" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/screen

Filter and sort every covered company (about 850) on published numbers. All filters combine with AND; a company with no figure for a filtered number is left out, never counted as zero.

sector string
GICS sector, for example Health Care or Energy.
min_market_value / max_market_value number
Market value in US dollars (latest close times shares outstanding).
min_change_12m / max_change_12m number
Price change over 12 months, in percent (negative allowed).
min_vs_sp500_12m / max_vs_sp500_12m number
Percentage points ahead of (+) or behind (-) the S&P 500 over 12 months.
within_pct_of_12m_high number
At most this many percent below the 12-month high.
at_least_pct_below_12m_high number
At least this many percent below the 12-month high.
min_insider_purchases_90d integer
At least this many open-market insider purchases of $10K or more in the last 90 days.
min_congress_purchases_90d integer
At least this many Congress purchases disclosed in the last 90 days.
min_fund_adds_180d integer
At least this many 13F new or increased positions disclosed in the last 180 days.
has_federal_contracts_90d boolean
true: at least one federal contract award in the last 90 days.
profitable boolean
true: positive net income in the last fiscal year.
positive_free_cash_flow boolean
true: operating cash flow minus capital expenditure above zero in the last fiscal year (not returned for banks and insurers).
net_cash boolean
true: more cash than debt at the latest report (not for banks and insurers).
min_days_to_cover number
Minimum FINRA short-interest days to cover.
sort_by string
One of market_value, change_12m, vs_sp500_12m, change_90d, vs_12m_high, insider_purchase_value_90d, insider_purchases_90d, congress_purchases_90d, fund_adds_180d, revenue, net_margin, free_cash_flow, days_to_cover, ticker. Default market_value.
direction string
desc (default) or asc.
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/screen?sector=Health%20Care&profitable=true&at_least_pct_below_12m_high=30&sort_by=market_value" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/leaderboard

Members of Congress or insiders ranked by how their disclosed purchases did against the S&P 500 (SPY) after they were reported: median relative return at 30, 90 and 180 days, share ahead of the index at 90 days, and the equal-weight $1,000 Mirror. At least 5 purchases measured at 90 days. meta.caveats holds the method and limits; past results describe the past.

kind string
politician (default) or insider.
sort string
best (default), worst (both by median 90-day relative return) or active (by number of purchases).
chamber string
house or senate (politicians only).
limit integer
Rows per page, 1 to 100. Default 25.
cursor string
The pagination.next_cursor of the previous page, unchanged. Keep the same filters.
curl "https://oqro.io/api/v1/leaderboard?kind=politician&sort=best&limit=10" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/compare

Two covered companies side by side: the same facts as the company endpoint for each, with the OQRO comparison page when one exists.

a string, required
First ticker, for example NVDA.
b string, required
Second ticker, for example AMD.
curl "https://oqro.io/api/v1/compare?a=NVDA&b=AMD" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/baskets

Disclosure baskets: companies that insiders, members of Congress and funds reported buying, held under a written rule, equal-weighted and measured against the S&P 500. Without slug, every basket with its return since start. With slug, the rule, risk figures, monthly returns and the member companies.

slug string
A basket slug, for example insider-buys or congress-buys. Omit to list all baskets.
members integer
Member companies to return with a slug, 1 to 60. Default 25.
curl "https://oqro.io/api/v1/baskets?slug=insider-buys&members=10" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/stats/insider

Insider buying statistics from SEC Form 4 since 2006: purchases, sales, values, buyers and median purchase per year. With year, also who bought, the ten largest purchases and the ten most-bought companies. With sector, that sector's purchases per year.

year integer
One year from 2006, for example 2024. Omit for every year.
sector string
A sector, for example Energy. Not combined with year.
curl "https://oqro.io/api/v1/stats/insider?year=2024" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/stats/congress

Stock trades reported by members of Congress per year from 2021: trades, purchases, sales, members trading, the typical reporting delay and the share filed after 45 days. With year, also the most-traded stocks and most active members. Counts of trades, never dollars.

year integer
One year from 2021, for example 2025. Omit for every year.
curl "https://oqro.io/api/v1/stats/congress?year=2025" \
  -H "Authorization: Bearer $OQRO_API_KEY"

GET /api/v1/calendar

What is coming: S&P 500 earnings dates (announced, never estimated), the main US economic releases and the 13F and 10-Q filing deadlines.

days integer
Days ahead, 1 to 30. Default 14.
kind string
all (default), earnings, economic or deadlines.
ticker string
Only this company's earnings date.
curl "https://oqro.io/api/v1/calendar?days=14&kind=earnings" \
  -H "Authorization: Bearer $OQRO_API_KEY"

CSV export

GET https://oqro.io/api/v1/export returns events as a CSV file (UTF-8 with a byte order mark, a header row, ISO dates). Every row has source_url and oqro_url; official Congress amount bands stay as amount_min_usd and amount_max_usd. A page holds up to 1,000 rows; while the X-Next-Cursor response header is present, send it back as cursor. One query exports at most 10,000 rows. It needs OQRO Pro and counts against the same rate limits.

what string
events (default), person (needs person) or company (needs ticker).
module string
insider, institution, political or contract.
type string
Comma-separated event types, for example insider_open_market_purchase.
ticker / person / member / institution / agency / chamber string
Filters: a covered ticker, a person id, part of a member's name, a fund id, an agency name, house or senate.
min_amount / range / sort number
Minimum amount in US dollars, look-back in days (1 to 3650), latest or relevance.
limit / cursor integer
Rows per page (1 to 1,000) and the cursor from X-Next-Cursor.
curl -OJ "https://oqro.io/api/v1/export?what=events&module=insider&type=insider_open_market_purchase&range=30" \
  -H "Authorization: Bearer $OQRO_API_KEY"

Without OQRO Pro the answer is 402 subscription_required.

Response shape

A list endpoint returns data (an array of rows), pagination and sometimes meta (the filters applied, or totals). /companies/{ticker} returns one object in data. Money is in US dollars, dates are ISO (YYYY-MM-DD), and a missing figure is null, never zero.

Every row of the event endpoints (insider-trades, congress-trades, fund-moves, contracts) and of lobbying has source_url and oqro_url: cite them. Rows that summarize a company (companies, screen) use the SEC filing list as source_url. Price points are a time series: the links are in meta.

{
  "data": [
    {
      "ticker": "AAPL",
      "company": "Apple",
      "headline": "Chair sold ~$29.4M of AAPL shares in the open market",
      "source_url": "https://www.sec.gov/Archives/edgar/data/320193/000114036126038674/0001140361-26-038674-index.htm",
      "oqro_url": "https://oqro.io/events/3ab64ec9-e03c-515f-978f-1efa1438cc7b",
      "type": "open_market_sale",
      "insider": "Timothy D Cook, Executive Chair",
      "transaction_date": "2026-10-02",
      "filing_date": "2026-10-06",
      "shares": 88239,
      "price": 333.26,
      "value_usd": 29406529.14,
      "form": "4"
    }
  ],
  "pagination": { "limit": 1, "next_cursor": "eyJvIjoxfQ", "has_more": true },
  "meta": { "filters": { "ticker": "AAPL", "side": null, "kind": "open_market", "days": 365, "min_value": null } }
}

Abridged: rows carry more fields, which are described in the data caveats below and may gain new ones. Ignore fields you do not know.

Pagination

Pass limit (1 to 100, default 25). While pagination.has_more is true, send pagination.next_cursor back as cursor with the same filters. A cursor is opaque and valid for the first 10,000 rows of a query. Because new filings arrive all the time, a row can shift between pages if you page slowly: de-duplicate on oqro_url when you need to be exact.

curl "https://oqro.io/api/v1/congress-trades?ticker=MSFT&limit=50&cursor=eyJvIjo1MH0" \
  -H "Authorization: Bearer $OQRO_API_KEY"

Errors

Every error has the same body and the matching HTTP status:

HTTP/1.1 402 Payment Required
{ "error": { "code": "subscription_required", "message": "The OQRO API is part of OQRO Pro and this key's account has no active subscription. Subscribe at https://oqro.io/app/unlock" } }

param names the offending parameter when there is one.

400 invalid_parameter
A parameter is unknown, malformed or out of range. The message and param say which. Undocumented parameters are refused so a typo cannot silently widen a query.
401 missing_api_key
No key was sent.
401 invalid_api_key
The key is malformed, unknown or revoked.
402 subscription_required
The key is valid but its account has no active OQRO Pro subscription. Nothing is returned until it does.
404 ticker_not_covered
The ticker is well formed but OQRO does not cover it. Use /companies/search.
429 rate_limited
Over the per-key limit. The Retry-After header says how many seconds to wait.
503 data_unavailable
The data source did not answer. Retry after a few seconds.
503 service_unavailable
The key could not be checked right now. Retry.

Rate limits

Each key may make 60 requests per minute and 5,000 requests per day (UTC windows), whatever the endpoint, with at most 100 rows per request. Over a limit you get 429 and a Retry-After header in seconds; requests that were refused still count. Every response reports where you stand:

RateLimit-Limit: 60
RateLimit-Remaining: 57
RateLimit-Reset: 38              # seconds until the minute window restarts
RateLimit-Policy: 60;w=60, 5000;w=86400
X-RateLimit-Limit: 60        # the same numbers under the older names
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 38
X-RateLimit-Day-Limit: 5000
X-RateLimit-Day-Remaining: 4876

Need more? Tell us what you are building.

What the data is, and is not

  • Descriptive public data, not advice. OQRO reports what was disclosed. It infers no motive, gives no personalized advice and recommends no transaction. Do not present a row as a buy or sell signal.
  • A 13F is a quarter-end snapshot. It is filed up to 45 days after the quarter and has no trade date. fund-moves rows say so in trade_date.
  • Congress amounts are ranges. Members report an official band such as "$15,001 - $50,000", never an exact value, and the disclosure comes after the transaction. amount_min and amount_max are the band's ends: do not add them up as if they were values.
  • A contract's potential value is a ceiling. potential_value_usd includes every option and is not revenue. obligated_usd is what has been committed to date.
  • A Form 144 is a notice of a planned sale, not a completed one. A sale under a Rule 10b5-1 plan is flagged as planned_flag; other routine causes appear as automatic_reason.
  • Prices are adjusted daily closes, split- and dividend-adjusted and end of day, not intraday. A recently added company can have a shorter history; meta.window says so.
  • Coverage. US-listed companies from the S&P 500 down to small caps, with a curated set of 13F managers. Rows flagged for review are left out. Look-back windows reach up to about two years.
  • How it is built. Sources, update frequency and how each disclosure is classified are in the methodology. Open the source_url before you rely on a figure.

OQRO Pro

One subscription covers the API, the MCP connector and the OQRO site: insider trades, fund moves, politician trades (Congress), federal contracts, the screener, alerts and Ask OQRO.

OQRO is a research tool. It describes public disclosures and context calculated from them. It is not investment advice, does not give personalized advice and does not recommend any transaction.

Follow OQRO: