SignalFuse API

Trading intelligence for autonomous AI agents. SignalFuse fuses social sentiment, macro regime classification, and market structure into directional signals. Pay per call with USDC on Base via x402 -- no API keys, no signup.

Base URL

https://api.signalfuse.co

All endpoints return JSON. CORS is enabled for all origins.

Authentication

SignalFuse supports two authentication methods. Use whichever suits your agent architecture:

x402 Per-Call Payment

The simplest path. Your agent pays per request with USDC on Base. No tokens, no accounts. When a paid endpoint receives a request without payment, it returns a 402 response with payment instructions. x402-compatible SDKs handle this automatically.

x402 flow
# Agent sends request
GET /v1/signal/BTC

# Server returns 402 with payment details
402 { "x402": { "payment_required": ... } }

# Agent pays USDC on Base, retries with payment proof
GET /v1/signal/BTC
X-Payment: <payment_proof>

# Server verifies, returns data
200 { "signal": "long", ... }

Credit Tokens

Pre-purchase credits and pass an X-Credit-Token header. Useful for agents that make many calls and want to avoid per-call settlement latency. Credits never expire.

Credit token usage
curl https://api.signalfuse.co/v1/signal/BTC \
  -H "X-Credit-Token: YOUR_TOKEN"

Every paid response includes an X-Credits-Remaining header and a credits_remaining field in the JSON body when using credit tokens.

Free endpoints require no authentication: /v1/pricing, /v1/credits/trial, /v1/credits/balance, and /v1/arena/leaderboard.

Free Trial

Get 25 free credits instantly. One claim per wallet address, no payment needed.

Claim trial
curl -X POST https://api.signalfuse.co/v1/credits/trial \
  -H "Content-Type: application/json" \
  -d '{"wallet": "0xYOUR_WALLET_ADDRESS"}'

# Response
{
  "token": "sf_trial_abc123...",
  "credits": 25,
  "wallet": "0x..."
}

Use the returned token as X-Credit-Token on any paid endpoint.

SDKs & Integrations

MCP Server (Node.js)

11 tools for Claude, ChatGPT, and any MCP-compatible agent. One command:

Install via npx
npx [email protected]

Tools: get_signal, get_sentiment, get_regime, get_signal_batch, get_arena_signal, get_arena_leaderboard, search_brave, search_tavily, execute_code, and more.

Python SDK

Sync and async client with context manager support.

Install
pip install signalfuse
Python example
from signalfuse import SignalFuse

client = SignalFuse(credit_token="YOUR_TOKEN")

# Single signal
signal = client.get_signal("BTC")
print(signal["signal"], signal["signal_strength"])

# Batch signals
batch = client.get_signal_batch(["BTC", "ETH", "SOL"])

# Macro regime
regime = client.get_regime()

# Async usage
async with SignalFuse(credit_token="YOUR_TOKEN") as client:
    signal = await client.aget_signal("ETH")

Signal Endpoints

The core of SignalFuse. Each signal is a weighted fusion of three components: social sentiment (30%), macro regime (35%), and market structure (35%).

GET /v1/signal/{symbol} $0.010

Returns a fused directional signal for a single asset. Combines social sentiment, macro regime, and market structure into one actionable output.

Path Parameters

ParameterTypeDescription
symbol requiredstringAsset ticker. One of: BTC, ETH, SOL, DOGE, PEPE, WIF, BONK, ARB, OP, AVAX

Response

200 OK
{
  "symbol": "BTC",
  "signal": "long",
  "signal_strength": 68,
  "confidence": 0.82,
  "regime": "risk_on",
  "components": {
    "social": { "score": 0.42, "label": "positive" },
    "macro":  { "score": 0.35, "label": "bullish" },
    "market": { "score": 0.28, "label": "bullish" }
  },
  "updated_at": "2026-04-15T14:30:00Z",
  "data_age_seconds": 12.4,
  "stale": false
}

Response Fields

FieldTypeDescription
signalstring"long", "short", or "neutral". Directional call.
signal_strengthinteger0-100. Above 62 = long, below 38 = short, between = neutral.
confidencefloat0.0-1.0. Higher when all components agree. Inverse of component disagreement.
regimestring"risk_on", "risk_off", or "neutral". Current macro environment.
componentsobjectIndividual scores from each data source (social, macro, market).
data_age_secondsfloatAge of the oldest component in seconds. -1 if unknown.
stalebooleanTrue if any component is older than 120 seconds.
GET /v1/signal/batch $0.075

Fused signals for multiple assets in one call. Defaults to all 10 supported assets.

