TRADECYCLEBOT · SIGNAL SELLER API

Connect your signal system to TradeCycleBot.

This documentation is public so you can review the integration before registering. Once your Signal Seller account is approved, you can create a private API key and start publishing signals from your software, strategy or server.

01

Before you connect

You can read this documentation without an account. To send real signals you must complete this flow:

  1. Create a TCB account and activate the Signal Seller workspace.
  2. Complete your profile and submit it for approval.
  3. After approval, create at least one signal channel.
  4. In Signal Seller → 6. Signal API, create the API key. The complete key is displayed only once.
Important: the documentation is public, but API keys are never public. A key can only be generated inside an approved Signal Seller account.
02

Authentication

Send your API key with every request using the Bearer header. Never include it in the URL or JSON payload.

Authorization: Bearer <API_KEY>
Content-Type: application/json

Signal Seller keys begin with tcb_sig_sk_. The Portal does not store the full key; it keeps a hash and a short prefix for identification.

03

Publish a signal

POSThttps://tradecyclebot.com/api/v1/signals

The body must be JSON. You may identify the channel by numeric channel_id or by its slug in channel. You do not need both; channel_id takes precedence.

{
  "channel_id": 1,
  "side": "BUY",
  "symbol": "BTCUSDT",
  "ttl_seconds": 1800,
  "reference_price": 65000,
  "confidence": 0.85,
  "comment": "Breakout confirmed",
  "source_event_id": "strategy-A-20260907-0001"
}
04

Field reference

FieldRequiredDescription
channel_id / channelYes, oneNumeric channel ID or slug of an ACTIVE channel owned by the authenticated seller.
sideYesBUY or SELL.
symbolYesUppercase symbol such as BTCUSDT. For verified performance it must be available on Binance Spot at publication time.
ttl_secondsYes1–86400. Controls how long the signal remains available for bot delivery. It does not limit performance tracking.
reference_priceNoSeller-authored reference price. Preserved as metadata but never used as the verified performance entry.
confidenceNoOptional numeric value defined by your system as signal metadata.
commentNoDescriptive signal text. The Portal stores up to 2,000 characters.
source_event_idNo, recommendedUnique ID from your system. Enables safe retries without creating duplicate signals; up to 240 characters are stored.
05

Copy-ready examples

cURL

curl -X POST 'https://tradecyclebot.com/api/v1/signals' \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "channel_id": 1,
    "side": "BUY",
    "symbol": "BTCUSDT",
    "ttl_seconds": 1800,
    "source_event_id": "strategy-A-0001"
  }'

Python

import requests

url = "https://tradecyclebot.com/api/v1/signals"
headers = {
    "Authorization": "Bearer <API_KEY>",
    "Content-Type": "application/json",
}
payload = {
    "channel_id": 1,
    "side": "BUY",
    "symbol": "BTCUSDT",
    "ttl_seconds": 1800,
    "source_event_id": "strategy-A-0001",
}

response = requests.post(url, headers=headers, json=payload, timeout=15)
response.raise_for_status()
print(response.json())

JavaScript / Node.js

const response = await fetch("https://tradecyclebot.com/api/v1/signals", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <API_KEY>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    channel_id: 1,
    side: "BUY",
    symbol: "BTCUSDT",
    ttl_seconds: 1800,
    source_event_id: "strategy-A-0001"
  })
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
06

Response & errors

Accepted publication

{
  "ok": true,
  "signal_id": "sig_...",
  "side": "BUY",
  "symbol": "BTCUSDT",
  "expires_at": "2026-09-07T19:30:00+00:00",
  "verified_entry_price": 112345.67,
  "performance_ruleset": "TCB_SIGNAL_V1",
  "market_source": "BINANCE_SPOT"
}
2xxRequest accepted
400Invalid payload, channel, symbol or publication
401Missing/invalid/revoked key or seller not approved

Validation errors return JSON with {"ok":false,"error":"..."}. Treat any non-2xx response as unconfirmed and use a stable source_event_id before retrying.

07

Safe retries and idempotency

If your server loses the HTTP response, do not generate a new ID. Retry with the exact same source_event_id. TradeCycleBot keeps that identifier unique per seller and returns the already-recorded signal instead of creating another one.

source_event_id = "YOUR_SYSTEM_EVENT_123456"

Use a deterministic identifier for the event in your system, not for the individual HTTP attempt.

08

TradeCycleBot Verified Performance

Since v10.79, the Portal automatically captures the Binance Spot price at publication as verified_entry_price. That value—not reference_price—is the entry used for the Signal Seller's public verified performance.

WIN+0.50%favorable move
LOSS−3.00%adverse move
TARGETS3 · 5 · 8 · 10%MFE
WINDOW7 daysindependent of TTL

BUY and SELL are evaluated symmetrically. A signal that reaches +0.50% favorable is already a WIN and remains tracked for its peak until it returns to entry, reaches +10%, or the window ends. A signal reaching neither WIN nor LOSS within 7 days becomes EXPIRED.

TTL ≠ performance window. For example, ttl_seconds=1800 means the bot may consume the signal for 30 minutes; TradeCycleBot may continue measuring its performance after those 30 minutes.
09

Integration security

  • Store the API key as a server secret or environment variable; never in browser-executed JavaScript.
  • Do not expose the key in logs, screenshots, repositories or support tickets.
  • Always use HTTPS and verify the HTTP status before considering a signal published.
  • Use source_event_id in production so retries are idempotent.