Quickstart

Track your first competitor in 3 minutes.

Prerequisites

  1. Sign up at app.usesignallabs.com
  2. Go to Settings > API Keys and create an API key
1

Create Your Company

curl -X POST https://app.usesignallabs.com/api/v1/companies \
  -H "Authorization: Bearer sl_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"domain": "yourcompany.com"}'
import { SignalLabs } from '@signal-labs/sdk';

const sl = new SignalLabs(process.env.SIGNALLABS_API_KEY);

const company = await sl.companies.create({ domain: 'yourcompany.com' });
console.log(company.id);
from signallabs import SignalLabs

sl = SignalLabs(api_key="sl_live_your_key")

company = sl.companies.create(domain="yourcompany.com")
print(company["id"])
2

Discover Competitors

curl -X POST https://app.usesignallabs.com/api/v1/companies/{company_id}/competitors/discover \
  -H "Authorization: Bearer sl_live_your_key"
const suggestions = await sl.companies.competitors(company.id).discover();
console.log(suggestions);
suggestions = sl.companies.competitors(company["id"]).discover()
print(suggestions)
3

Add a Competitor

curl -X POST https://app.usesignallabs.com/api/v1/companies/{company_id}/competitors \
  -H "Authorization: Bearer sl_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"competitors": [{"name": "Competitor X", "website": "competitor.com"}]}'
const competitors = await sl.companies.competitors(company.id).add({
  name: 'Competitor X',
  website: 'competitor.com',
});
competitors = sl.companies.competitors(company["id"]).add(
    name="Competitor X",
    website="competitor.com"
)
4

Generate a Battlecard

curl -X POST https://app.usesignallabs.com/api/v1/companies/{company_id}/battlecards/generate \
  -H "Authorization: Bearer sl_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"competitor_id": "competitor-uuid", "enablement_focus": "gtm_sales", "special_instructions": "Focus on enterprise pricing and our SOC 2 advantage"}'
const battlecard = await sl.companies.battlecards(company.id).generate({
  competitor_id: competitors[0].id,
  enablement_focus: 'gtm_sales',
  special_instructions: 'Focus on enterprise pricing and our SOC 2 advantage',
});

console.log(battlecard.overview);
console.log(battlecard.win_strategy);
battlecard = sl.companies.battlecards(company["id"]).generate(
    competitor_id=competitors[0]["id"],
    enablement_focus="gtm_sales",
    special_instructions="Focus on enterprise pricing and our SOC 2 advantage"
)

print(battlecard["overview"])
print(battlecard["win_strategy"])

The special_instructions field is optional (max 10,000 characters) — use it to guide the AI with specific context, focus areas, or instructions.

5

Attach Documents (optional)

You can upload competitive documents and attach them as additional context when generating battlecards:

# Upload a document
curl -X POST https://app.usesignallabs.com/api/v1/documents/upload \
  -H "Authorization: Bearer sl_live_your_key" \
  -F "file=@competitor-report.pdf" \
  -F "company_id=your-company-id" \
  -F "title=Q1 Competitor Report"

# Then generate with document context
curl -X POST https://app.usesignallabs.com/api/v1/companies/{company_id}/battlecards/generate \
  -H "Authorization: Bearer sl_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"competitor_id": "...", "enablement_focus": "gtm_sales", "document_ids": ["document-id"]}'
// Upload a document
const doc = await sl.documents.upload({
  file: 'competitor-report.pdf',
  company_id: company.id,
  title: 'Q1 Competitor Report',
});

// Then generate with document context
const battlecard = await sl.companies.battlecards(company.id).generate({
  competitor_id: competitors[0].id,
  enablement_focus: 'gtm_sales',
  document_ids: [doc.id],
});
# Upload a document
doc = sl.documents.upload(
    file="competitor-report.pdf",
    company_id=company["id"],
    title="Q1 Competitor Report"
)

# Then generate with document context
battlecard = sl.companies.battlecards(company["id"]).generate(
    competitor_id=competitors[0]["id"],
    enablement_focus="gtm_sales",
    document_ids=[doc["id"]]
)

Combined document text must not exceed 100,000 characters. Documents are automatically parsed, chunked, and embedded for RAG.

6

Generate a Landscape Analysis (optional)

Compare multiple competitors at once with a landscape battlecard. Requires 2 or more competitor IDs.

curl -X POST https://app.usesignallabs.com/api/v1/companies/{company_id}/battlecards/generate \
  -H "Authorization: Bearer sl_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"competitor_ids": ["competitor-id-1", "competitor-id-2"], "enablement_focus": "landscape"}'
const landscape = await sl.companies.battlecards(company.id).generate({
  competitor_ids: [competitors[0].id, competitors[1].id],
  enablement_focus: 'landscape',
});

console.log(landscape.overview);
landscape = sl.companies.battlecards(company["id"]).generate(
    competitor_ids=[competitors[0]["id"], competitors[1]["id"]],
    enablement_focus="landscape"
)

print(landscape["overview"])

What's Next?