How do I use deep links to open Altrady at a specific screen?
A deep link opens Altrady straight at a specific screen: a market in the trading terminal, a chat message, your bots, or a settings page. You can paste one in an email, a Slack message, a website, or a script, and the reader lands exactly where you pointed them. This article covers the three link forms and when to use each.
The three link forms
| Form | Use it for |
|---|---|
https://app.altrady.com/dashboard#/o/<route> |
Emails, Slack, websites. Works everywhere: hands off to the desktop app if it is running, otherwise opens in the browser. |
altrady://<route> |
When you know the reader has the desktop or mobile app installed. |
WebSocket on ws://127.0.0.1:6850
|
Local scripts and tools running on the same machine as the desktop app. |
All three end at the same place: the app navigates to the route you supplied. If you are unsure which to pick, use the web link. It never dead-ends.
What a route looks like
The route is the part of the app URL after the #. A few real examples:
/trade/BINA_USDT_BTC
/chat/1234?message=5678
/bots
/settings/profile
Market routes use a Coinray symbol: a short exchange code, then the quote currency, then the base currency. BTC/USDT on Binance is BINA_USDT_BTC, not BINANCE_BTC_USDT. Some futures markets carry a fourth segment for the contract, for example HYPERLIQUIDF_USDC_SPCX_XYZ, so copy the symbol from the app’s address bar rather than composing it by hand.
Web links
This is the safe default for anything you send to another person.
https://app.altrady.com/dashboard#/o/chat/1234?message=5678
https://app.altrady.com/dashboard#/d/BINA_USDT_BTC
Two shortcuts exist:
-
/o/<route>passes the route through as is. -
/d/<symbol>is short for/o/trade/<symbol>.
When the link is opened, the web app first checks whether the desktop app is running on that computer. If it is, the desktop app comes to the front and navigates, and the browser tab shows Link is opened in altrady. If not, the page simply opens in the browser. On a phone it hands off to the mobile app and, after a moment, offers Open here instead as a fallback.
The copy link to message action in the in-app chat produces exactly this form, and a web link pasted into a chat message navigates inside the app instead of opening a browser tab.
Protocol links
Use altrady:// when the app is certainly installed, for example in your own tooling or a browser extension. Both of these shapes work:
altrady://trade/BINA_USDT_BTC
altrady://open/#/trade/BINA_USDT_BTC
The second shape is the safer one to generate in code: everything after the # is taken literally, so routes with query strings need no special handling. com.altrady:// is accepted as well.
One caveat: if the app is not installed, a protocol link fails silently. Browsers give no reliable signal for this, which is exactly why the web link form exists.
Local WebSocket
The desktop app runs a small local server on 127.0.0.1:6850. A script on the same machine can connect over WebSocket, send a ping, and then send a deepLink command. Always ping first: the pong reply carries "application": "altrady", which is the only way to confirm Altrady, and not some other program, owns that port.
| Send | Reply |
|---|---|
{"command": "ping"} |
{"type": "pong", "application": "altrady", "app": "<version>"} |
{"command": "deepLink", "deepLink": "#/<route>"} |
{"type": "deepLink", "result": "ok"} |
Prefix the route with # (for example #/trade/BINA_USDT_BTC) or pass a full altrady:// URL. A minimal JavaScript example:
const open = (route) => new Promise((resolve, reject) => {
const ws = new WebSocket("ws://127.0.0.1:6850")
ws.onopen = () => ws.send(JSON.stringify({command: "ping"}))
ws.onerror = reject
ws.onmessage = ({data}) => {
const message = JSON.parse(data)
if (message.type === "pong" && message.application === "altrady") {
ws.send(JSON.stringify({command: "deepLink", deepLink: `#${route}`}))
}
if (message.type === "deepLink") {
ws.close()
resolve(message.result)
}
}
})
await open("/trade/BINA_USDT_BTC")
A connection error means no desktop app is running on that machine, which is your cue to fall back to the web link.
Ready-made examples
| Destination | Web link | Protocol link |
|---|---|---|
| BTC/USDT on Binance | https://app.altrady.com/dashboard#/d/BINA_USDT_BTC |
altrady://trade/BINA_USDT_BTC |
| Trading terminal | https://app.altrady.com/dashboard#/o/trade |
altrady://trade |
| Dashboard | https://app.altrady.com/dashboard#/o/dashboard |
altrady://dashboard |
| Markets | https://app.altrady.com/dashboard#/o/markets |
altrady://markets |
| Bots | https://app.altrady.com/dashboard#/o/bots |
altrady://bots |
| A chat message | https://app.altrady.com/dashboard#/o/chat/1234?message=5678 |
altrady://chat/1234?message=5678 |
| Profile settings | https://app.altrady.com/dashboard#/o/settings/profile |
altrady://settings/profile |
| Portfolio | https://app.altrady.com/dashboard#/o/portfolio |
altrady://portfolio |
| Journal | https://app.altrady.com/dashboard#/o/journal |
altrady://journal |
| Base Scanner | https://app.altrady.com/dashboard#/o/base-scanner |
altrady://base-scanner |
| Notifications | https://app.altrady.com/dashboard#/o/notifications |
altrady://notifications |
Inside a chat message, both forms render as in-app navigation:
Look at [BTC](altrady://trade/BINA_USDT_BTC) before the open.
See [this message](https://app.altrady.com/dashboard#/o/chat/1234?message=5678).
Trading terminal options
A market link can carry query parameters that set up the trading terminal on arrival. They work in every link form, because the query string travels with the route untouched.
| Parameter | What it does |
|---|---|
resolution |
Sets the chart timeframe on that market’s tab, then removes itself from the URL. |
widget |
Activates a trading-terminal widget by name. |
layoutShareId |
Opens the import layout flow (desktop, with trading enabled). |
watchlistShareId |
Opens the import watchlist flow. |
strategyShareId |
Opens the import strategy flow. |
trade_setup_data |
Preloads a trade setup into the trade form. |
The resolution value is a TradingView resolution code, not a human label:
- seconds:
1S,2S,3S,5S,10S,15S,30S - minutes:
1,2,3,5,10,15,30,60,120,240,360,720 - higher:
D,1D,2D,W,1W,2W,1M
So a 4-hour chart is 240 and a daily chart is D:
https://app.altrady.com/dashboard#/d/BINA_USDT_BTC?resolution=240
https://app.altrady.com/dashboard#/o/trade/BINA_USDT_BTC?resolution=D
altrady://trade/BINA_USDT_BTC?resolution=240
altrady://open/#/trade/BINA_USDT_BTC?resolution=15
Over the WebSocket, pass the same route: #/trade/BINA_USDT_BTC?resolution=240.
The timeframe is applied once the tab for that market is active, and the parameter is then dropped from the URL. A refresh keeps whatever timeframe the reader has chosen since, rather than snapping back.
Still stuck?
If a link opens the wrong screen or nothing happens, send us the exact link through the support chat and we will check it with you.