Welcome to the CompetLab API documentation. This API provides programmatic access to your competitive intelligence data — technology stacks, content strategy, messaging & positioning, pricing plans, AI brand visibility across ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews, and — for Perplexity and Google AI Overviews — the pages they read when they answer your buyers' questions.
Who is this for?
- Developers building integrations with internal tools, CRMs, or BI platforms
- Agencies building whitelabel competitive dashboards for their clients
- AI agents and MCP servers consuming structured competitive data
- Automation platforms (Zapier, n8n) monitoring competitor changes
Authentication
All endpoints require a CL-API-Key header. Generate your API key in the CompetLab app under Your Organization → Settings → API Keys.
CL-API-Key: cl_live_a1b2c3d4e5f6...
Keys are organization-scoped — one key accesses all projects in your organization. Two permission scopes exist: read (current API) and read_write (future).
To manage your keys (create, revoke, set expiration): Your Organization → Settings → API Keys.
Response Format
Every response follows one of three shapes:
Single resource:
{ "item": { "id": "...", "name": "..." } }
Collection (with optional pagination):
{ "items": [...], "pagination": { "page": 1, "limit": 20, "total": 47, "totalPages": 3, "hasMore": true } }
Error:
{ "error": { "code": "project_not_found", "message": "Project not found", "status": 404 } }
Pagination uses ?page=1&limit=20 (1-indexed, default 20, max 100).
Error Codes
All errors return a machine-readable code field for programmatic handling:
| Code | Status | Description |
|---|---|---|
api_key_missing | 401 | No CL-API-Key header provided |
api_key_invalid | 401 | Key not found or malformed |
api_key_revoked | 401 | Key has been revoked |
api_key_expired | 401 | Key has expired |
insufficient_scope | 403 | Key doesn't have the required permission scope |
project_not_found | 404 | Project doesn't exist or doesn't belong to your organization |
no_data_available | 404 | No monitoring data available yet for this dimension |
not_found | 404 | Requested resource not found |
invalid_parameters | 400 | Invalid query parameters or request format |
rate_limit_exceeded | 429 | Rate limit exceeded for this API key |
internal_error | 500 | Unexpected server error — retry or contact support |
bad_gateway | 502 | Upstream service returned an invalid response — retry with backoff |
service_unavailable | 503 | Service temporarily unavailable — retry with backoff |
gateway_timeout | 504 | Upstream service timed out — retry with backoff |
Note on 5xx responses: The message field for 5xx errors is a static string ("Internal server error"). Branch on code for programmatic handling — do not pattern-match on message for 5xx.
Monitoring Dimensions
CompetLab monitors six dimensions of competitive intelligence:
| Dimension | Route | What it monitors |
|---|---|---|
| Tech & Trust Profile | /tech-trust | Technology stack, security headers, trust signals, DNS, robots.txt |
| Content Intelligence | /content | Sitemap structure, URL volume, content categories, URL changes |
| Positioning | /positioning | Homepage messaging, value propositions, CTAs, target audience |
| Pricing Intelligence | /pricing | Pricing plans, tiers, free trials, enterprise options, promotions |
| AI Visibility | /ai-visibility | Brand mentions across ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews — with the rankings the four chat models gave |
| AI Sources | /ai-sources | The pages Perplexity and Google AI Overviews read when they answer your buyers' questions, and whether you are on them — per engine, never pooled |
Each dimension has three endpoints: a dashboard (latest monitoring data), history (paginated past runs), and run detail (full data for a specific historical run).
Strategic Briefing
Beyond the raw per-dimension data, /strategic-briefing returns the latest synthesized competitive briefing — the as-of read of what changed, what it means, and what to do, with an executive hub, deep-dives, a competitor dossier, and a ranked action plan. It synthesizes a broader analytical set than the monitored dashboards it reads — all six above, plus eight it researches for the briefing alone: landscape, funding, hiring/GTM, product launches and more. It is lean by default (request only the sections you need — it defaults to the hub, which doubles as the navigation map) and always carries methodology coverage caveats. See the endpoint for the full sections list.
Quick Start
Step 1 — Get your API key from Your Organization → Settings → API Keys in the CompetLab app
Step 2 — List your projects:
curl -H "CL-API-Key: cl_live_your_key_here" https://api.competlab.com/v1/projects
Step 3 — Get the latest pricing intelligence:
curl -H "CL-API-Key: cl_live_your_key_here" https://api.competlab.com/v1/projects/{projectId}/pricing
Additional Resources
- OpenAPI JSON Spec — Machine-readable API definition for code generators and integrations
- API Key Management — Your Organization → Settings → API Keys in the CompetLab app
Rate Limits
Rate limiting is not enforced in v1. We recommend keeping requests under 60 per minute as a best practice. Rate limits will be introduced in a future version with proper 429 responses and Retry-After headers.
Authentication: send your CompetLab API key as the CL-API-Key header (keys start with cl_live_, issued at app.competlab.com → Organization Settings → API Keys). The competitive-intelligence data is read-only in v1; the on-demand site-audit tools use POST to start a scan.
Endpoints
Every endpoint the live contract declares (39 in total). Parameters and response shapes for each are in the interactive explorer below, and in the machine-readable spec.
| Method | Endpoint | What it does |
|---|---|---|
GET | /v1/health | Check API health |
GET | /v1/projects | List all projects |
GET | /v1/projects/{projectId} | Get project details |
GET | /v1/projects/{projectId}/competitors | List project competitors |
GET | /v1/projects/{projectId}/competitors/{competitorId} | Get competitor details |
GET | /v1/projects/{projectId}/tech-trust | Get latest tech & trust data |
GET | /v1/projects/{projectId}/tech-trust/history | Get tech & trust run history |
GET | /v1/projects/{projectId}/tech-trust/history/{runId} | Get tech & trust data for a specific run |
GET | /v1/projects/{projectId}/content | Get latest content intelligence data |
GET | /v1/projects/{projectId}/content/history | Get content intelligence run history |
GET | /v1/projects/{projectId}/content/history/{runId} | Get content intelligence data for a specific run |
GET | /v1/projects/{projectId}/content/changelog | Get content changelog |
GET | /v1/projects/{projectId}/positioning | Get latest positioning data |
GET | /v1/projects/{projectId}/positioning/history | Get positioning run history |
GET | /v1/projects/{projectId}/positioning/history/{runId} | Get positioning data for a specific run |
GET | /v1/projects/{projectId}/pricing | Get latest pricing intelligence data |
GET | /v1/projects/{projectId}/pricing/history | Get pricing run history |
GET | /v1/projects/{projectId}/pricing/history/{runId} | Get pricing data for a specific run |
GET | /v1/projects/{projectId}/ai-visibility | Get latest AI visibility data |
GET | /v1/projects/{projectId}/ai-visibility/history | Get AI visibility check history |
GET | /v1/projects/{projectId}/ai-visibility/history/{checkId} | Get AI visibility data for a specific check |
GET | /v1/projects/{projectId}/ai-visibility/trend | Get how the market the AI models draw has moved |
GET | /v1/projects/{projectId}/ai-sources | Get latest AI sources data |
GET | /v1/projects/{projectId}/ai-sources/history | Get AI sources check history |
GET | /v1/projects/{projectId}/ai-sources/history/{checkId} | Get AI sources data for a specific check |
GET | /v1/projects/{projectId}/alerts | List project alerts |
GET | /v1/projects/{projectId}/schedules | List monitoring schedules |
GET | /v1/projects/{projectId}/strategic-briefing | Get the current state of this project's strategic briefing |
GET | /v1/projects/{projectId}/strategic-briefing/history | List this project's briefing editions |
GET | /v1/projects/{projectId}/strategic-briefing/history/{runId} | Get one briefing edition by id |
POST | /v1/tools/tech-stack/scans | Start an async tech-stack scan |
GET | /v1/tools/tech-stack/scans/{scanId} | Get an async tech-stack scan by ID |
POST | /v1/tools/trust-signals/scans | Start an async trust-signals scan |
GET | /v1/tools/trust-signals/scans/{scanId} | Get an async trust-signals scan by ID |
POST | /v1/tools/ai-crawler-checker | Check AI crawler accessibility for a domain |
POST | /v1/tools/sitemap-visualizer | Analyze sitemap structure of a domain |
POST | /v1/tools/agent-adoption/scans | Start an async agent-adoption scan |
GET | /v1/tools/agent-adoption/scans/{scanId} | Get an async agent-adoption scan by ID |
POST | /v1/tools/fetch-url | Fetch URL body and headers with JS-rendering + bot-protection handling |
Errors
Errors return a JSON body describing the failure (an error object with a message and HTTP status). Standard HTTP status codes apply: 400 (invalid parameters), 401 (missing/invalid API key), 404 (not found), 429 (rate limited).