TSX Insider API Documentation
Canadian insider trading transactions as JSON
Quick start
- Have an active API plan on your account.
- Open My Account › API Key and click Generate API key. Copy it right away: it is shown once.
- Call the feed with your key in the
X-API-Keyheader:
curl -H "X-API-Key: YOUR_KEY" -A "MyApp/1.0" \
"https://tsxinsider.com/wp-json/tsxi/v1/feed?tickers=ABC,XYZ&since=2026-10-01"
import requests
KEY = "YOUR_KEY" # from the API Key tab
r = requests.get(
"https://tsxinsider.com/wp-json/tsxi/v1/feed",
params={"tickers": "ABC,XYZ", "since": "2026-10-01"},
headers={"X-API-Key": KEY, "User-Agent": "MyApp/1.0"}, # set your own User-Agent
timeout=60,
)
r.raise_for_status()
for t in r.json()["records"]:
print(t["filing_date"], t["ticker"], t["side"], t["insider"], t["title"], t["shares"], t["price"])MyApp/1.0). Our host blocks blank ones and some library defaults (Python urllib, Python requests, Go) with a 406 error.Authentication
Base URL: https://tsxinsider.com/wp-json/tsxi/v1. HTTPS only.
Send your key in a header named X-API-Key. Every request needs it. Your key belongs to your account and is for your own use only. If it leaks, generate a new one on the API Key tab: the old one stops working right away, and your monthly tickers and daily requests do not reset.
GET /feed
| Parameter | Description |
|---|---|
tickers | Required unless names is used. Comma-separated, up to your plan’s monthly ticker limit, for example ABC,XYZ. Former tickers also work. |
since | Optional. YYYY-MM-DD: only records filed on or after this date. Default: January 1, 2020, which is all available history. Earlier dates are treated as January 1, 2020. |
names | Optional. Comma-separated company names, or part of a name, for example names=Peyto,Shopify. A name that matches one company is served like a ticker. If several companies match, they are listed for you to choose from and no slot is used. Use this for companies that no longer have a ticker. |
The response also includes usage (tickers used this month, your limit and the reset date) and tickers_not_found (any tickers we did not recognize).
GET /search
Find a company by name, including companies that no longer trade, were renamed or have no current ticker. Use q with at least 3 letters. Each match shows its ticker or its company_id. A search counts as one request and uses no ticker slot.
curl -H "X-API-Key: YOUR_KEY" -A "MyApp/1.0" "https://tsxinsider.com/wp-json/tsxi/v1/search?q=peyto"GET /usage
Shows the tickers you have used this month, how many slots are left, when the count resets, and today’s request count. Free: it does not count toward your limits. For convenience, your usage is also shown on the API Key tab of My Account.
curl -H "X-API-Key: YOUR_KEY" -A "MyApp/1.0" "https://tsxinsider.com/wp-json/tsxi/v1/usage"Response
Each record is one insider’s trades in one account, on one side, on one day. shares is the day’s total and price is the volume-weighted average price for that day (total value divided by total shares). The data covers open-market insider buys and sells in common shares. Sales of shares acquired through an exercise or conversion shortly before are included and marked with exercise_and_sell. An abbreviated example (placeholder values, not real data):
{
"feed_version": 2,
"generated": "2026-11-08",
"from": "2025-11-08",
"tickers_not_found": [],
"usage": { "month": "2026-11", "tickers_used": 1, "limit": 25, "resets": "2026-12-01" },
"corporate_actions": {
"ABC": {
"actions": [
{ "date": "2026-03-02", "type": "consolidation", "ratio": "10-for-1",
"factor": 10.0, "security": "Common Shares" }
],
"listings": []
}
},
"records": [
{
"ticker": "ABC", "exchange": "TSXV", "company": "Example Corp",
"side": "buy", "insider": "Smith, Jane", "title": "CEO",
"relationship": "Director, Senior Officer", "ownership": "Direct",
"transaction_date": "2026-11-05", "filing_date": "2026-11-06",
"shares": 50000, "price": 0.42, "currency": "CAD", "value": 21000.0,
"balance_before": 1200000, "balance_after": 1250000, "pct_change": "+4.2%",
"exercise_and_sell": false, "share_basis": "current", "fills": 1,
"sedi_txn_ids": ["1000001"], "price_flagged": false
}
]
}factor in corporate_actions is old shares per new share: 10 = a 10-for-1 consolidation, 0.5 = a 2-for-1 split. Unadjusted fields are always as filed; the adjusted_* fields use today’s share basis. An amended filing replaces the original. New fields may be added over time, so ignore any you do not use.
Field guide
| Field | Meaning |
|---|---|
ticker, exchange, company | Current ticker, exchange and company name |
company_id | Only for companies without a ticker (for example CO-SCULLY-ROYALTY). For these records ticker is empty (null) and the company is identified by company_id instead |
traded_exchange, traded_ticker | Exchange and ticker the trade was made under at the time (useful when a company has changed its ticker or exchange) |
side | buy or sell. Sales of exercised shares are included as sell (see exercise_and_sell) |
insider | Insider name (“Last, First”), or the entity that filed |
title | Role, for example CEO, CFO, VP, other C-suite titles, Director. Best effort for older filings, where it can fall back to the insider’s SEDI relationship |
relationship | Relationship to the issuer as filed on SEDI |
also_filed_by | Other insiders who reported this same trade. The trade appears only once |
transaction_date | Trade date |
filing_date | SEDI filing date |
shares | Shares traded |
price | Average price |
currency | CAD or USD |
value | shares × price |
security | Share class, for example Common Shares |
ownership | Direct, Indirect, or Control or Direction |
holder | Account name for indirect holdings (for example an RRSP, a family member, a holding company) |
balance_before | Shares in this account before the trade |
balance_after | Shares in this account after the trade (as filed) |
balance | Same as balance_after |
pct_change | Change in this account. Exit = sold out of it, New = first purchase in it |
day_start_balance | Shares in this account at the start of the day |
net_day_change_pct | Net change in this account over the day |
insider_total_before, insider_total_after | Estimated total across the insider’s accounts |
holdings_known | Number of accounts in that total |
pct_of_insider_total | Trade size as a % of that total |
exercise_and_sell | true when the shares sold were acquired through an exercise or conversion shortly before |
exercised_shares_matched | Shares sold that came from those exercises |
share_basis | current, or pre_consolidation / pre_split if the trade was before a share consolidation or split |
adjusted_shares, adjusted_price, adjusted_balance_after | The same values restated on today’s share basis |
fills | Number of SEDI transactions combined into this record |
sedi_txn_ids | SEDI transaction IDs |
price_flagged | true when the filed price looks far off the stock’s other recent trades. Shown as filed, so treat it with caution |
Plans & limits
| Plan | Tickers per month | Requests per day | History |
|---|---|---|---|
| API 25 | 25 | 50 | Since Jan 1, 2020 |
- Tickers are counted per calendar month, Eastern Time. Re-requesting a ticker you have already used that month is always free. Unknown tickers do not use a slot.
- A request that would take you over your monthly limit is refused as a whole and uses no slots.
- Your limits come from your active plan. If the plan lapses, the key stops working until you renew.
Updates
The data is refreshed several times throughout the day. One final sync after 23:59 ET picks up everything filed that day. Filings are sometimes amended later, so setting since a few days back on each sync picks up any changes.
Errors
| HTTP | Meaning |
|---|---|
| 400 | Bad request (missing or too many tickers, bad date) |
| 401 | Missing, invalid or turned-off key |
| 403 | Monthly ticker limit reached, or your API plan is not active |
| 406 | Blocked by the host: set your own User-Agent |
| 429 | Daily request limit reached |
| 503 | Update in progress. Retry in a few minutes |
Errors come back as JSON with an error code and a message.
Terms
Your key is for your own personal use only. Please don’t share it, and don’t redistribute, resell or publish the data. If you need to share access or use the data commercially, please contact us about a commercial license. The data comes from public filings, is provided as-is for information only, and is not investment advice.
