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.
# 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.
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.
/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.
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:
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.
pip install signalfuse
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%).
Returns a fused directional signal for a single asset. Combines social sentiment, macro regime, and market structure into one actionable output.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| symbol required | string | Asset ticker. One of: BTC, ETH, SOL, DOGE, PEPE, WIF, BONK, ARB, OP, AVAX |
Response
{
"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
| Field | Type | Description |
|---|---|---|
| signal | string | "long", "short", or "neutral". Directional call. |
| signal_strength | integer | 0-100. Above 62 = long, below 38 = short, between = neutral. |
| confidence | float | 0.0-1.0. Higher when all components agree. Inverse of component disagreement. |
| regime | string | "risk_on", "risk_off", or "neutral". Current macro environment. |
| components | object | Individual scores from each data source (social, macro, market). |
| data_age_seconds | float | Age of the oldest component in seconds. -1 if unknown. |
| stale | boolean | True if any component is older than 120 seconds. |
Fused signals for multiple assets in one call. Defaults to all 10 supported assets.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| symbols optional | string | Comma-separated list. Max 10. Default: all assets. Example: ?symbols=BTC,ETH,SOL |
Response
{
"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.
Raw social sentiment score for a single asset. Aggregated from Twitter, Reddit, and Telegram using NLP analysis.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| symbol required | string | Asset ticker (e.g., BTC, ETH, SOL) |
Response
{
"symbol": "ETH",
"label": "positive",
"confidence": 0.74,
"score": 0.518,
"updated_at": "2026-04-15T14:28:00Z"
}
| Field | Type | Description |
|---|---|---|
| label | string | "positive", "negative", or "neutral" |
| confidence | float | 0.0-1.0. NLP model confidence in the label. |
| score | float | -0.7 to 0.7. Confidence-scaled directional score. |
Current macro risk regime. Classified from Fed policy signals, yield curves, and market structure. Same for all assets.
Response
{
"regime": "risk_on",
"classification": "bullish",
"confidence": 0.65,
"reasoning": "Fed dovish stance, steepening yield curve...",
"updated_at": "2026-04-15T14:00:00Z"
}
| Field | Type | Description |
|---|---|---|
| regime | string | "risk_on", "risk_off", or "neutral" |
| classification | string | Raw classification: "bullish", "bearish", or "neutral" |
| confidence | float | 0.0-1.0. Model confidence. |
| reasoning | string | Human-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 a signal from a specific strategy agent in the arena. Each strategy has its own approach to market analysis and signal generation.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| strategy_id required | string | Strategy identifier (see leaderboard for active strategies) |
| symbol required | string | Asset ticker (arena assets: BTC, ETH, SOL, DOGE) |
Response
{
"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"
}
| Field | Type | Description |
|---|---|---|
| signal | string | "long" or "short". Null if no signal. |
| score | float | Conviction score from the strategy. |
| tp_pct | float | Suggested take-profit percentage. |
| sl_pct | float | Suggested stop-loss percentage. |
| hold_time_sec | integer | Recommended hold time in seconds. |
| reasoning | string | Strategy's reasoning for the signal. |
| context_source | string | "live" or "pushed". Where the market data came from. |
Live strategy arena leaderboard. Rankings, win rates, PnL, and on-chain wallet addresses. No authentication required.
Response
{
"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.
AI-optimized web search via Tavily. Returns structured search results with relevance scores.
Request Body
| Field | Type | Description |
|---|---|---|
| query required | string | Search query |
| search_depth optional | string | "basic" (default) or "advanced" |
| max_results optional | integer | Number of results. Default: 5 |
| topic optional | string | Topic filter |
| include_domains optional | array | Restrict to these domains |
| exclude_domains optional | array | Exclude these domains |
| include_answer optional | boolean | Include AI-generated answer |
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}'
Web search via Brave Search API. Suitable for general web queries.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| q required | string | Search query |
| count optional | integer | Results to return. Default: 10 |
| offset optional | integer | Pagination offset |
| safesearch optional | string | Safe search level |
| freshness optional | string | Freshness filter |
curl "https://api.signalfuse.co/v1/gateway/search/brave?q=ethereum+merge+impact&count=5" \ -H "X-Credit-Token: YOUR_TOKEN"
Execute code in a sandboxed environment via E2B. Supports Python and JavaScript. Max 60 second timeout.
Request Body
| Field | Type | Description |
|---|---|---|
| code required | string | Code to execute |
| language optional | string | "python" (default) or "javascript" |
| timeout optional | integer | Max execution time in seconds. Default: 30, max: 60 |
Response
{
"stdout": ["Hello, world!"],
"stderr": [],
"results": [],
"error": null
}
Credit Endpoints
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
| Field | Type | Description |
|---|---|---|
| wallet required | string | Ethereum wallet address (0x..., 42 chars) |
Errors
| Code | Reason |
|---|---|
| 400 | Invalid wallet address format |
| 409 | Trial already claimed for this wallet |
| 429 | Rate limit exceeded |
Purchase a credit pack with USDC on Base via x402. Handles its own 402 payment flow (not covered by the global middleware).
Request Body
| Field | Type | Description |
|---|---|---|
| pack required | string | "starter" (500 credits, ~$4.00) or "pro" (5,000 credits, ~$30.00) |
Check remaining credits for a token. Rate limited to 30 per minute per IP.
Headers
| Header | Description |
|---|---|
| X-Credit-Token required | Your credit token |
Response
{
"credits_remaining": 18,
"credits_total": 25,
"pack": "trial"
}
Pricing
Signals
| Endpoint | Price per Call |
|---|---|
| /v1/signal/{symbol} | $0.010 |
| /v1/signal/batch | $0.075 |
| /v1/sentiment/{symbol} | $0.002 |
| /v1/regime | $0.001 |
Arena
| Endpoint | Price per Call |
|---|---|
| /v1/arena/{strategy_id}/{symbol} | $0.001 |
| /v1/arena/leaderboard | Free |
Gateway
| Endpoint | Price per Call |
|---|---|
| /v1/gateway/search/tavily | $0.012 |
| /v1/gateway/search/brave | $0.008 |
| /v1/gateway/execute/e2b | $0.005 |
Bulk Credit Packs
| Pack | Credits | Price | Per Call |
|---|---|---|---|
| Starter | 500 | ~$4.00 | ~$0.008 |
| Pro | 5,000 | ~$30.00 | ~$0.006 |
GET /v1/pricing (free, no auth).
Rate Limits
All limits use a 60-second sliding window.
| Scope | Limit |
|---|---|
| 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:
Arena endpoints support a subset: BTC, ETH, SOL, DOGE.
Error Codes
| Code | Meaning | What to Do |
|---|---|---|
| 400 | Bad request | Check the symbol, query params, or request body. |
| 402 | Payment required | Provide x402 payment proof or a valid credit token. |
| 403 | Forbidden | Invalid or expired credentials (internal endpoints only). |
| 404 | Not found | Unknown strategy ID or invalid token. |
| 409 | Conflict | Trial already claimed for this wallet. |
| 429 | Rate limited | Back off and retry. Limits reset on a 60s sliding window. |
| 500 | Server error | Retry after a short delay. |
| 502 | Upstream error | Gateway proxy failed (Tavily/Brave/E2B). Retry or check status. |
| 503 | Unavailable | Upstream service not configured or SDK not installed. |
| 504 | Upstream timeout | Gateway proxy timed out. Retry with a simpler query. |
All errors return JSON with a detail field:
{
"detail": "Unknown symbol: XYZ. Available: ['BTC', 'ETH', ...]"
}