At a glance
| Endpoint | POST https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN |
|---|---|
| Authentication | The token inside your URL. Keep the URL secret. |
| Body | JSON with Content-Type: application/json |
| Answer | {"ok":true} received · {"ok":false,"error":"..."} not understood · 400 malformed JSON · 404 unknown URL |
| Orders | Market orders, placed on every account that follows the URL, each at its own size |
| Symbols | Futures, by root: NQ, MNQ, ES, MES and so on. NQ1! and NQZ2026 work too |
| Size | Whole contracts. 1 if you leave it out or send 0. The sign is ignored: the action sets the side. |
| Stop and target | Absolute prices in sl and tp |
| Accounts that follow | Futures: Rithmic, Tradovate, ProjectX, dxFeed, TFeed. CFD: MetaTrader 4 and 5, cTrader, DXTrade, TradeLocker. NinjaTrader copies fills only. |
Send your first order in 3 steps
- In the Thor dashboard, open the Connections List, press Add Connection and choose TradingView. Press Copy URL, then Add my TradingView webhook and Save. The connection carries TradingView's name, but it takes orders from any program.
- In the Accounts List, add a copy link with the webhook as its leader, and set each follower's size. Start with a Sim account.
- Send an order. Thor answers
{"ok":true}, and the order appears in the connection's Live alerts list.
curl -X POST "https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN" \
-H "Content-Type: application/json" \
-d '{"symbol":"MNQ","action":"buy","quantity":1}'
The order message
| Field | What it does |
|---|---|
| symbolrequired | The futures symbol. Thor uses the contract each account trades. |
| actionrequired | buy or sell opens, adds or reduces. close closes the whole position. closelong and closeshort close that side only. |
| quantity | Whole contracts. 1 if you leave it out. Each account's own size setting applies on top. |
| sl, tp | Stop loss and take profit, as absolute prices. |
| update_sl, update_tp | true moves the stop or target of the open position to the new sl or tp. It needs that price, and an open position. Nothing is traded. |
The templates below use placeholders such as STOP_PRICE, so they are not valid JSON to paste: put in your own prices.
- Buy with a stop and target
{"symbol":"MNQ","action":"buy","quantity":2,"sl":STOP_PRICE,"tp":TARGET_PRICE} - Take 1 off a long of 2
{"symbol":"MNQ","action":"sell","quantity":1} - Close the whole position
{"symbol":"MNQ","action":"close"} - Move the stop
{"symbol":"MNQ","update_sl":true,"sl":NEW_STOP_PRICE}
What Thor answers
| HTTP | Body | Meaning |
|---|---|---|
| 200 | {"ok":true} | Received and passed to your connection. |
| 200 | {"ok":false,"error":"..."} | Not understood. Nothing is placed. |
| 400 | Bad Request | The body is not valid JSON. |
| 404 | {"ok":false,"error":"unknown webhook"} | The URL is wrong. |
How Thor places your order
- Entries go in at market. There are no resting limit or stop entries.
- Each URL keeps one net position per symbol, like a futures account. A second buy adds to the first, and a sell reduces it.
- Every account that follows gets the order at its own size: a multiplier or a fixed size.
- Futures accounts (Rithmic, Tradovate, ProjectX, dxFeed, TFeed) get a real stop and a real limit, and when one fills Thor cancels the other. On MetaTrader 4 and 5, cTrader, DXTrade and TradeLocker the levels sit on the position. NinjaTrader accounts copy fills only, without the levels.
Rules for programs
- Send
Content-Type: application/json(ortext/plain). Without it, Thor can't read the order. - Send one request at a time and wait for the answer. Parallel requests can arrive in a different order.
- Every request is placed, even an identical one. After a timeout, check your positions before sending it again.
{"ok":true}means received, not filled. Check the Live alerts list orGET /api/v1/positions.- Use only the words in the table. Thor reads any word starting with buy, long, sell or short as an entry.
- Whole contracts only. A fractional size is not placed. A size of 0 places 1 contract, and a negative size is read as positive.
- Send orders only while the connection is on. After Regenerate URL, update your program: the old URL still answers
{"ok":true}, but nothing is placed. - If Thor restarts or the connection is switched off and on while a position is open, the webhook starts flat. Close those positions with Flatten in the dashboard, or with
POST /api/v1/positions/flatten. - Call it from a server or a script, not from a web page: browsers block the request.
- Thor is built for strategy orders, not high-frequency trading.
Examples
Replace YOUR-TOKEN with the token from your webhook URL. Each example sends a buy, then a close. Try them on a Sim account first.
curl
macOS, Linux and Git Bash.
curl -X POST "https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN" \
-H "Content-Type: application/json" \
-d '{"symbol":"MNQ","action":"buy","quantity":1}'
curl -X POST "https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN" \
-H "Content-Type: application/json" \
-d '{"symbol":"MNQ","action":"close"}'
Python
Install the library once: pip install requests.
import requests
URL = "https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN"
def send(order):
r = requests.post(URL, json=order, timeout=10)
print(r.status_code, r.text)
send({"symbol": "MNQ", "action": "buy", "quantity": 1})
send({"symbol": "MNQ", "action": "close"})
Node.js
Node.js 18 or newer. Save as order.mjs and run node order.mjs.
const URL = "https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN";
async function send(order) {
const res = await fetch(URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(order),
});
console.log(res.status, await res.text());
}
await send({ symbol: "MNQ", action: "buy", quantity: 1 });
await send({ symbol: "MNQ", action: "close" });
From TradingView
Paste the URL in the alert's Notifications tab (Webhook URL) and the message in its Message box. The dashboard's message builder writes the message for you.
TradingView's own rules (TradingView help, checked 10 November 2026):
- Webhooks need two-factor authentication on your TradingView account.
- A JSON message is sent as
application/json, anything else astext/plain. - The receiver must answer within 3 seconds, and Thor answers at once.
Moving from PickMyTrade, TradersPost, PineConnector or Copygram? Keep your alert message as it is and change only the URL.
Watch: How to use TradingView Webhooks to copy your accounts
Read and control your accounts: the REST API
Create a key in the dashboard under API, then send X-API-Key and X-API-Secret with every request to https://app.thortradecopier.com. You get 100 requests a minute per key.
| GET /api/v1/positions | Today's open positions. |
| GET /api/v1/positions/closed | Today's closed positions. |
| POST /api/v1/positions/flatten | Closes every open position on all your accounts. |
curl "https://app.thortradecopier.com/api/v1/positions" \
-H "X-API-Key: YOUR-KEY" \
-H "X-API-Secret: YOUR-SECRET"
Full reference (OpenAPI 3.0): thor-api-spec.json
What it does not do
- No resting limit or stop entries.
- Futures symbols only: no crypto or forex symbols in the message.
- Whole contracts only.
- No order id in the answer.
- Not built for high-frequency trading.
Questions
Can an AI agent place trades through Thor?
Yes. Any program that can send an HTTPS POST can send orders to your webhook URL, including an AI agent with an HTTP tool. Thor places each order on the accounts that follow the URL, with their own size and risk settings.
How do I send a trade to Thor from Python?
Post a JSON body such as {"symbol":"MNQ","action":"buy","quantity":1} to your webhook URL with requests.post(url, json=...). The Python example above sends a buy and then a close.
Do I need TradingView?
No. The connection carries TradingView's name, but any program can send to its URL.
Can one strategy trade several prop firm accounts?
Yes. Every account that follows the URL gets the order. Check your firm's rules on copying between accounts first.
Do my PickMyTrade, TradersPost, PineConnector or Copygram messages work?
Yes. Thor reads their formats as they are. Change only the URL.
What happens if my request times out?
The order may still have arrived. Check your positions or the Live alerts list before sending it again, because every request is placed.
How can I test without risk?
Make a Sim or demo account follow the URL, then send a buy and a close.
What does it cost?
It is included in the Thor Plan, $39 a month ($105 a quarter, $351 a year), which starts with 14 days free. The Private Instance includes it too.
About Thor
Thor Trade Copier, by Phoenix Technologies, copies the trades of one account to as many other accounts as you want, from its own servers, so copying keeps running when your computer is off. It connects 16 platforms: Rithmic, Tradovate, NinjaTrader, TradingView, ProjectX, dxFeed, Tradesea, Deepcharts, cTrader, DXTrade, TradeLocker, MetaTrader 4 and 5, TFeed Futures, TFeed Perpetuals and MyFundedPerps. The Thor Plan is $39 a month and starts with 14 days free.
Related
From the blog (English):
Last updated: 10 November 2026