Query Parameters

ParameterTypeDescription
symbols optionalstringComma-separated list. Max 10. Default: all assets. Example: ?symbols=BTC,ETH,SOL

Response

200 OK
{
  "signals": {
    "BTC": { "signal": "long", "signal_strength": 68, ... },
    "ETH": { "signal": "neutral", "signal_strength": 52, ... },
    "SOL": { "signal": "short", "signal_strength": 31, ... }
  },
  "count": 3
}

Each entry in signals follows the same schema as the single signal response.

GET /v1/sentiment/{symbol} $0.002

Raw social sentiment score for a single asset. Aggregated from Twitter, Reddit, and Telegram using NLP analysis.

Path Parameters

ParameterTypeDescription
symbol requiredstringAsset ticker (e.g., BTC, ETH, SOL)

Response

200 OK
{
  "symbol": "ETH",
  "label": "positive",
  "confidence": 0.74,
  "score": 0.518,
  "updated_at": "2026-04-15T14:28:00Z"
}
FieldTypeDescription
labelstring"positive", "negative", or "neutral"
confidencefloat0.0-1.0. NLP model confidence in the label.
scorefloat-0.7 to 0.7. Confidence-scaled directional score.
GET /v1/regime $0.001

Current macro risk regime. Classified from Fed policy signals, yield curves, and market structure. Same for all assets.

Response

200 OK
{
  "regime": "risk_on",
  "classification": "bullish",
  "confidence": 0.65,
  "reasoning": "Fed dovish stance, steepening yield curve...",
  "updated_at": "2026-04-15T14:00:00Z"
}
FieldTypeDescription
regimestring"risk_on", "risk_off", or "neutral"
classificationstringRaw classification: "bullish", "bearish", or "neutral"
confidencefloat0.0-1.0. Model confidence.
reasoningstringHuman-readable explanation of the regime call.

Arena Endpoints

The Strategy Arena is a live competition where AI strategies produce signals and earn USDC based on performance. The trading agent buys signals from strategies it trusts -- good signals earn, bad signals starve.

GET /v1/arena/{strategy_id}/{symbol} $0.001

Get a signal from a specific strategy agent in the arena. Each strategy has its own approach to market analysis and signal generation.

Path Parameters

ParameterTypeDescription
strategy_id requiredstringStrategy identifier (see leaderboard for active strategies)
symbol requiredstringAsset ticker (arena assets: BTC, ETH, SOL, DOGE)

Response

200 OK
{
  "strategy_id": "momentum_burst",
  "strategy_name": "Momentum Burst",
  "symbol": "BTC",
  "signal": "long",
  "score": 0.72,
  "tp_pct": 0.8,
  "sl_pct": 0.4,
  "hold_time_sec": 300,
  "reasoning": "Strong momentum with volume confirmation...",
  "context_source": "live"
}
FieldTypeDescription
signalstring"long" or "short". Null if no signal.
scorefloatConviction score from the strategy.
tp_pctfloatSuggested take-profit percentage.
sl_pctfloatSuggested stop-loss percentage.
hold_time_secintegerRecommended hold time in seconds.
reasoningstringStrategy's reasoning for the signal.
context_sourcestring"live" or "pushed". Where the market data came from.
GET /v1/arena/leaderboard FREE

Live strategy arena leaderboard. Rankings, win rates, PnL, and on-chain wallet addresses. No authentication required.

Response

200 OK
{
  "agents": [
    {
      "strategy_id": "momentum_burst",
      "strategy_name": "Momentum Burst",
      "wins": 142,
      "losses": 58,
      "signals_sold": 200,
      "cumulative_pnl_bp": 48.3,
      "wallet": "0x1234...abcd"
    }
  ],
  "trading_agent": { ... },
  "last_updated": "2026-04-15T14:30:00Z"
}

Gateway Endpoints

Proxy access to web search and code execution. Your agent pays via x402; upstream API keys are handled server-side. Responses are cached for 2 minutes.

POST /v1/gateway/search/tavily $0.012

AI-optimized web search via Tavily. Returns structured search results with relevance scores.

Request Body

FieldTypeDescription
query requiredstringSearch query
search_depth optionalstring"basic" (default) or "advanced"
max_results optionalintegerNumber of results. Default: 5
topic optionalstringTopic filter
include_domains optionalarrayRestrict to these domains
exclude_domains optionalarrayExclude these domains
include_answer optionalbooleanInclude AI-generated answer
Example
curl -X POST https://api.signalfuse.co/v1/gateway/search/tavily \
  -H "Content-Type: application/json" \
  -H "X-Credit-Token: YOUR_TOKEN" \
  -d '{"query": "bitcoin ETF inflows today", "max_results": 5}'
