Developers

Trade from your code with Thor's webhook API

Thor's webhook API lets any program, from a TradingView alert to a Python bot or an AI agent, send futures orders to one private URL. Thor Trade Copier by Phoenix Technologies places each order on every account that follows it.

  • Included in the Thor Plan, $39 a month
  • Starts with 14 days free
  • Futures and CFD accounts follow it

At a glance

EndpointPOST https://app.thortradecopier.com/hooks/tv/YOUR-TOKEN
AuthenticationThe token inside your URL. Keep the URL secret.
BodyJSON with Content-Type: application/json
Answer{"ok":true} received · {"ok":false,"error":"..."} not understood · 400 malformed JSON · 404 unknown URL
OrdersMarket orders, placed on every account that follows the URL, each at its own size
SymbolsFutures, by root: NQ, MNQ, ES, MES and so on. NQ1! and NQZ2026 work too
SizeWhole contracts. 1 if you leave it out or send 0. The sign is ignored: the action sets the side.
Stop and targetAbsolute prices in sl and tp
Accounts that followFutures: Rithmic, Tradovate, ProjectX, dxFeed, TFeed. CFD: MetaTrader 4 and 5, cTrader, DXTrade, TradeLocker. NinjaTrader copies fills only.

Send your first order in 3 steps

  1. 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.
  2. 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.
  3. Send an order. Thor answers {"ok":true}, and the order appears in the connection's Live alerts list.
curl
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

FieldWhat it does
symbolrequiredThe futures symbol. Thor uses the contract each account trades.
actionrequiredbuy or sell opens, adds or reduces. close closes the whole position. closelong and closeshort close that side only.
quantityWhole contracts. 1 if you leave it out. Each account's own size setting applies on top.
sl, tpStop loss and take profit, as absolute prices.
update_sl, update_tptrue 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

HTTPBodyMeaning
200{"ok":true}Received and passed to your connection.
200{"ok":false,"error":"..."}Not understood. Nothing is placed.
400Bad RequestThe 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

  1. Send Content-Type: application/json (or text/plain). Without it, Thor can't read the order.
  2. Send one request at a time and wait for the answer. Parallel requests can arrive in a different order.
  3. Every request is placed, even an identical one. After a timeout, check your positions before sending it again.
  4. {"ok":true} means received, not filled. Check the Live alerts list or GET /api/v1/positions.
  5. Use only the words in the table. Thor reads any word starting with buy, long, sell or short as an entry.
  6. Whole contracts only. A fractional size is not placed. A size of 0 places 1 contract, and a negative size is read as positive.
  7. 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.
  8. 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.
  9. Call it from a server or a script, not from a web page: browsers block the request.
  10. 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.

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.

order.py
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.

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 as text/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/positionsToday's open positions.
GET /api/v1/positions/closedToday's closed positions.
POST /api/v1/positions/flattenCloses every open position on all your accounts.
curl
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