API Documentation
Score any company programmatically using AI-powered analysis across 15 data sources.
https://signalbridge.app/api/v1Authentication
All API requests require a Bearer token. Create an API key from your dashboard under Settings → API Keys (requires Pro or Enterprise plan).
Keys use the sb_ prefix. The full key is shown only once at creation — store it securely. Keys are stored as SHA-256 hashes.
Authorization: Bearer sb_your_api_key_hereRate Limits
API requests are limited to 20 requests per minute per API key (sliding window). Rate limit headers are included in every response:
X-RateLimit-LimitMaximum requests per windowX-RateLimit-RemainingRequests remaining in current windowX-RateLimit-ResetSeconds until the window resetsScore a Company
/api/v1/scoreScore a single company with AI analysis.
Request Body
companystringrequiredCompany name to score (e.g., "Stripe", "Vercel").
typestringScore type. Default: "startup". Options: startup, vc.
forcebooleanBypass cache and force a fresh score. Default: false.
curl -X POST https://signalbridge.app/api/v1/score \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sb_your_key" \
-d '{"company": "Stripe"}'const res = await fetch('https://signalbridge.app/api/v1/score', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer sb_your_key',
},
body: JSON.stringify({ company: 'Stripe' }),
})
const data = await res.json()
console.log(data.score, data.categories)import requests
resp = requests.post(
"https://signalbridge.app/api/v1/score",
headers={"Authorization": "Bearer sb_your_key"},
json={"company": "Stripe"},
)
data = resp.json()
print(f"Score: {data['score']}/100")Bulk Scoring
/api/v1/bulkScore multiple companies in a single request. Enterprise tier only.
Request Body
companiesstring[]requiredArray of company names (max 10 per request).
typestringScore type applied to all companies. Default: "startup".
curl -X POST https://signalbridge.app/api/v1/bulk \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sb_your_key" \
-d '{"companies": ["Stripe", "Vercel", "Supabase"]}'Response Format
Successful scoring returns the following fields:
{
"id": "uuid",
"company": "Stripe",
"slug": "stripe",
"score": 87,
"categories": {
"Product & Technology": 90,
"Market Opportunity": 85,
"Team & Execution": 88,
"Financial Health": 82,
"Competitive Position": 90
},
"strengths": ["Strong developer ecosystem", "..."],
"risks": ["Regulatory pressure in fintech", "..."],
"insight": "Stripe demonstrates exceptional...",
"tagline": "The payments infrastructure company",
"sector": "fintech",
"stage": "growth",
"_cached": false
}Error Codes
400VALIDATION_ERROR — Invalid request body or company name401UNAUTHORIZED — Missing or invalid API key403USAGE_LIMIT — Monthly scoring limit reached413PAYLOAD_TOO_LARGE — Request body exceeds 100KB429RATE_LIMITED — Exceeded 20 requests/minute502BAD_GATEWAY — Upstream scoring service error503SERVICE_UNAVAILABLE — API key or scoring not configured{
"error": "Rate limit exceeded. Max 20 requests per minute.",
"code": "RATE_LIMITED"
}Examples
Portfolio Screening
const companies = ['Stripe', 'Vercel', 'Supabase', 'Linear']
const results = await Promise.all(
companies.map(async (company) => {
const res = await fetch('https://signalbridge.app/api/v1/score', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`,
},
body: JSON.stringify({ company }),
})
return res.json()
})
)
// Sort by score descending
results.sort((a, b) => b.score - a.score)
console.table(results.map(r => ({
company: r.company,
score: r.score,
sector: r.sector,
})))Webhook Integration
Set up webhooks in your dashboard to receive notifications when watched company scores change. Webhooks send POST requests with HMAC-SHA256 signatures.