API Documentation

Score any company programmatically using AI-powered analysis across 15 data sources.

Base URL: https://signalbridge.app/api/v1

Authentication

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.

Header format
Authorization: Bearer sb_your_api_key_here

Rate 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 window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetSeconds until the window resets

Score a Company

POST/api/v1/score

Score a single company with AI analysis.

Request Body

companystringrequired

Company name to score (e.g., "Stripe", "Vercel").

typestring

Score type. Default: "startup". Options: startup, vc.

forceboolean

Bypass cache and force a fresh score. Default: false.

curl
curl -X POST https://signalbridge.app/api/v1/score \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sb_your_key" \
  -d '{"company": "Stripe"}'
Node.js
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)
Python
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

POST/api/v1/bulk

Score multiple companies in a single request. Enterprise tier only.

Request Body

companiesstring[]required

Array of company names (max 10 per request).

typestring

Score type applied to all companies. Default: "startup".

curl
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:

Response (200 OK)
{
  "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 name
401UNAUTHORIZED — Missing or invalid API key
403USAGE_LIMIT — Monthly scoring limit reached
413PAYLOAD_TOO_LARGE — Request body exceeds 100KB
429RATE_LIMITED — Exceeded 20 requests/minute
502BAD_GATEWAY — Upstream scoring service error
503SERVICE_UNAVAILABLE — API key or scoring not configured
Error response format
{
  "error": "Rate limit exceeded. Max 20 requests per minute.",
  "code": "RATE_LIMITED"
}

Examples

Portfolio Screening

Score a batch of portfolio companies
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.