Back to homepage
Developer Reference
Signal API
Send trade signals to your Edgeable account — executes on leader and all follower accounts instantly.

Overview

The Edgeable Signal API allows authorised users to fire a trade signal directly to their Edgeable account via a single HTTP POST. When a signal is received the system executes the order on your leader account and simultaneously on all configured follower accounts — no copier polling delay, instant multi-account execution.

  • Works with TradingView webhooks, Python bots, custom scripts, or any HTTP client
  • Each user has a unique secret token — the URL itself is the authentication
  • API access must be granted by an admin before your token will be accepted
  • Executes market orders on the TV bridge; optional SL/TP placed via the v1 order API

API Access: Your token is active only after an admin enables API access for your account. Contact your admin or email [email protected] to request access.

Your API Token

Your token is the long hex string in your webhook URL. It is unique to your account and acts as both your identity and authentication. Treat it like a password — never share it publicly.

Webhook URL
https://your-server.com/webhook/{your_token}
Get My Token →

Your full webhook URL including your token is shown in the Integrations panel of the Edgeable Syncer desktop app. You can also retrieve it via the authenticated API:

GET /api/integrations
Authorization: X-Auth-Token {your_session_token}

// Response
{
  "ok": true,
  "webhook_url": "https://your-server.com/webhook/abc123def456...",
  "webhook_path": "/webhook/abc123def456..."
}

Signal Endpoint

POST /webhook/{token}

Send a JSON body to this URL. The {token} in the URL is your unique API token (see above). No additional headers or auth keys are required — the token in the URL authenticates the request.

Headers

Content-Type: application/json

Payload Fields

FieldTypeDescription
actionrequired string Must be "ENTRY". Any other value is silently ignored (useful for filtering TradingView alerts).
directionrequired string "bullish" places a Buy. "bearish" places a Sell.
instrumentrequired string Instrument key. Supported: "NQ" / "MNQ" (NQ family) or "GC" / "MGC" (Gold family). Case-insensitive.
stopoptional number Stop-loss price. If provided, a bracket stop order is placed via the v1 API after the market entry fills.
tp1optional number Take-profit 1 price. Placed as a limit order bracket after entry fills.
targetoptional number Take-profit 2 price (alias: tp2 or app_target). Requires two-TP mode configured in your account settings.
regimeSuppressedoptional boolean If true, the signal is silently skipped. Useful when your strategy has a regime filter.
appLevelsoptional object Object containing sl_recommended, sl_tight, tp1, tp2. Used when levels come from the Edgeable Analyser app format.
_field_mapoptional object Inline field name remapping for this request only: {"myDir": "direction", "myInst": "instrument"}. Permanent mappings can be saved in the desktop app.

Order sizing is controlled by your account settings (order_qty), not the signal payload. To change contract size, update your settings in the desktop app.

Response

Success — 200 OK

{
  "ok": true,
  "leader": {
    "market": { "orderId": "123456", "status": "Filled" },
    "stop": { "orderId": "123457", "status": "Working" },
    "take_profit_1": { "orderId": "123458", "status": "Working" }
  },
  "followers": [
    {
      "market": { "orderId": "789012", "status": "Filled" }
    }
  ],
  "follower_errors": null
}

Skipped — 200 OK (filtered)

{
  "ok": true,
  "skipped": true,
  "reason": "filtered"  // action != ENTRY or regimeSuppressed = true
}

HTTP Status Codes

200Signal received and processed (or filtered). Check ok field.
400Invalid payload — missing required field, unknown instrument, or malformed JSON.
403API access not enabled for this account. Contact your admin.
404Unknown token — double-check your webhook URL.
500Execution error — check your broker connection and account configuration.

Examples

cURL — minimal buy signal

curl -X POST https://your-server.com/webhook/YOUR_TOKEN \
  -H "Content-Type: application/json" \
  -d '{
    "action": "ENTRY",
    "direction": "bullish",
    "instrument": "NQ"
  }'

cURL — with stop & take-profit

curl -X POST https://your-server.com/webhook/YOUR_TOKEN \
  -H "Content-Type: application/json" \
  -d '{
    "action": "ENTRY",
    "direction": "bearish",
    "instrument": "NQ",
    "stop": 21350.00,
    "tp1": 21100.00
  }'

