JWT-authenticated API access for consumer sentiment, monitored-chain intelligence, signal data, and export delivery. The docs surface is public; Developer Program is the API-first paid plan for teams that need webhook delivery, integration support, and a larger monthly API envelope.
/developers/, so the portal and the machine-readable schema stay aligned.The public portal points at the canonical live docs aliases exposed by the API runtime.
/api/docs for interactive Swagger UI/api/redoc for structured reference docs/api/openapi.json for machine-readable schema output/api/auth/login to mint the JWT used across protected routeshttps://reviewsignal.ai/api
ReviewSignal exposes two live auth paths depending on the route family you are integrating:
Authorization: Bearer YOUR_JWT_TOKEN
Use JWT for dashboard-session routes such as /api/dashboard/*, /api/billing/*, and account inventory screens. Mint it via POST /api/auth/login and renew with POST /api/auth/refresh.
X-API-Key: rs_your_live_api_key # or equivalently Authorization: Bearer rs_your_live_api_key
Use API keys for direct integration routes under /api/v1/*. Either X-API-Key or Authorization: Bearer <key> is accepted (the Bearer form is convenient for SDKs that only expose an Authorization header). Create and revoke keys from Billing > API Access; the raw key is shown only once. Enterprise keys return rate_limit_remaining: -1 on /api/v1/account, signalling an unmetered quota instead of a finite remaining count.
import requests # 1. Login to get JWT token auth = requests.post("https://reviewsignal.ai/api/auth/login", json={ "email": "you@company.com", "password": "your_password" }) token = auth.json()["token"] headers = {"Authorization": f"Bearer {token}"} # 2. Get trading signals signals = requests.get( "https://reviewsignal.ai/api/dashboard/signals", headers=headers ).json() for s in signals["signals"][:5]: print(f"{s['chain']:20} {s['signal']:6} confidence={s['confidence']:.0%}") # 3. Get sentiment overview overview = requests.get( "https://reviewsignal.ai/api/dashboard/overview", headers=headers ).json() print(f"Tracking {overview['total_locations']} locations, {overview['total_reviews']} reviews")
import requests headers = {"X-API-Key": "rs_your_live_api_key"} # Check account scope and remaining quota account = requests.get( "https://reviewsignal.ai/api/v1/account", headers=headers ).json() print(account["tier"], account["rate_limit_remaining"]) # Request one machine-to-machine signal signal = requests.post( "https://reviewsignal.ai/api/v1/signal", headers=headers, json={"brand": "Starbucks"} ).json() print(signal["signal"], signal["confidence"])
# Login curl -X POST https://reviewsignal.ai/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"you@company.com","password":"your_password"}' # Get trading signals (replace TOKEN) curl https://reviewsignal.ai/api/dashboard/signals \ -H "Authorization: Bearer TOKEN" # Machine-to-machine account check (replace API key) curl https://reviewsignal.ai/api/v1/account \ -H "X-API-Key: rs_your_live_api_key" # Same call, Bearer alias (accepted for /api/v1/*) curl https://reviewsignal.ai/api/v1/account \ -H "Authorization: Bearer rs_your_live_api_key"
sdk/python/ for desks that want one authenticated client instead of hand-rolling request wrappers.pip install -e ./sdk/python
from reviewsignal import ReviewSignalClient client = ReviewSignalClient() client.login("you@company.com", "your_password") overview = client.dashboard_overview(category="Coffee") signals = client.dashboard_signals(signal_type="BUY", per_page=10) subscription = client.billing_subscription() print(overview["total_reviews"], signals["total"], subscription["tier"])
The first SDK cut intentionally stays narrow and maps directly to live self-serve routes instead of inventing abstractions that the API does not expose.
login(), refresh_token(), me()dashboard_overview(), dashboard_signals()billing_subscription()list_api_keys(), create_api_key(), revoke_api_key()v1_account(), v1_signal() for API-key flowsX-API-Key.| Feature | Trial | Signal (€299) | Starter (€999) | Developer Program (€1,500) | Professional (€2,500) | Enterprise (€5,000) |
|---|---|---|---|---|---|---|
| API calls / day | 100 total | 1,000 | 5,000 | 15,000 | 25,000 | Custom (high-volume) |
| Chains in scope | 5 | 10 | 30 | 30 | 79 monitored | 79 monitored + highest-access surfaces |
| Trading signals | ✕ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Public docs + quick start | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Webhook delivery | ✕ | ✕ | ✕ | ✓ | ✓ | ✓ |
| Forecast + anomaly scan | ✕ | ✕ | ✕ | ✕ | ✓ | ✓ |
| Competitive analysis | ✕ | ✕ | ✓ | ✓ | ✓ | ✓ |
| Echo Network visualization | ✕ | ✕ | ✕ | ✕ | ✓ | ✓ |
| Backtest track record | ✕ | ✕ | ✕ | ✕ | ✓ | ✓ |
| SSO / SAML | ✕ | ✕ | ✕ | ✕ | ✕ | ✓ |
| Alert rules | 2 | 5 | 10 | 10 | 25 | Custom |
{
"signals": [
{
"chain_name": "Starbucks",
"signal_type": "BUY",
"confidence": 0.82,
"severity": "HIGH",
"sentiment_current": 0.64,
"sentiment_delta_7d": 0.08,
"review_count_7d": 247,
"created_at": "2026-04-03T08:05:00+00:00",
"category": "Coffee",
"sparkline_30d": [0.21, 0.24, 0.28]
}
],
"total": 1,
"page": 1,
"per_page": 25,
"total_pages": 1
}
CHANGELOG.md so the developer surface, SDK examples, and runtime contract changes have one review path.Current source of truth: CHANGELOG.md in the repo root, alongside sdk/python/ and the live OpenAPI schema.
| Code | Meaning | Action |
|---|---|---|
| 401 | Unauthorized | JWT missing/expired or API key invalid. Re-login or rotate the key from Billing. |
| 403 | Forbidden | Your tier doesn't include this feature. Upgrade at /dashboard/billing.html |
| 429 | Rate Limited | Too many requests. Wait and retry with exponential backoff. |
| 500 | Server Error | Contact team@reviewsignal.ai with the request details. |
Technical support is available for authentication, delivery, and integration questions.