Introduction

Signal Labs is a real-time competitive intelligence platform. Track competitors, generate AI-powered battlecards, and monitor competitive and market signals from the dashboard, or programmatically via REST API, native SDKs, or AI tools, agents, and CLIs via MCP.

Base URL

All API requests are made to the following base URL:

Base URL
https://app.usesignallabs.com/api/v1

Authentication

All API requests require a Bearer token in the Authorization header:

Bash
curl https://app.usesignallabs.com/api/v1/companies \
  -H "Authorization: Bearer sl_live_your_key_here"

Get your API key from Settings > API Keys.

Response Format

All responses return JSON with a consistent structure:

JSON
{
  "data": { ... },
  "meta": {
    "total": 5
  }
}

List endpoints return data as an array. Single-resource endpoints return data as an object.

Endpoints

Document endpoints are listed separately under Documents. A machine-readable OpenAPI description of everything below is available at /v1/openapi.json.

MethodPathDescription
GET/v1/companiesList the companies your organization tracks
POST/v1/companiesTrack a company. Returns immediately; profile analysis continues in the background
GET/v1/companies/{id}Get a single company
GET/v1/companies/{id}/profileOfferings and value propositions extracted from the website, plus profile_status
POST/v1/companies/{id}/profile/refreshRe-extract the profile from the website
GET/v1/companies/{id}/productsList product / service verticals
POST/v1/companies/{id}/productsAdd a product vertical
GET/v1/companies/{id}/competitorsList tracked competitors
POST/v1/companies/{id}/competitorsAdd competitors. Returns immediately; research continues in the background
POST/v1/companies/{id}/competitors/discoverAI competitor suggestions. Creates nothing and consumes no allowance
GET/v1/competitors/{id}/pageThe researched competitor page, plus generation_status
GET/v1/companies/{id}/battlecardsList battlecards
POST/v1/companies/{id}/battlecards/generateGenerate a battlecard (1 credit)
GET/v1/companies/{id}/signalsRecent competitive and market signals
GET/v1/companies/{id}/signals/summaryAI-generated digest of recent signals
POST/v1/ai/chatAsk a question about your competitive landscape

Asynchronous Operations

Creating a company and adding a competitor both return before their work is finished. Researching a website takes 30–90 seconds, so the API records the row, responds, and continues in the background rather than holding the connection open.

This means a company you just created has no offerings yet, and a competitor you just added has no researched page yet. Poll until the status field reports completion:

Bash
# profile_status is "pending" while the website is being analysed,
# then "ready". generation_status behaves the same way for competitors.
curl https://app.usesignallabs.com/api/v1/companies/{company_id}/profile \
  -H "Authorization: Bearer sl_live_your_key_here"

Why this matters: battlecards are grounded in the competitor's researched page and your own company profile. Generating one the instant after adding a competitor still works and still costs a credit, but the result is thinner. Wait for generation_status to read ready first.

Errors

Errors return a structured JSON object with actionable guidance:

JSON
{
  "error": {
    "code": "insufficient_credits",
    "message": "Battlecard generation requires 1 credit. Your organization has 0 remaining.",
    "type": "credit_error",
    "credits_remaining": 0,
    "credits_required": 1,
    "upgrade_url": "https://app.usesignallabs.com/settings/billing"
  }
}

Error Types

HTTP CodeTypeDescription
400validation_errorMissing or invalid parameters
400prerequisite_errorMust complete a prior step first (includes required_step and docs_url)
401authentication_errorMissing, invalid, or revoked API key
403credit_errorInsufficient credits for this operation
403limit_errorPlan limit reached (e.g., competitor count)
404not_found_errorResource not found
429rate_limit_errorDaily rate limit exceeded (includes retry_after)
400invalid_fileFile type not supported or exceeds 25MB
400document_context_too_largeCombined document text exceeds 100,000 character limit
400document_not_readyDocument not found or not yet processed
403storage_quota_exceededOrganization storage quota exceeded
500server_errorInternal server error

Rate Limits

PlanRequests / Day
Free100
Team10,000

Storage Quotas

PlanStorage Quota
Free100 MB
Team10 GB

Credits

OperationCost
Generate Battlecard1 credit
AI Modify Battlecard0.5 credits
Create CompanyFree
Add CompetitorFree (plan limits apply)
Add ProductFree
List / Get (all read ops)Free

Documents

Upload competitive documents for AI analysis and RAG-powered battlecard generation.

MethodPathDescription
POST/v1/documents/uploadUpload a document (multipart form data, max 25MB). Supported: PDF, DOCX, XLSX, CSV, PPTX, TXT, MD, PNG, JPG, WebP.
GET/v1/documents?company_id={id}List documents with storage usage stats and auto-tags
GET/v1/documents/{id}Get document detail including extracted text and auto-tags
DELETE/v1/documents/{id}Delete a document and its RAG chunks

Documents are automatically parsed, chunked, and embedded for RAG. Use document_ids when generating battlecards to include uploaded documents as additional context.

After processing, each document is also auto-tagged in the background: an AI pass identifies which of your tracked competitors it discusses, so the document surfaces on those competitors and in chat retrieval without you filing it manually. The upload response returns auto_tagging: "pending"; read the resulting auto_tags from either GET endpoint a few seconds later.

Enablement Focus Types

When generating battlecards, specify one of these focus types:

FocusDescriptionParameter
gtm_salesGTM / Sales enablement (default)competitor_id
productProduct & engineeringcompetitor_id
marketing_growthMarketing & growthcompetitor_id
leadershipStrategy & leadershipcompetitor_id
customWritten entirely from your own brief. Requires special_instructionscompetitor_id
landscapeMulti-competitor landscape analysiscompetitor_ids (array of 2–8)

Note: The landscape focus requires competitor_ids instead of competitor_id, with between 2 and 8 competitor IDs. Anything beyond the eighth is ignored, so split larger comparisons into multiple reports.

SDKs

  • JavaScript / TypeScript: npm install @signal-labs/sdk
  • Python: pip install signallabs

MCP Server

For AI agents (Claude, Cursor, Copilot):

Bash
npx signallabs-mcp

See the MCP Setup Guide for full configuration instructions.

What's Next?