How do I retrieve and filter insider transactions with the insider screener API?
Use the transactions endpoint to retrieve insider trades across supported markets, then add query parameters to narrow the results by market, transaction type, date, issuer, insider or value.
The endpoint is:
https://www.insiderscreener.com/api/v1/data/transactions/
Send your API key in the X-API-Key header with every request.
Retrieve recent insider purchases
This request returns recent purchases reported in the US market:
curl --request GET \
--url 'https://www.insiderscreener.com/api/v1/data/transactions/?market=US&nature=BUY&page_size=100' \
--header 'X-API-Key: YOUR_API_KEY'
Use BUY for purchases, SELL for sales and OO for other operations. You can request more than one market by separating the country codes with commas, for example market=US,GB,FR.
Filter by date
Use transaction dates when you want to filter by the date on which a trade was executed:
transaction_date_from=2026-08-01
transaction_date_to=2026-08-31
Use notification dates when you want to filter by the date on which a transaction was disclosed:
notification_date_from=2026-08-01
notification_date_to=2026-08-31
Dates use the YYYY-MM-DD format.
For example, this request returns purchases executed in the US during August 2026, ordered by execution date from newest to oldest:
curl --request GET \
--url 'https://www.insiderscreener.com/api/v1/data/transactions/?market=US&nature=BUY&transaction_date_from=2026-08-01&transaction_date_to=2026-08-31&ordering=-transaction_date&page_size=100' \
--header 'X-API-Key: YOUR_API_KEY'
Filter by issuer or security
You can identify a company or security with any of these filters:
ticker: the issuer's primary tickerisin: an exact ISINidentifier: an ISIN, LEI, RIC or ticker resolved by the APIissuer_id: the numeric issuer IDissuer_slug: the issuer slugissuer_name: a partial, case-insensitive issuer-name match
For example:
?ticker=AAPL&nature=BUY
Ticker symbols can overlap between markets. Add market when you need to distinguish a particular listing or country.
Filter by insider
Use insider_name for a partial name search across the insider, PDMR and closely associated person fields:
?insider_name=Jane%20Smith
When you already know the person's identifier, use person_id. It accepts either a numeric value or a prefixed ID such as per_123.
Filter by transaction size or company profile
Useful transaction filters include:
value_minandvalue_max: transaction value in USDquantity_min: minimum number of securities transactedcurrency: reported transaction currencyat_market_price:trueorfalseholdings_change: minimum percentage increase when positive, or maximum percentage decrease when negativeposition: partial position-title matchposition_type: one or more normalized position types, separated by commas
You can also filter issuers by market_cap_category, market_cap_min, market_cap_max, indices, economic_sector, business_sector or industry_group. Market-cap minimum and maximum values are expressed in USD millions.
The interactive API documentation lists every supported value and filter.
Use the API from Python
The following example retrieves US purchases above $100,000 reported during the last 30 days:
import os
from datetime import date, timedelta
import requests
url = "https://www.insiderscreener.com/api/v1/data/transactions/"
headers = {"X-API-Key": os.environ["INSIDER_SCREENER_API_KEY"]}
params = {
"market": "US",
"nature": "BUY",
"notification_date_from": (date.today() - timedelta(days=30)).isoformat(),
"value_min": 100000,
"ordering": "-notification_date",
"page_size": 100,
}
response = requests.get(url, headers=headers, params=params, timeout=30)
response.raise_for_status()
payload = response.json()
for item in payload["data"]:
print(
item["issuer"]["name"],
item["reporting_person"]["name"],
item["transaction"]["gross_value_usd"]["amount"],
)
Understand the response
Each successful list response contains:
data: the transaction recordspagination: the page size, effective ordering and cursor links
Each transaction record groups related fields into source, issuer, reporting_person, security, transaction, analytics and raw objects. It also includes stable prefixed IDs and links to related API resources.
Values such as prices, quantities and transaction amounts are returned as strings where decimal precision must be preserved. Parse them with a decimal type rather than a binary floating-point type when exact calculations matter.
Follow cursor pagination
The transaction endpoint uses cursor pagination. If pagination.next contains a URL, request that URL unchanged to retrieve the next set of results:
next_url = payload["pagination"]["next"]
while next_url:
response = requests.get(next_url, headers=headers, timeout=30)
response.raise_for_status()
payload = response.json()
for item in payload["data"]:
# Process or store the transaction.
pass
next_url = payload["pagination"]["next"]
Do not construct cursor values yourself. The API applies your plan's maximum page size even if you request a larger value.
By default, results are ordered by newest notification date. The supported ordering values are transaction_date, -transaction_date, notification_date and -notification_date. A leading minus sign means descending order.
Control credit usage
Use the narrowest market, date and issuer filters that fit your workflow, and avoid repeatedly requesting records you have already stored. Follow the returned cursor until it becomes null, then save the newest processed notification date for your next synchronization. Store each transaction's stable id so your integration can identify records it has already processed.
Credit costs and historical-data limits depend on the endpoint, market scope and API plan. Check API pricing for current allowances and API Access for your remaining credits and request history.
Troubleshoot unexpected results
- No results: remove filters one at a time, confirm the market code and widen the date range.
400 Bad Request: check date formats, filter values and the supported ordering options.- Duplicate-looking records: use the transaction
idas the stable record identifier and check the filing status and amendment fields. - Missing optional values: some regulators do not report every field; handle
nullvalues in your integration. 401 Unauthorized: confirm that the key is active and sent in theX-API-Keyheader without a prefix.403 Forbidden: your current plan does not include the requested resource.429 Too Many Requests: slow down and retry after a delay, or check whether your credit allowance has been exhausted.
Need help choosing filters for a specific workflow? Contact API support.