Stockhouse APIstockhouse.com ↗
Retrieve the latest 24 hours of Bullboard posts and comments for TSX, TSXV, and CSE-listed stocks via a single API endpoint.
What is the Stockhouse API?
The Stockhouse Bullboard API exposes one endpoint — get_bullboard_comments — that returns up to 1,000 posts and comments published within the last 24 hours for any Canadian-listed stock on Stockhouse.com. Each response includes the post array, a normalized symbol, a UTC cutoff timestamp, page count fetched, and the resolved company name, giving you a complete snapshot of recent retail investor discussion on a given ticker.
curl -X GET 'https://api.parse.bot/scraper/44bd9d92-c326-40da-9fa1-87da187febdf/get_bullboard_comments?ticker=QIMC&exchange=CSE' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace stockhouse-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Stockhouse Bullboards — fetch recent posts for a stock."""
from parse_apis.stockhouse_com_api import Stockhouse, Exchange, SymbolNotFound
client = Stockhouse()
# Look up a CSE-listed stock's bullboard by ticker + exchange.
try:
board = client.boards.lookup(ticker="QIMC", exchange=Exchange.CSE, max_posts=10)
except SymbolNotFound:
print("Symbol not found on specified exchange")
raise
print(f"{board.company_name} ({board.symbol}) — {board.post_count} posts in last 24h")
# Iterate through returned posts, newest first.
for post in board.posts:
print(f" [{post.post_type}] {post.title} by {post.author} ({post.views} views)")
# Alternatively, fetch by direct Stockhouse symbol for an unambiguous lookup.
board2 = client.boards.get(symbol="t.shop", max_posts=5)
print(f"\n{board2.company_name}: {board2.post_count} recent posts, {board2.pages_fetched} page(s) fetched")
print("\nexercised: boards.lookup / boards.get")
Retrieve Bullboard posts and comments published within the last 24 hours for a given stock. Accepts a ticker plus exchange (TSX, TSXV, CSE) or a direct Stockhouse symbol. Paginates through listing pages until the oldest item falls outside the 24-hour window or the limit is reached. Returns results in newest-first order. Returns an empty successful result with status 'no_posts_in_window' when no posts exist in the 24-hour window. Each page fetch returns up to ~15 items; a board with heavy activity may require multiple pages.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of posts to return. Safety cap at 1000. The endpoint still returns the complete 24-hour window when within this limit. |
| symbol | string | Full Stockhouse symbol with exchange prefix (e.g. 'c.qimc', 't.shop', 'v.ami'). Case-insensitive. Use this when the mapping is unambiguous. If provided, 'ticker' and 'exchange' are ignored. |
| ticker | string | Stock ticker symbol (e.g. QIMC, SHOP). Case-insensitive. Required if 'symbol' is not provided. |
| exchange | string | Exchange code. Required when using 'ticker'. Determines the Stockhouse prefix: TSX=t, TSXV=v, CSE=c. |
{
"type": "object",
"fields": {
"posts": "Array of post/comment objects within the 24-hour window, newest first",
"status": "'ok' when posts were found, 'no_posts_in_window' when the board exists but has no recent activity",
"symbol": "Normalized Stockhouse symbol used for the query (e.g. 'c.qimc')",
"cutoff_utc": "ISO 8601 UTC timestamp of the 24-hour cutoff used",
"post_count": "Number of posts returned",
"company_name": "Company or channel name extracted from the page title",
"pages_fetched": "Number of listing pages fetched from Stockhouse"
},
"sample": {
"data": {
"posts": [
{
"body": "BASHER T.A. is useless Look at the FUNDEMENTALS...",
"title": "RE:RE:RE:Nice Jump for QIMC SP !",
"views": 2,
"author": "Peggy123",
"ticker": "QIMC",
"post_id": "37084596",
"post_url": "https://stockhouse.com/companies/bullboard?symbol=c.qimc&postid=37084596",
"post_type": "comment",
"thread_id": "37083942",
"fetched_at": "2026-08-16T16:08:11.395051+00:00",
"company_name": "Quebec Innovative Materials Corp",
"published_at_utc": "2026-08-16T15:34:00+00:00",
"published_display": "Aug 16, 2026 11:34am",
"stockhouse_symbol": "c.qimc"
}
],
"status": "ok",
"symbol": "c.qimc",
"cutoff_utc": "2026-08-15T16:08:11.395051+00:00",
"post_count": 4,
"company_name": "Quebec Innovative Materials Corp",
"pages_fetched": 1
},
"status": "success"
}
}About the Stockhouse API
What the API Returns
The single get_bullboard_comments endpoint returns a JSON object containing a posts array of community discussion items from Stockhouse Bullboards, ordered newest first. Alongside the posts, the response surfaces post_count, symbol (the normalized Stockhouse symbol such as c.qimc or t.shop), cutoff_utc (the ISO 8601 UTC timestamp marking the start of the 24-hour window), pages_fetched (how many listing pages were traversed to build the result), and company_name as extracted from the board's page title. The status field is ok when posts exist within the window, or no_posts_in_window when the board is valid but inactive in the last 24 hours.
Identifying a Stock
You can identify a stock two ways. Pass a full Stockhouse symbol directly — for example c.qimc for a CSE-listed ticker, t.shop for TSX, or v.ami for TSXV — and the endpoint queries that board immediately. Alternatively, supply a plain ticker string alongside an exchange value (TSX, TSXV, or CSE); the endpoint resolves the correct Stockhouse prefix automatically. Both inputs are case-insensitive.
Pagination and the 24-Hour Window
The endpoint paginates through Bullboard listing pages until the oldest item it encounters falls outside the 24-hour window or the limit ceiling (hard-capped at 1,000) is reached. The pages_fetched field in each response tells you exactly how many pages were consumed. If you supply a limit, the endpoint still respects the 24-hour boundary — the limit only prevents fetching beyond that count; it does not truncate the window arbitrarily.
The Stockhouse API is a managed, monitored endpoint for stockhouse.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when stockhouse.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official stockhouse.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track retail investor sentiment shifts on TSX and TSXV small-caps over a rolling 24-hour window using the
postsarray. - Alert trading desks when
post_countspikes above a threshold for a givensymbol, signalling unusual community attention. - Aggregate
company_nameand discussion volume across a watchlist of CSE-listed stocks to surface the most-discussed names each day. - Feed
cutoff_utcand post timestamps into a time-series store to correlate Bullboard activity with intraday price movements. - Monitor newly listed Canadian equities on the TSXV by polling
get_bullboard_commentswith theticker+exchangeinputs after each listing announcement. - Flag
no_posts_in_windowstatus as a liquidity or interest signal for thinly traded stocks in a screening workflow.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Stockhouse offer an official developer API for Bullboard data?+
What does the `status` field indicate, and how should I handle `no_posts_in_window`?+
status field is ok when at least one post falls within the 24-hour window. It returns no_posts_in_window when the Bullboard exists and was reached successfully but contains no posts newer than the cutoff_utc timestamp. You should treat this as a valid, empty result rather than an error — the board is real but simply has had no recent activity.Does the API cover exchanges outside TSX, TSXV, and CSE — for example OTC or NYSE-listed stocks?+
t), TSXV (prefix v), and CSE (prefix c) only. You can fork this API on Parse and revise it to add support for additional Stockhouse exchange prefixes if those boards exist on the site.Does the API return individual post content and metadata, or just post counts?+
posts array returns individual post and comment objects — not just counts. post_count is a separate summary field. The per-post objects contain the content and metadata available on the Bullboard listing pages within the 24-hour window. Fields such as user reputation scores or private message history are not included because they are not present on the public board listings.Can I retrieve Bullboard history older than 24 hours?+
cutoff_utc field. Historical archives beyond that window are not covered. You can fork this API on Parse and revise it to extend the pagination logic and remove the time-window cutoff to reach older posts.