Indices
BETACompanies
Market Overview
Loading market data...
Favorites & Saved
Watchlist
Portfolio
News
No news articles yet.
Use "Fetch Latest" to pull news from sources.
Admin Tools
What's New
Every improvement, fix and feature shipped to Stacks, day by day.
Privacy Policy
Last updated: 30 July 2026
Stacks (“Stacks”, “we”, “us”) operates stacksja.com, a website and tools for viewing Jamaica Stock Exchange (JSE) market data and tracking your own investments. This policy explains what personal information we collect, how we use it, and the choices you have. By using Stacks you agree to this policy.
1. Information we collect
- Account information. When you create an account we collect your email address and a securely hashed password. We never store your password in plain text.
- Information you enter. Watchlists, favorites, saved news, portfolios and the trades, holdings, cash entries and goals you record, price and other alerts you set up, and any feedback you send us. Portfolio data is self-reported by you, for your own tracking; we do not connect to your broker or verify it.
- Contact channels you connect. If you link a Telegram account or enable browser push notifications, we store the identifier needed to deliver the alerts you asked for (a Telegram chat ID or a push subscription).
- Usage and device data. Basic technical information such as your IP address, browser type, pages viewed and approximate time of access, used to keep the service running, secure and improving. Some of this is kept only in aggregate.
- Local storage. We store small amounts of data in your browser (for example your theme, chart overlay preferences and session token) so the app works and remembers your settings.
2. How we use your information
- To provide the service: show market data, run your watchlists and portfolios, and deliver the alerts and notifications you request.
- To operate, secure, debug and improve Stacks, and to understand which features are used.
- To communicate with you about your account, respond to feedback, and send the market digest or notifications you have opted into.
3. We do not sell your data
We do not sell or rent your personal information. We do not share it for others’ advertising. We share data only with the service providers below, or where required by law.
4. Service providers
We rely on a small number of third parties to run Stacks. They process data only to provide their service to us:
- Hosting — our servers, which store the data above.
- Email delivery — to send account emails, the market digest and feedback replies.
- Telegram and web push — to deliver the alerts you enable, if you connect them.
- AI processing — we use a third-party AI service to read and structure public company filings and announcements. We do not send your personal account or portfolio data to it.
5. Cookies and similar technologies
Stacks uses essential browser storage to keep you signed in and remember your preferences. We do not use third-party advertising or cross-site tracking cookies.
6. Data retention
We keep your account and the data you enter for as long as your account is active. If you delete your account, we delete or anonymise the personal data associated with it, except where we must keep records to comply with law or resolve disputes. Aggregated, non-identifying usage statistics may be retained.
7. Your choices and rights
- You can view and edit your watchlists, favorites, portfolios and alerts at any time in the app.
- You can opt out of the market digest and manage notification settings in Settings, or unsubscribe from any email.
- You can request access to, correction of, or deletion of your personal data by contacting us via the Feedback page.
8. Security
We use reasonable technical and organisational measures to protect your data, including hashed passwords and encrypted connections. No method of transmission or storage is completely secure, so we cannot guarantee absolute security.
9. Children
Stacks is not directed to children under 18 and we do not knowingly collect their personal information. If you believe a child has provided us data, please contact us and we will remove it.
10. Changes to this policy
We may update this policy from time to time. When we make material changes we will update the date above and, where appropriate, notify you in the app.
11. Contact
Questions about privacy? Reach us through the Feedback page.
Terms of Service
Last updated: 30 July 2026
These Terms of Service (“Terms”) govern your use of Stacks at stacksja.com and its related tools and API. By accessing or using Stacks, you agree to these Terms. If you do not agree, please do not use Stacks.
1. What Stacks is
Stacks provides Jamaica Stock Exchange (JSE) market data, company information, news and self-service tools such as watchlists, portfolios, alerts and analysis. It is an information and tracking service.
2. Not financial or investment advice
Stacks is for informational purposes only. Nothing on Stacks is investment, financial, legal, tax or other professional advice, a recommendation, or an offer or solicitation to buy or sell any security. We are not a licensed broker, dealer or investment adviser. You are solely responsible for your own investment decisions and should seek advice from a licensed professional. Investing involves risk, including loss of capital.
3. Data accuracy and availability
Market data, prices, financials, dividends and other information on Stacks are sourced from the JSE, JTrader, company filings, news outlets and other third parties. This information may be delayed, incomplete, or contain errors, and prices are not guaranteed to be real-time or accurate. Do not rely on Stacks for time-critical trading decisions. The service is provided on an “as is” and “as available” basis, without warranties of any kind, express or implied, including accuracy, fitness for a particular purpose, or uninterrupted availability.
4. Your account
You are responsible for keeping your login credentials secure and for all activity under your account. Provide accurate information when registering, and notify us of any unauthorised use. You must be at least 18 years old to create an account.
5. Data you enter
Portfolios, holdings, trades and other data you enter are self-reported and maintained by you for your own tracking. Stacks does not connect to your broker, execute trades, or verify what you enter. Any calculations (gains, cost basis, fees, cash) are estimates based on the data you provide.
6. Acceptable use
You agree not to: misuse or disrupt the service; attempt to gain unauthorised access; scrape, harvest or bulk-download data except through our documented API within its terms; resell or redistribute Stacks data as your own service; reverse engineer the service; or use Stacks for any unlawful purpose. API access, where offered, is subject to its own usage limits and terms.
7. Intellectual property
Stacks, its design, and its original content are owned by us or our licensors and are protected by applicable laws. Underlying market data and filings belong to their respective owners (including the JSE and listed companies). You may use Stacks for your personal, non-commercial purposes only, unless we agree otherwise in writing.
8. Third-party links and content
Stacks links to third-party sites and documents (such as JSE announcements and news articles). We do not control and are not responsible for third-party content, and linking does not imply endorsement.
9. Limitation of liability
To the fullest extent permitted by law, Stacks and its operators are not liable for any indirect, incidental, special, consequential or punitive damages, or any loss of profits, data, or investment losses, arising from your use of or reliance on Stacks. Our total liability for any claim relating to the service will not exceed the greater of the amount you paid us in the prior twelve months or US$50.
10. Termination
You may stop using Stacks and delete your account at any time. We may suspend or terminate access if you breach these Terms or to protect the service. Sections that by their nature should survive termination will continue to apply.
11. Governing law
These Terms are governed by the laws of Jamaica, without regard to conflict-of-law rules, and you submit to the courts of Jamaica for any dispute.
12. Changes to these Terms
We may update these Terms from time to time. Continued use of Stacks after changes take effect means you accept the updated Terms. We will update the date above when we make material changes.
13. Contact
Questions about these Terms? Reach us through the Feedback page.
Learn the Market
Every trading and financial-statement term explained in plain English, plus practice scenarios that drop you into real JSE situations. No account needed.
Support Stacks
Stacks is free, and always will be.
Every price, every filing, every dividend, every tool. No paywall, no ads, no premium tier holding the useful parts back. Anyone with a phone can follow the Jamaican market properly, whether they own one share or a portfolio.
That is the whole point, and it is not changing.
If Stacks has been useful to you and you would like to chip in toward keeping it going, you can. Entirely optional, and nothing about the site changes either way.
What it will not do
- Unlock anything. There is nothing locked.
- Remove ads. There are none.
- Get you a badge, a tier, or priority anything.
- Buy influence over what Stacks covers.
Other ways to help
- Tell me what is broken or missing.
- Share it with someone who follows the JSE.
- Follow the Telegram channel.
Feedback
Spotted a bug, bad data, or have an idea? It goes straight to the builder.
Sign in to send feedback
Feedback is open to registered members so we can follow up with you.
Dividend Calendar
Top yields, upcoming payments, board meetings and full history across every JSE-listed stock.
Alerts
API Access
The Stacks JSE API
Pull live JSE stock prices directly into your own applications or websites. Access historical data, financial statements, ownership data, and more. Build trading tools, dashboards, stock tickers, research apps, or anything else you can imagine.
Get Your Free API Key View API DocsWhat you get
Live Stock Prices
Pull real-time closing prices, volume, bid/ask, day changes, and 52-week ranges directly into your app or website. Covers all JSE Main and Junior Market stocks.
Historical Data
Access daily price history for any stock. Perfect for backtesting strategies, building charts, or running analysis.
Financial Statements
Retrieve income statements, balance sheets, and key financial ratios. Extracted directly from quarterly and annual filings.
Ownership & Directors
See top shareholders, board of directors, cross-holdings between companies, and institutional ownership data.
Search & Lookup
Search stocks by name or symbol. Look up individual stocks or get full market snapshots in a single call.
PE Ratios & Documents
Get calculated PE ratios for all stocks and access filed PDF documents including annual reports and financial statements.
Quick start
Pass your API key in the X-API-Key header with every request.
-H "X-API-Key: pk_your_key"
GET /api/v1/public/stock/NCBFG
Endpoints
https://stacksja.com/api/v1/public
| GET | /stocks | All stocks with latest prices |
| GET | /stock/{symbol} | Single stock quote and details |
| GET | /stock/{symbol}/history | Historical daily prices |
| GET | /stock/{symbol}/financials | Financial statements and ratios |
| GET | /stock/{symbol}/documents | Filed PDF documents |
| GET | /pe-ratios | PE ratios for all stocks |
| GET | /search?q={query} | Search stocks by name or symbol |
| GET | /quote?name={name} | Lookup by company name |
Get started
Your API Key
Loading...
Personal API
Personal API Tokens
Access your portfolios, alerts, and watchlists from external apps, scripts, or AI tools. These tokens authenticate as you and only access your own data.
Loading...
Quick Start
Once you create a token, use it in the Authorization header:
# Get your portfolios
curl https://stacksja.com/api/v2/user/portfolios -H "Authorization: Bearer stk_your_token_here"
# Get your alerts
curl https://stacksja.com/api/v2/user/alerts -H "Authorization: Bearer stk_your_token_here"
# Get your watchlists
curl https://stacksja.com/api/v2/user/watchlists -H "Authorization: Bearer stk_your_token_here"
Available endpoints: /api/v2/user/me, /portfolios, /watchlists, /alerts, /favorites
API Documentation
Complete reference for the Stacks JSE Public API
Base URL: https://stacksja.com/api/v1/public
All endpoints return JSON. Prices are in JMD unless otherwise noted. Data is sourced from the Jamaica Stock Exchange and JTrader.
Endpoints
Getting Started
Authentication
All API requests require an API key. Pass your key in the X-API-Key header with every request.
curl https://stacksja.com/api/v1/public/stocks \ -H "X-API-Key: pk_your_key_here"
SSE streaming endpoints use an api_key query parameter instead of the header.
Don’t have a key? Apply for a free API key — approvals are typically same-day.
Quick Start
Here are the most common use cases to get you started:
GET /stocks
GET /stock/NCBFG
GET /quote?name=grace → resolves to GK
GET /stream?api_key=pk_your_key
GET /stock/NCBFG/trades
GET /stock/NCBFG/orderbook
Symbol resolution: All /stock/{symbol} endpoints support fuzzy matching. You can pass a ticker symbol (GK) or a company name (grace) and the API will resolve it.
MCP Server (AI tools)
Overview
Stacks runs a Model Context Protocol (MCP) server. MCP is an open standard that lets AI assistants call live tools, so apps like Claude Desktop, ChatGPT, Cursor, Claude.ai and VS Code can pull JSE market data straight into a conversation: quotes, price history, financials, dividends, order books and filings. You ask in plain language and the assistant decides which tool to call.
It uses the same pk_ API key as the REST API — no separate signup. Apply for a key, then connect any client using one of the methods below.
# MCP endpoint (Streamable HTTP, JSON-RPC 2.0)
https://stacksja.com/api/v1/public/mcp
- Read only — every tool reads market data; nothing can be modified.
- Same data as REST — each tool returns the same JSON as its REST counterpart.
- Rate limit — tool calls share your key’s limit (60/min default); the handshake and tool listing are free.
- Revocation — deactivating a key disconnects every client on its next call, including OAuth sessions.
Connecting a client
Two ways to connect, depending on whether your app lets you set a request header or requires OAuth. Replace pk_your_key with your key.
Claude Desktop
Connects through the mcp-remote bridge (needs Node.js). Settings › Developer › Edit Config, then restart the app.
{
"mcpServers": {
"stacks-jse": {
"command": "npx",
"args": ["-y", "mcp-remote",
"https://stacksja.com/api/v1/public/mcp",
"--header", "Authorization: Bearer pk_your_key"]
}
}
}
Cursor & VS Code
Connect natively, no bridge. Add to your MCP config (Cursor: Settings › MCP; VS Code: .vscode/mcp.json).
{
"mcpServers": {
"stacks-jse": {
"url": "https://stacksja.com/api/v1/public/mcp",
"headers": { "Authorization": "Bearer pk_your_key" }
}
}
}
Any client that lets you set a header works this way. Use Authorization: Bearer pk_your_key or X-API-Key: pk_your_key.
ChatGPT & Claude.ai (OAuth)
These connector UIs do not accept custom headers, so they authorize over OAuth. You never edit a config file: add the server URL and the app walks you through a sign-in page where you paste your pk_ key once.
- ChatGPT (Plus/Pro): Settings › Connectors › enable Developer Mode › Add connector › paste the URL.
- Claude.ai (web): Settings › Connectors › Add custom connector › paste the URL.
https://stacksja.com/api/v1/public/mcp
When the “Connect to Stacks” page appears, paste your pk_ key and click Authorize. The server implements OAuth 2.1 with PKCE, dynamic client registration and RFC 9728/8414 discovery; your key remains the underlying credential.
MCP Tools
17 tools, each returning the same JSON as the matching REST endpoint. search and fetch follow the schema ChatGPT’s deep research expects; the rest are direct data tools.
| Tool | Arguments | Description |
|---|---|---|
search | query | Find stocks by ticker/name; returns ids for fetch (ChatGPT deep research) |
fetch | id | Full dossier: snapshot, history, financials, dividends, latest filing |
list_stocks | market? | All stocks with latest price, change, volume + YTD/QTD/prev-quarter/52-week returns |
get_stock | symbol | Snapshot for one ticker: price, bid/ask, change %, ranges |
quote | name | Look up by ticker or company name |
search_stocks | query | Search listed stocks by ticker/name substring |
stock_history | symbol, limit? | Daily closing-price history (1–365 days) |
stock_financials | symbol | Confirmed financial statements + P/E valuation |
pe_ratios | — | P/E ratios across every stock with financial data |
stock_trades | symbol, date? | Intraday executed trades with summary stats |
orderbook | symbol, date? | Current buy/sell order queue with totals |
stock_dividends | symbol, limit? | Dividend declaration history |
dividend_calendar | upcoming?, start_date?, end_date? | Dividend calendar across the JSE |
stock_filings | symbol, kind? | JSE filing PDFs with download URLs |
latest_filing | symbol, kind? | Most recent filing for a stock |
fiscal_info | symbol | Fiscal year-end and quarter calendar |
directors | symbol | Board, top shareholders, cross-board links |
Example prompts once connected:
- “What’s GraceKennedy trading at today?”
- “Show me NCBFG’s price history for the last two weeks.”
- “Which JSE stocks have the lowest P/E ratios?”
- “How has the whole market performed this year? Rank by YTD return.”
- “What dividends are coming up this month?”
- “Pull the latest financials and most recent filing for Wisynco.”
Market Data
/stocks
Returns all stocks for the latest trading day with current prices. Use this to build a market overview or stock screener.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
market | string | No | main or junior. Omit for all stocks. |
Example
curl "https://stacksja.com/api/v1/public/stocks?market=main" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"count": 42,
"market_status": "open",
"data_type": "intraday",
"price_label": "Intraday prices as of 1:30 PM",
"period_anchors": {
"year_end": "2025-12-31",
"prev_quarter_end": "2025-12-31",
"quarter_before_that_end": "2025-09-30",
"week_52": "2025-03-13"
},
"stocks": [
{
"symbol": "GK",
"market": "main",
"trade_date": "2026-03-12",
"closing_price": "125.00",
"last_traded_price": "126.50",
"price_change": "1.50",
"change_percent": "1.21",
"volume": "45000",
"company_name": "GraceKennedy",
"ytd_percent": 4.17,
"qtd_percent": 4.17,
"prev_quarter_percent": 2.31,
"week_52_percent": 15.74,
"close_year_end": 120.00,
"close_prev_quarter_end": 120.00,
"close_quarter_before_that": 117.29
}
]
}
market_status is open during JSE trading hours (Mon-Fri 9:30 AM - 1:30 PM Jamaica time, excluding holidays). data_type is intraday when market is open, closing after close.
Each stock also carries pre-computed period returns: ytd_percent (from the last close of the prior calendar year), qtd_percent (from the last close of the prior quarter), prev_quarter_percent (the previous full quarter’s return), and week_52_percent (from the last close 52 weeks back). The anchor closes used are included per stock (close_year_end, close_prev_quarter_end, close_quarter_before_that) and the anchor dates in the top-level period_anchors. Fields are null for stocks that hadn’t started trading by the anchor date. In Q1, qtd_percent equals ytd_percent since both anchor on the prior year-end close.
/stock/{{symbol}}
Get detailed data for a single stock including bid/ask, ranges, dividend info, the current Chief Executive (ceo, or null if not recorded), the next general meeting (next_agm, or null), and all-time high/low closing records (split-adjusted, with the date each record was set). Supports fuzzy symbol matching (e.g. “grace” resolves to GK).
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Ticker symbol or company name in URL path (fuzzy matched) |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "NCBFG",
"company_name": "NCB Financial Group",
"market": "main",
"trade_date": "2026-03-12",
"closing_price": "42.84",
"last_traded_price": "42.84",
"price_change": "-0.01",
"change_percent": -0.02,
"volume": "2,598,715",
"closing_bid": "42.50",
"closing_ask": "42.84",
"todays_range": "42.50 - 44.98",
"week_range_52": "33.00 - 51.00",
"all_time_high": 147.55,
"all_time_high_date": "2021-06-10",
"all_time_low": 28.58,
"all_time_low_date": "2025-08-07",
"all_time_since": "2021-03-09",
"all_time_split_adjusted": false,
"total_prev_yr_div": "1.20",
"total_current_yr_div": "0.50",
"market_status": "closed",
"data_type": "closing",
"last_updated": "2026-03-12T14:30:00",
"price_label": "Closing Price",
"ceo": {
"full_name": "Robert Almeida",
"display_name": "Mr. Robert Almeida",
"first_name": "Robert",
"last_name": "Almeida",
"gender": "male",
"honorific": "Mr."
},
"next_agm": {
"kind": "AGM",
"date": "2026-08-11",
"time": "9:00 AM JA",
"venue": "Hybrid (registered office + video)",
"notice_url": "https://jamstockex.com/...",
"register_url": "https://..."
}
}
/quote?name={{name}}
Quick price quote resolved by name or symbol. Useful for chatbots, voice assistants, or any interface where users type a company name instead of a ticker.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Ticker symbol or company name (e.g. GK, grace, First Rock) |
Example
curl "https://stacksja.com/api/v1/public/quote?name=grace" \ -H "X-API-Key: pk_your_key"
Returns the same data as /stock/{{symbol}} but accepts free-text input. Great for natural language lookups.
/search?q={{query}}
Search stocks by ticker or company name. Returns matching symbols with company names.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query (e.g. bank, NCB, grace) |
Example
curl "https://stacksja.com/api/v1/public/search?q=bank" \ -H "X-API-Key: pk_your_key"
Response
{
"query": "bank",
"count": 3,
"results": [
{ "symbol": "NCBFG", "company_name": "NCB Financial Group" },
{ "symbol": "BIL", "company_name": "Barita Investments" },
{ "symbol": "JMMBGL", "company_name": "JMMB Group" }
]
}
/stock/{{symbol}}/history
Historical closing prices for a stock. Use this for price charts and trend analysis.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
limit | integer | No | Number of trading days (1-365, default 30) |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG/history?limit=5" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "NCBFG",
"count": 5,
"history": [
{
"trade_date": "2026-03-12",
"closing_price": "42.84",
"price_change": "-0.01",
"change_percent": -0.02,
"volume": "2,598,715"
}
]
}
History is ordered most recent first. Use limit=365 for a full year of data.
/pe-ratios
Price-to-Earnings ratios for all companies with financial data. Uses trailing 12-month EPS calculated from the most recent quarterly or annual filings.
Example
curl "https://stacksja.com/api/v1/public/pe-ratios" \ -H "X-API-Key: pk_your_key"
Response
{
"count": 46,
"pe_ratios": [
{
"symbol": "SML",
"company_name": "Stanley Motta",
"pe_ratio": 1.45,
"ttm_eps": 3.95,
"shares_outstanding": 22951646
}
]
}
Sorted by P/E ratio ascending (lowest first). ttm_eps = Trailing Twelve Months Earnings Per Share. Only includes companies with confirmed financial data.
/stream
Server-Sent Events (SSE) stream for real-time price updates across all stocks. Pushes events whenever a stock price changes during market hours.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
api_key | string | Yes | Your API key as a query parameter (not header) |
Example
curl -N "https://stacksja.com/api/v1/public/stream?api_key=pk_your_key"
Event Format
event: price_update
data: {"symbol":"GK","price":"126.50","change":"+1.50","change_pct":"+1.21%","volume":"45000","time":"2026-03-12T13:45:00"}
The connection stays open indefinitely. SSE connections are not rate limited. Use /stream/{{symbol}} to filter to a single stock.
/stream/{{symbol}}
SSE stream filtered to a single stock. Only receives updates for the specified symbol.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
api_key | string | Yes | Your API key as a query parameter |
Example
curl -N "https://stacksja.com/api/v1/public/stream/NCBFG?api_key=pk_your_key"
Trading Activity
/stock/{{symbol}}/trades
Get all intraday trades for a single stock. Each trade includes execution time, price, quantity, and computed value. Summary includes VWAP, high, and low.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
date | string | No | Trade date (YYYY-MM-DD). Defaults to latest. |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG/trades" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"symbol": "NCBFG",
"count": 111,
"total_shares": 2598715,
"total_value": 111319766.62,
"vwap": 42.8365,
"high": 44.98,
"low": 42.5,
"trades": [
{
"time": "9:56:44 AM",
"price": 44.3,
"quantity": 50,
"value": 2215.0
}
]
}
Trades are ordered most recent first. VWAP (Volume Weighted Average Price) = total value ÷ total shares. Data is sourced from JTrader and captured throughout the trading day.
/trades
Get all intraday trades across every symbol for a given date. Returns trades grouped by symbol, each with per-symbol summaries and individual trade records. This is the “full tape” for the day.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
date | string | No | Trade date (YYYY-MM-DD). Defaults to latest. |
market | string | No | main or junior. Omit for all. |
Example
curl "https://stacksja.com/api/v1/public/trades?market=main" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"symbols": 103,
"total_trades": 1618,
"total_shares": 5400000,
"total_value": 162718901.19,
"data": [
{
"symbol": "NCBFG",
"market": "Main Market",
"trade_count": 111,
"total_shares": 2598715,
"total_value": 111319766.62,
"vwap": 42.8365,
"high": 44.98,
"low": 42.5,
"trades": [ ... ]
}
]
}
Each symbol in data includes its own VWAP, high/low, and full list of individual trades. Response can be large — use market filter to reduce payload size.
Order Book
/stock/{{symbol}}/orderbook
Get the full buy and sell order queue for a stock. Returns individual orders on each side sorted by rank, plus summary totals showing buy/sell split.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
date | string | No | Trade date (YYYY-MM-DD). Defaults to latest. |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG/orderbook" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"symbol": "NCBFG",
"buy_orders": [
{ "rank": 1, "quantity": 200, "price": 44.9, "value": 8980.0 },
{ "rank": 2, "quantity": 5000, "price": 44.85, "value": 224250.0 }
],
"sell_orders": [
{ "rank": 1, "quantity": 99837, "price": 44.98, "value": 4490668.26 }
],
"summary": {
"buy_order_count": 113,
"sell_order_count": 30,
"total_buy_quantity": 577643,
"total_sell_quantity": 466244,
"total_buy_value": 23936561.9,
"total_sell_value": 27246953.36,
"buy_percentage": 46.8,
"sell_percentage": 53.2
}
}
Returns "summary": null when no order data exists for the symbol/date. Buy orders are sorted by rank (best price first). Orders are captured from JTrader throughout the trading day.
/orderbook
Get buy and sell order queues for every symbol on a given date. Same structure as the single-stock endpoint, but returns all symbols at once.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
date | string | No | Trade date (YYYY-MM-DD). Defaults to latest. |
market | string | No | main or junior. Omit for all. |
Example
curl "https://stacksja.com/api/v1/public/orderbook?market=main" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"symbols": 116,
"total_orders": 5703,
"data": [
{
"symbol": "NCBFG",
"market": "Main Market",
"buy_orders": [ ... ],
"sell_orders": [ ... ],
"summary": {
"buy_order_count": 113, "sell_order_count": 30,
"total_buy_value": 23936561.9, "total_sell_value": 27246953.36,
"buy_percentage": 46.8, "sell_percentage": 53.2
}
}
]
}
Response can be large (5,000+ orders across 100+ symbols). Use the market filter to reduce payload.
/stock/{{symbol}}/orderbook/history
Historical order book snapshots showing how buy/sell pressure, spread, and sentiment have changed over time. Useful for tracking accumulation or distribution patterns.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
limit | integer | No | Number of dates to return (1-365, default 30) |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG/orderbook/history" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "NCBFG",
"count": 6,
"history": [
{
"trade_date": "2026-03-12",
"buy_orders": 113,
"sell_orders": 30,
"total_buy_value": 23936561.9,
"total_sell_value": 27246953.36,
"buy_pct": 46.8,
"sell_pct": 53.2,
"best_bid": 44.9,
"best_ask": 44.97,
"spread_pct": 0.16,
"imbalance_score": 0.107,
"imbalance_label": "Balanced"
}
]
}
Ordered most recent first. Imbalance labels: Strong Buy (>0.4), Bullish (>0.15), Balanced (-0.15 to 0.15), Bearish (<-0.15), Strong Sell (<-0.4).
/stock/{{symbol}}/orderbook/analysis
Computed order book analysis: buy/sell pressure ratio, bid-ask spread, imbalance score, support/resistance levels, and depth data for charting.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
date | string | No | Trade date (YYYY-MM-DD). Defaults to latest. |
Example
curl "https://stacksja.com/api/v1/public/stock/NCBFG/orderbook/analysis" \ -H "X-API-Key: pk_your_key"
Response
{
"trade_date": "2026-03-12",
"symbol": "NCBFG",
"analysis": {
"pressure": {
"total_buy_value": 23936561.9,
"total_sell_value": 27246953.36,
"buy_pct": 46.8, "sell_pct": 53.2,
"ratio": 0.88
},
"spread": {
"best_bid": 44.9, "best_ask": 44.97,
"spread": 0.07, "spread_pct": 0.16,
"midpoint": 44.935
},
"queue_summary": {
"buy_orders": 113, "sell_orders": 30,
"total_buy_qty": 577643, "total_sell_qty": 466244,
"avg_buy_size": 5112, "avg_sell_size": 15541
},
"imbalance": {
"score": 0.107,
"label": "Balanced"
},
"support": [
{ "price": 42.41, "qty": 107669, "value": 4566242.29, "orders": 2 }
],
"resistance": [
{ "price": 94.99, "qty": 63295, "value": 6012392.05, "orders": 1 }
],
"depth": {
"buy": [{ "price": 44.9, "qty": 200, "value": 8980.0, "cumulative": 8980.0 }],
"sell": [{ "price": 44.98, "qty": 99837, "value": 4490668.26, "cumulative": 4490668.26 }]
}
}
}
Support = top 5 buy price levels by value (where demand clusters). Resistance = top 5 sell price levels. Depth data includes cumulative values for building depth charts. Returns "analysis": null when no data exists.
Fundamentals
/stock/{{symbol}}/financials
Financial statements (income statement, balance sheet, cash flow) extracted from JSE filings. Returns the most recent quarterly and annual reports with current and comparative period data.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
Example
curl "https://stacksja.com/api/v1/public/stock/GK/financials" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "GK",
"company_name": "GraceKennedy",
"count": 4,
"valuation": { ... },
"financials": [
{
"fiscal_year": 2025,
"period_type": "Q3",
"statement_type": "unaudited",
"currency": "JMD",
"periods": {
"current": {
"revenue": 44872273000.0,
"operating_profit": 2931590000.0,
"net_income": 1967432000.0,
"eps_basic": 1.89,
"eps_diluted": 1.87,
"total_assets": 258200606000.0,
"total_equity": 94000000000.0,
"total_liabilities": 164000000000.0,
"cash_and_equivalents": 21711167000.0,
"finance_costs": -522429000.0,
"tax_expense": -870558000.0
},
"comparative": { /* same fields for prior year period */ }
}
}
]
}
Financial data is extracted from JSE filings using AI and verified. periods.comparative contains the same period from the prior year. Values are in the company's reporting currency (usually JMD).
/stock/{{symbol}}/directors
Board of directors and key executives for a company.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
Example
curl "https://stacksja.com/api/v1/public/stock/GK/directors" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "GK",
"company_name": "GraceKennedy",
"directors": [
{
"id": 1,
"name": "Prof. Gordon V. Shirley",
"title": "Chairman",
"director_type": "chairman",
"appointed_date": "",
"bio": ""
},
{
"id": 2,
"name": "Frank James",
"title": "Group CEO",
"director_type": "executive"
}
]
}
director_type values: chairman, executive, non-executive, independent.
/stock/{{symbol}}/documents
JSE regulatory filings and documents for a company (annual reports, quarterly statements, etc.).
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
Example
curl "https://stacksja.com/api/v1/public/stock/GK/documents" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "GK",
"company_name": "GraceKennedy",
"count": 5,
"documents": [
{
"id": 42,
"title": "Q3 2025 Unaudited Financial Statements",
"document_type": "financial_statement",
"fiscal_year": 2025,
"period_type": "Q3",
"filing_date": "2025-11-15",
"pdf_url": "/api/v1/public/documents/42/pdf"
}
]
}
Use the pdf_url to download the original document. PDF downloads do not require authentication.
/documents/{{id}}/pdf
Download the PDF for a specific document. Returns the raw PDF file. No authentication required.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Document ID from the /documents endpoint |
Example
curl "https://stacksja.com/api/v1/public/documents/42/pdf" \ -o statement.pdf
Returns Content-Type: application/pdf. This is the only endpoint that does not require an API key.
/directors/{{id}}
Update director information (title, bio, appointed date, etc.). Requires authentication.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Director ID in URL path |
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
title | string | Director's title (e.g. “CEO”, “Chairman”) |
director_type | string | chairman, executive, non-executive, independent |
appointed_date | string | Date appointed (YYYY-MM-DD) |
bio | string | Biographical information |
All fields are optional — only include the fields you want to update.
Dividends
Note: Dividend endpoints use the base URL https://stacksja.com/api/v1 (without /public). Authentication is the same.
/dividends
List dividend declarations. Filter by upcoming dividends, year, or symbol.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
upcoming | boolean | No | true to only show dividends with future payment dates |
year | integer | No | Filter by fiscal year (e.g. 2026) |
symbol | string | No | Filter by stock symbol |
limit | integer | No | Max results (default 50) |
Example
curl "https://stacksja.com/api/v1/dividends?upcoming=true" \ -H "X-API-Key: pk_your_key"
Response
{
"total": 15,
"dividends": [
{
"id": 7,
"symbol": "KPREIT",
"amount_per_share": 0.000566,
"currency": "USD",
"dividend_type": "interim",
"declaration_date": "2026-02-24",
"record_date": "2026-04-02",
"ex_dividend_date": "2026-04-02",
"payment_date": "2026-04-24",
"notes": "Amended dividend of US$0.000566 per share.",
"source_url": "https://www.jamstockex.com/..."
}
]
}
dividend_type: interim, final, or special. currency: JMD or USD. Key dates: ex_dividend_date is when you must own the stock by, payment_date is when you get paid.
/dividends/calendar
Get dividends within a date range, useful for building a dividend calendar.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
start_date | string | Yes | Start date (YYYY-MM-DD) |
end_date | string | Yes | End date (YYYY-MM-DD) |
Example
curl "https://stacksja.com/api/v1/dividends/calendar?start_date=2026-03-01&end_date=2026-04-30" \ -H "X-API-Key: pk_your_key"
Returns dividends that have any key date (declaration, record, ex-dividend, or payment) falling within the specified range.
/stocks/{{symbol}}/dividends
Get all dividend history for a specific stock.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Stock symbol in URL path |
limit | integer | No | Max results (default 20) |
Example
curl "https://stacksja.com/api/v1/stocks/NCBFG/dividends" \ -H "X-API-Key: pk_your_key"
Response
{
"symbol": "NCBFG",
"dividends": [
{
"id": 11,
"symbol": "NCBFG",
"amount_per_share": 0.5,
"currency": "JMD",
"dividend_type": "interim",
"declaration_date": "2026-02-12",
"record_date": "2026-03-02",
"ex_dividend_date": "2026-03-02",
"payment_date": "2026-03-16",
"notes": "Interim dividend of $0.50 per ordinary stock unit.",
"source_url": "https://www.jamstockex.com/..."
}
]
}
Reference
News RSS Feed
Standard RSS 2.0 feed of the Stacks news section — the same articles shown at stacksja.com/news. Works with any feed reader or RSS-to-social relay. No API key required. Note the full URL: this feed lives under /api/v1, not /api/v1/public.
GET https://stacksja.com/api/v1/news/rss
| Parameter | Default | Description |
|---|---|---|
source | JSE | all for every source (JSE, Gleaner, Observer, Our Today); JSE for exchange announcements only (includes sub-feeds like Quarterly Statements); or an exact source name such as Jamaica Gleaner. |
limit | 30 | Number of items, 1–100. |
Example: https://stacksja.com/api/v1/news/rss?source=all&limit=50
Error Codes
All errors return a JSON object with a detail field explaining the error.
| Status | Meaning | Example |
|---|---|---|
400 | Bad Request | Missing required parameter or invalid value |
401 | Unauthorized | Missing or invalid API key |
404 | Not Found | Stock symbol not found or no data for date |
409 | Conflict | Duplicate API key request |
429 | Too Many Requests | Rate limit exceeded |
500 | Server Error | Something went wrong on our end |
Error Response Format
{
"detail": "Stock 'FAKE' not found. Try /api/v1/public/quote?name=First+Rock for multi-word names."
}
Canvases (research mindmaps)
Personal freeform maps of companies, people and news, as shown on the Canvas page. All endpoints require your Bearer token and only ever return your own canvases. Nodes have a kind of company | person | news | note, world coordinates x, y, and an optional JSON meta string.
| Endpoint | Description |
|---|---|
GET /api/v1/canvases | List your canvases. |
POST /api/v1/canvases | Create one. Body: {"name"}. |
GET /api/v1/canvases/{id} | Full canvas: nodes + edges. |
PATCH / DELETE /api/v1/canvases/{id} | Rename / delete (with contents). |
POST /api/v1/canvases/{id}/nodes | Add a node: {kind, ref, label, x, y, meta}. Same kind+ref twice returns the existing node. |
PATCH / DELETE …/nodes/{nid} | Move/edit a node / remove it and its links. |
POST /api/v1/canvases/{id}/edges | Link two nodes: {a, b, label}. |
PATCH / DELETE …/edges/{eid} | Write a label on a link / remove it. |
GET /api/v1/canvas/expand?kind=&ref= | Affiliations for an entity: a person’s boards and stakes, or a company’s board, holders and recent news. |
Rate Limits & Tiers
Endpoints fall into three tiers by how costly the data is to reproduce. Distribution endpoints are open; the deep market data (full price history, the intraday trades tape, order-book history) is metered per day and reserved for commercial plans at volume.
| Tier | Endpoints | Free plan |
|---|---|---|
| π’ Open | Quotes, snapshots, search, cashtags, company list, dividend calendar, pulse, SSE streams | Generous — use freely (please attribute “Data via Stacks”) |
| π‘ Metered | Financials, fiscal info, directors, filings, P/E, market snapshot, order-book snapshot | Shared daily request budget |
| π΄ Moat | Price history, intraday trades tape, order-book history | Small daily budget — commercial plan for bulk |
| Limit | Window | Notes |
|---|---|---|
| 60 requests | Per minute | Per API key (free plan) |
| Daily quota | Per day | A separate, higher daily cap; moat endpoints have their own smaller daily budget |
| Unlimited | — | SSE streaming connections (while connected) |
Exceeding a limit returns a 429. Per-minute: wait 60 seconds. Daily: resets at midnight (Jamaica time). Building something that needs the full history or trades tape at volume? Talk to us about a commercial plan.
User API — Personal Data
Access your portfolios, alerts, watchlists, and chart notes from external apps, scripts, or AI tools.
Base URL: https://stacksja.com/api/v2/user
Create a personal token on the Developers page to get started.
Authentication
The User API uses personal access tokens (not API keys). Create one on the Developers page.
Include your token in the Authorization header:
curl "https://stacksja.com/api/v2/user/me" \ -H "Authorization: Bearer stk_your_token_here"
Token format: stk_ followed by 64 hex characters. Tokens are hashed server-side — if you lose it, generate a new one.
/api/v1/public/) gives you market data with an API key. The User API (/api/v2/user/) gives you your personal data with a personal token. Use both together for full access.
/me
Get your user profile.
curl "https://stacksja.com/api/v2/user/me" \ -H "Authorization: Bearer stk_your_token"
Response
{
"username": "gordon",
"email": "gordon@example.com",
"created_at": "2026-01-15T10:30:00"
}
/portfolios
Get all your portfolios with holdings enriched with current market data, gain/loss calculations, and day changes.
curl "https://stacksja.com/api/v2/user/portfolios" \ -H "Authorization: Bearer stk_your_token"
Response
[
{
"id": 1,
"name": "Long Term",
"total_value": 125430.50,
"total_invested": 98000.00,
"total_gain": 27430.50,
"total_gain_pct": 27.99,
"holdings": [
{
"symbol": "GK",
"shares": 500,
"buy_price": 65.00,
"current_price": 70.13,
"market_value": 35065.00,
"gain_loss": 2565.00,
"gain_loss_pct": 7.89,
"day_change_pct": -0.43
}
]
}
]
Use /portfolios/{id} to get a single portfolio by ID.
/alerts
Get all your price alerts with their current status.
curl "https://stacksja.com/api/v2/user/alerts" \ -H "Authorization: Bearer stk_your_token"
Response
{
"alerts": [
{
"symbol": "LEARN",
"condition": "above",
"target_price": 0.30,
"triggered": false
}
]
}
Create alerts with POST /alerts (body: {symbol, condition, target_price}). Delete with DELETE /alerts/{id}.
/watchlists
Get your watchlists with current prices for each stock.
curl "https://stacksja.com/api/v2/user/watchlists" \ -H "Authorization: Bearer stk_your_token"
/favorites
Get your favorite/starred stocks with current market data.
curl "https://stacksja.com/api/v2/user/favorites" \ -H "Authorization: Bearer stk_your_token"
💡 What Can You Build?
Need an API key? Apply for free access