GUIDES
Three things to get right before you ship.
Practical notes for integrating the Competitive Signals API: how keys behave, what the limiter does under load, and how to verify a webhook you did not expect. For every endpoint and field, read the API Reference.
Authentication
Create a key in the dashboard under Settings → API Keys. The raw key is shown once — copy it immediately; only its hash is stored. Send it as a Bearer token on every request.
A 401 means the key is missing, malformed, or revoked. The response never distinguishes which, to prevent key enumeration.
FIVE ACTIVE KEYS
A workspace may hold up to five at once, so rotation never needs downtime.
ROTATE FORWARD
Generate the new key, deploy it, then revoke the old one.
REVOCATION IS FINAL
Immediate and permanent. A revoked key keeps returning 401 forever.
Rate limits
The per-minute limit is enforced per key. Exceeding it returns 429 with a Retry-After header, in seconds until the window frees up. /v1/snapshot carries a separate hard cap of three accepted calls per rolling hour, because each one triggers a real collection run.
THE LIMITER FAILS CLOSED
If the rate-limit check itself errors, the request is rejected with 429 rather than passed through. Handle 429 as a retry, not as an outage.
Webhook signature verification
Verify each delivery against your subscription secret, shown once on creation. The body is canonical JSON with object keys sorted. HMAC the exact raw bytes you receive — do not re-serialize.
The timestamp defeats replay: an attacker who captures a valid signed payload cannot resubmit it later, because your receiver rejects deliveries outside a short freshness window — five minutes is a sensible default.