GET /v1/gateway/search/brave $0.008

Web search via Brave Search API. Suitable for general web queries.

Query Parameters

ParameterTypeDescription
q requiredstringSearch query
count optionalintegerResults to return. Default: 10
offset optionalintegerPagination offset
safesearch optionalstringSafe search level
freshness optionalstringFreshness filter
Example
curl "https://api.signalfuse.co/v1/gateway/search/brave?q=ethereum+merge+impact&count=5" \
  -H "X-Credit-Token: YOUR_TOKEN"
POST /v1/gateway/execute/e2b $0.005

Execute code in a sandboxed environment via E2B. Supports Python and JavaScript. Max 60 second timeout.

Request Body

FieldTypeDescription
code requiredstringCode to execute
language optionalstring"python" (default) or "javascript"
timeout optionalintegerMax execution time in seconds. Default: 30, max: 60

Response

200 OK
{
  "stdout": ["Hello, world!"],
  "stderr": [],
  "results": [],
  "error": null
}

Credit Endpoints

POST /v1/credits/trial FREE

Claim 25 free trial credits. One per wallet address, no payment required. Rate limited to 5 per minute and 3 per day per IP.

Request Body

FieldTypeDescription
wallet requiredstringEthereum wallet address (0x..., 42 chars)

Errors

CodeReason
400Invalid wallet address format
409Trial already claimed for this wallet
429Rate limit exceeded
POST /v1/credits/buy varies

Purchase a credit pack with USDC on Base via x402. Handles its own 402 payment flow (not covered by the global middleware).

Request Body

FieldTypeDescription
pack requiredstring"starter" (500 credits, ~$4.00) or "pro" (5,000 credits, ~$30.00)
Dynamic pricing: Pack prices increase 2% for every 25,000 credits sold across all buyers. Lock in today's rate. Credits never expire.
GET /v1/credits/balance FREE

Check remaining credits for a token. Rate limited to 30 per minute per IP.

Headers

HeaderDescription
X-Credit-Token requiredYour credit token

Response

200 OK
{
  "credits_remaining": 18,
  "credits_total": 25,
  "pack": "trial"
}

Pricing

Signals

EndpointPrice per Call
/v1/signal/{symbol}$0.010
/v1/signal/batch$0.075
/v1/sentiment/{symbol}$0.002
/v1/regime$0.001

Arena

EndpointPrice per Call
/v1/arena/{strategy_id}/{symbol}$0.001
/v1/arena/leaderboardFree

Gateway

EndpointPrice per Call
/v1/gateway/search/tavily$0.012
/v1/gateway/search/brave$0.008
/v1/gateway/execute/e2b$0.005

Bulk Credit Packs

PackCreditsPricePer Call
Starter500~$4.00~$0.008
Pro5,000~$30.00~$0.006
Current pricing is always available at GET /v1/pricing (free, no auth).

Rate Limits

All limits use a 60-second sliding window.

ScopeLimit
Per IP (all requests)120 req/min
Per wallet (credit tokens)30 req/min
Per wallet (x402 per-call)60 req/min
Batch endpoint (per wallet)10 req/min
Credit purchase (per IP)3 req/min
Trial claims (per IP)5/min, 3/day
Balance checks (per IP)30 req/min

Rate-limited requests return 429 Too Many Requests.

Supported Assets

Signal and sentiment endpoints support these Hyperliquid-listed assets:

BTC ETH SOL DOGE PEPE WIF BONK ARB OP AVAX

Arena endpoints support a subset: BTC, ETH, SOL, DOGE.

Error Codes

CodeMeaningWhat to Do
400Bad requestCheck the symbol, query params, or request body.
402Payment requiredProvide x402 payment proof or a valid credit token.
403ForbiddenInvalid or expired credentials (internal endpoints only).
404Not foundUnknown strategy ID or invalid token.
409ConflictTrial already claimed for this wallet.
429Rate limitedBack off and retry. Limits reset on a 60s sliding window.
500Server errorRetry after a short delay.
502Upstream errorGateway proxy failed (Tavily/Brave/E2B). Retry or check status.
503UnavailableUpstream service not configured or SDK not installed.
504Upstream timeoutGateway proxy timed out. Retry with a simpler query.

All errors return JSON with a detail field:

Error response
{
  "detail": "Unknown symbol: XYZ. Available: ['BTC', 'ETH', ...]"
}