TSX Insider API Documentation

Canadian insider trading transactions as JSON

Quick start

  1. Have an active API plan on your account.
  2. Open My Account › API Key and click Generate API key. Copy it right away: it is shown once.
  3. Call the feed with your key in the X-API-Key header:
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"])
Set your own User-Agent (for example 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

ParameterDescription
tickersRequired unless names is used. Comma-separated, up to your plan’s monthly ticker limit, for example ABC,XYZ. Former tickers also work.
sinceOptional. 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.
namesOptional. 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).

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

FieldMeaning
ticker, exchange, companyCurrent ticker, exchange and company name
company_idOnly 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_tickerExchange and ticker the trade was made under at the time (useful when a company has changed its ticker or exchange)
sidebuy or sell. Sales of exercised shares are included as sell (see exercise_and_sell)
insiderInsider name (“Last, First”), or the entity that filed
titleRole, 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
relationshipRelationship to the issuer as filed on SEDI
also_filed_byOther insiders who reported this same trade. The trade appears only once
transaction_dateTrade date
filing_dateSEDI filing date
sharesShares traded
priceAverage price
currencyCAD or USD
valueshares × price
securityShare class, for example Common Shares
ownershipDirect, Indirect, or Control or Direction
holderAccount name for indirect holdings (for example an RRSP, a family member, a holding company)
balance_beforeShares in this account before the trade
balance_afterShares in this account after the trade (as filed)
balanceSame as balance_after
pct_changeChange in this account. Exit = sold out of it, New = first purchase in it
day_start_balanceShares in this account at the start of the day
net_day_change_pctNet change in this account over the day
insider_total_before, insider_total_afterEstimated total across the insider’s accounts
holdings_knownNumber of accounts in that total
pct_of_insider_totalTrade size as a % of that total
exercise_and_selltrue when the shares sold were acquired through an exercise or conversion shortly before
exercised_shares_matchedShares sold that came from those exercises
share_basiscurrent, or pre_consolidation / pre_split if the trade was before a share consolidation or split
adjusted_shares, adjusted_price, adjusted_balance_afterThe same values restated on today’s share basis
fillsNumber of SEDI transactions combined into this record
sedi_txn_idsSEDI transaction IDs
price_flaggedtrue when the filed price looks far off the stock’s other recent trades. Shown as filed, so treat it with caution

Plans & limits

PlanTickers per monthRequests per dayHistory
API 252550Since 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

HTTPMeaning
400Bad request (missing or too many tickers, bad date)
401Missing, invalid or turned-off key
403Monthly ticker limit reached, or your API plan is not active
406Blocked by the host: set your own User-Agent
429Daily request limit reached
503Update 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.