Python (requests)

import requests

WEBHOOK_URL = "https://your-server.com/webhook/YOUR_TOKEN"

payload = {
    "action":     "ENTRY",
    "direction":  "bullish",    # or "bearish"
    "instrument": "NQ",
    "stop":       21350.00,    # optional SL
    "tp1":        21100.00,    # optional TP1
}

r = requests.post(WEBHOOK_URL, json=payload, timeout=10)
r.raise_for_status()
print(r.json())

TradingView Alert (Pine Script)

In your TradingView alert, set the Webhook URL to your Edgeable webhook URL and the Message body to:

{
  "action": "ENTRY",
  "direction": "{{strategy.order.action == 'buy' ? 'bullish' : 'bearish'}}",
  "instrument": "NQ",
  "stop": {{strategy.position_entry_price}},
  "regimeSuppressed": false
}

TradingView tip: Use the alert condition (not strategy alert) with action: "ENTRY" only on your entry signals. Non-ENTRY payloads are silently skipped, so it's safe to fire the webhook on every bar — only entries will execute.

Field mapping (custom field names)

If your alert source uses different field names, pass a _field_map to remap them inline:

{
  "_field_map": {
    "type": "action",
    "side": "direction",
    "ticker": "instrument"
  },
  "type": "ENTRY",
  "side": "bullish",
  "ticker": "NQ"
}

Permanent field maps can be saved in the desktop app under Integrations → Field Map so you don't need to include _field_map in every request.

Execution Flow

When a valid signal is received the following happens in order, synchronously within the same HTTP request:

  • 1. Authenticate — token is verified. api_enabled flag is checked.
  • 2. Field mapping — any stored or inline field remap is applied.
  • 3. Parse signalaction, direction, instrument are resolved. Regime filter checked.
  • 4. Leader execution — market order placed on leader account via TV bridge. SL/TP brackets placed via v1 API if provided.
  • 5. Follower execution — same order placed on all configured follower accounts simultaneously. Follower errors are returned in follower_errors but do not fail the overall request.
  • 6. Response — full result object returned with leader order IDs and follower results.

HTTP timeout: The request is synchronous and waits for all executions to complete. Set your HTTP client timeout to at least 15 seconds to account for SL/TP bracket placement and follower execution.

Admin: Granting API Access

API access is off by default for all users. Admins can enable or revoke it via the admin API:

Enable API access for a user

POST /api/admin/users/{user_id}/api-access
X-Auth-Token: {admin_token}
Content-Type: application/json

{ "enabled": true }

// Response
{ "ok": true, "user_id": 42, "api_enabled": true }

Revoke API access

POST /api/admin/users/{user_id}/api-access
{ "enabled": false }

List all users (includes api_enabled + webhook_token)

GET /api/admin/users
X-Auth-Token: {admin_token}

// Response
{
  "ok": true,
  "users": [
    {
      "id": 42,
      "email": "[email protected]",
      "api_enabled": true,
      "webhook_token": "abc123def456...",
      "billing_plan": "pro",
      "billing_status": "active"
    }
  ]
}

Admin auth: Admin API calls require an X-Auth-Token header with a valid session token belonging to a user with is_admin = true. Obtain your session token from the /api/auth/login response.

Rate Limits & Limitations

  • No hard rate limit is enforced by Edgeable, but Tradovate's TV bridge has its own limits. Do not fire more than one signal per second.
  • Only action: "ENTRY" signals place orders. Exit management (SL/TP) is handled via bracket orders placed at entry time.
  • Order quantity is fixed by your account settings — it cannot be overridden per-signal.
  • The webhook executes synchronously. A 500 error means the leader execution failed; check follower_errors for partial failures.
  • Your webhook token is permanent. If compromised, contact your admin to rotate it.

Need help?

If your signal isn't executing, check:

  • Admin has enabled API access for your account (403 error = not enabled)
  • Your broker connection is configured and verified in the desktop app
  • Your TV bridge account ID is set in the Connections panel
  • The action field is exactly "ENTRY" (case-sensitive)

Still stuck? Email [email protected] with your user ID and a copy of the response body.