Developer Docs v2

API Reference

Full programmatic access to email intelligence, funnel tracking, DNS probing, variant detection, and ESP profiling. API access is restricted to Agency plan subscribers.

🔐 Agency-Only API Access

API key creation and programmatic access to all endpoints marked Agency require an active Agency plan. Starter, Growth, Pro, and Business plans use the dashboard only. Contact us to upgrade at any time.

Authentication

All API requests require a JWT in the Authorization header for dashboard-based calls, or an API secret key in X-API-Key for programmatic access.

Dashboard (JWT)

curl /intelligence/alerts \
  -H "Authorization: Bearer eyJhbGc…"

Programmatic (API Key)

curl /competitors \
  -H "X-API-Key: sk_live_…"

Base URL

https://app.competitorinbox.com

All endpoints are relative to this base. No /api/v1/ prefix — paths are rooted directly (e.g. /competitors, /intelligence/alerts).

Rate Limits

PlanReq / minReq / dayAPI Keys
Starter / GrowthNone
Pro6010,000None
Business300100,000None
AgencyUnlimitedUnlimitedUp to 10

Evidence Classification

Every AI-generated claim in intelligence responses is labeled with one of three evidence tiers:

[FACT]

Directly observed from email headers, DNS records, or HTML content. Zero inference.

[INFERENCE]

Logically deduced from multiple corroborating data points. High probability.

[HYPOTHESIS]

Plausible interpretation not directly evidenced. Should be investigated further.

DNS probe responses are always tagged [FACT] — no AI is involved. Fabricated open rates, click rates, or revenue figures are never returned.

Authentication

Register, log in, and manage passwords. JWT tokens are returned on login and must be passed as a Bearer token.

POST/auth/register

Create a new workspace account.

Parameters

NameInTypeRequiredDescription
emailbodystringrequiredAccount email address
passwordbodystringrequiredMin 8 characters
workspaceNamebodystringrequiredWorkspace display name

cURL Example

curl -X POST /auth/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@agency.com","password":"s3cr3t!","workspaceName":"My Agency"}'
POST/auth/login

Log in and receive a signed JWT.

Parameters

NameInTypeRequiredDescription
emailbodystringrequiredAccount email
passwordbodystringrequiredAccount password

cURL Example

curl -X POST /auth/login \
  -d '{"email":"you@agency.com","password":"s3cr3t!"}'

Response

Returns { token, userId, email, workspaceId, workspaceName, plan, role }
POST/auth/forgot-password

Request a password-reset email.

Parameters

NameInTypeRequiredDescription
emailbodystringrequiredRegistered email
POST/auth/reset-password

Set a new password using a reset token.

Parameters

NameInTypeRequiredDescription
tokenbodystringrequiredToken from reset email
newPasswordbodystringrequiredNew password
POST/auth/verify-email

Confirm email address using the verification link token.

Parameters

NameInTypeRequiredDescription
tokenbodystringrequiredToken from verification email

API Keys

Programmatic API access is available to Agency plan subscribers only. Each workspace can hold up to 10 active API key pairs. Pass your secret key as X-API-Key header.

GET/api-keysAgency

List all active API keys for the authenticated workspace.

Response

Returns array of { id, name, publicKey (pk_live_…), lastUsedAt, createdAt }. Secret key is only shown once on creation.
POST/api-keysAgency

Create a new API key pair.

Parameters

NameInTypeRequiredDescription
namebodystringrequiredFriendly key name, e.g. "Production"

Response

Returns { publicKey: "pk_live_…", secretKey: "sk_live_…" }. Store the secret key — it cannot be retrieved again.
DELETE/api-keys/{id}Agency

Revoke and permanently delete an API key.

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)requiredAPI key ID

Competitors

Manage the list of competitor brands being monitored. Each competitor gets a unique inbound email address (e.g. brand123@in.competitorinbox.com) to subscribe to their lists.

GET/competitors

List all tracked competitors for the workspace.

Response

Returns { competitors: Competitor[], total }
GET/competitors/{id}

Get a single competitor with metadata and email count.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
POST/competitors

Add a new competitor to track.

Parameters

NameInTypeRequiredDescription
namebodystringrequiredBrand name
websiteUrlbodystringoptionalCompetitor website URL
brandTagsbodystring[]optionalCustom classification tags
PUT/competitors/{id}

Update competitor metadata.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
namebodystringoptionalUpdated name
isActivebodybooleanoptionalEnable/disable tracking
DELETE/competitors/{id}

Remove a competitor and all associated emails and intelligence.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
GET/competitors/{id}/campaigns

List UTM-attributed campaign clusters detected for a competitor.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Email Messages

Access captured emails, re-trigger analysis, and retrieve raw content. Emails are captured via the unique inbound address assigned to each competitor.

GET/emails

Paginated email list with filtering support.

Parameters

NameInTypeRequiredDescription
competitorIdqueryuuidoptionalFilter by competitor
pagequeryintoptionalPage number (default 1)
pageSizequeryintoptionalItems per page (default 50, max 200)
sortByquerystringoptionalField to sort by: receivedAt | subject
dateFromqueryISO dateoptionalFilter: start date
dateToqueryISO dateoptionalFilter: end date

cURL Example

curl /emails?competitorId=uuid&page=1&pageSize=50&dateFrom=2025-01-01 \
  -H "Authorization: Bearer {token}"

Response

Returns { emails: EmailMessage[], total, page, pageSize }
GET/emails/{id}

Get full email with HTML content, insight block, links, and AI analysis.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID
POST/emails/{id}/analyze

Force re-analysis of a stored email (re-runs AI enrichment and ESP fingerprinting).

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID
GET/emails/{id}/headers

Return parsed authentication headers: SPF, DKIM, DMARC results from the received email.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID

Response

Returns { spfStatus, dkimStatus, dmarcStatus, receivedHeaders[], listId }
GET/emails/{id}/screenshot

Return the stored screenshot URL for an email (if rendered).

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID

Analytics

Aggregate send-frequency data, CTAs, heatmaps, and per-competitor performance reports.

GET/analytics/overview

Workspace-wide summary: total emails, unique competitors, CTA rate, top sender.

Parameters

NameInTypeRequiredDescription
competitorIdqueryuuidoptionalScope to competitor
dateFromqueryISO dateoptionalStart date
dateToqueryISO dateoptionalEnd date
GET/analytics/heatmap

Send-time heatmap (day × hour × count) for all tracked emails.

Parameters

NameInTypeRequiredDescription
dateFromqueryISO dateoptionalStart date
dateToqueryISO dateoptionalEnd date

Response

Returns { heatmapData: [{ dayOfWeek, hour, count }] }
GET/analytics/cta-domains

Top CTA link domains with click counts across all captured emails.

Parameters

NameInTypeRequiredDescription
limitqueryintoptionalMax results (default 20)
GET/analytics/competitor/{id}/report

Full per-competitor performance report: volume, send timing, word counts, link stats, UTM usage.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
dateFromqueryISO dateoptionalStart date
dateToqueryISO dateoptionalEnd date

Brand Intelligence

AI-powered competitive intelligence: brand summaries, subject line grading, campaign pattern detection, and workspace-wide alerts. All AI claims are labeled [FACT], [INFERENCE], or [HYPOTHESIS].

GET/intelligence/competitor/{id}/summary

Full brand intelligence summary: strategy, promo cadence, subject patterns, and recommendations. AI narrative is returned with evidence tags.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Response

Returns BrandIntelligenceSummary { narrativeSummary (tagged), frequencyTrend, discountPattern, subjectPattern, keyInsights[], actionableRecommendations[] }
GET/intelligence/competitor/{id}/subject-scores

Score recent subject lines for urgency, emotion, clarity, and length. Returns AI verdict per subject.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
maxqueryintoptionalMax subjects to score (5–100, default 50)
GET/intelligence/alerts

Workspace-wide competitive alerts: frequency spikes, promotional surges, deep discounts, new campaign detection.

Response

Returns { alerts: AlertItem[] } sorted by severity (high → low)
GET/intelligence/competitor/{id}/patterns

Detect campaign sequences, promotional calendar, and send cadence patterns.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Sender Intelligence

Build persistent ESP and infrastructure profiles for competitor sending domains. Aggregates email header signals, DNS facts, company size estimates, and benchmark comparisons. Three intelligence tiers: email-only → raw headers → sample set (more = higher confidence).

GET/intelligence/competitor/{id}/sender-profileCached 24h

Return the cached sender profile (or build one if none exists). Includes ESP detection, auth signals, company size estimate, industry benchmarks, and DNS facts.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Response

Returns SenderDomainProfile { espDetected, espConfidence, spfPass, dkimPass, dmarcPass, spfRecord, dmarcRecord, dkimSelectorsJson, dnsEvidenceJson, industry, businessModel, companySize, estimatedRevenueLabel, senderIntelligenceScore, narrativeSummary, authRiskScore }
POST/intelligence/competitor/{id}/sender-profile/refresh

Force a full re-analysis of the sender profile, ignoring cache. Re-runs ESP detection, DNS probe, and benchmark calculations.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
GET/intelligence/sender-profiles

List all sender profiles visible to the workspace (Agency = workspace-scoped, superadmin = all).

GET/intelligence/dns-probeFACT only

Live DNS probe for any domain. Returns SPF, DMARC, DKIM, MX, and BIMI records with an authentication risk scorecard. All results are tagged [FACT] — no AI inference.

Parameters

NameInTypeRequiredDescription
domainquerystringrequiredDomain to probe, e.g. klaviyo.com
selectorsquerystringoptionalComma-separated DKIM selectors to try (defaults to 30+ common patterns)

cURL Example

curl "/intelligence/dns-probe?domain=klaviyo.com" \
  -H "Authorization: Bearer {token}"

Response

Returns {
  spf: { found, record, policy, hard_fail, soft_fail, includes[], ips[] },
  dmarc: { found, record, policy, spf_alignment, dkim_alignment, rua, pct },
  dkim: { selectors_found[], records[{ selector, key_type, key_bits }] },
  mx: { records[], mailbox_provider },
  bimi: { found, record },
  auth_risk: { score, level, factors[] },
  evidence_tag: "FACT — live DNS"
}
POST/intelligence/competitor/{id}/dns-probeFACT only

Run a DNS probe for a competitor's sender domain and return a structured evidence object.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Funnel Intelligence

Discover lead capture forms, track email nurture funnels, attribute emails to opt-in sources, and run AI flow analysis. Sessions track real subscriber journeys through competitor funnels.

POST/funnel/competitors/{id}/scan

Crawl all discover-able pages on the competitor site to detect opt-in forms, popup triggers, and ESP provider scripts.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Response

Returns { assetsFound, assetsNew, duration_ms }
GET/funnel/competitors/{id}/assets

List all detected lead assets (forms, popups, exit-intent triggers) for a competitor.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Response

Each asset: { id, url, leadMagnetType, triggerType, provider, isActive, copyPreview, lastSeenAt }
GET/funnel/assets/{id}

Get a single lead asset with full HTML snippet and provider detection evidence.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredAsset ID
POST/funnel/assets/{id}/refresh

Re-crawl a specific page to check for copy changes or new form structure.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredAsset ID

Response

Returns { copyChanged: bool, changesDetected: string[] }
PATCH/funnel/assets/{id}

Update asset state: mark as ignored or re-enable tracking.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredAsset ID
isIgnoredbodybooleanoptionalHide from funnel feed
isActivebodybooleanoptionalMark as active/inactive
POST/funnel/assets/{id}/subscribe

Start a funnel session by subscribing to the opt-in form attached to this asset.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredAsset ID
emailToUsebodystringoptionalOverride inbox email to subscribe with

Response

Creates a FunnelSession record and returns { sessionId, assetId, startedAt }
GET/funnel/competitors/{id}/sessions

List all funnel sessions for a competitor with attribution and flow analysis data.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
GET/funnel/sessions/{id}

Get a single session including all attributed emails in sequence order.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredSession ID
POST/funnel/sessions/{id}/attribute

Re-run email attribution for a session. Uses time-proximity decay + header signals to attribute received emails.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredSession ID

Response

Returns { emailsAttributed, avgConfidence }
POST/funnel/sessions/{id}/analyse

Run AI flow analysis on an attributed session. Classifies flow type, detects urgency escalation, discount evolution, and dynamic content patterns.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredSession ID

Response

Returns { flowType, flowLabel, urgencyEscalation, dynamicContent, discountEvolution, aiUsed }
GET/funnel/competitors/{id}/timeline

Intelligence timeline: events log for copy changes, new assets, urgency escalations, and flow changes.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID
limitqueryintoptionalMax events (default 50)
POST/funnel/timeline/{id}/read

Mark an intelligence timeline event as read.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredTimeline event ID
GET/funnel/competitors/{id}/comparison

Cross-funnel comparison: compares all sessions for a competitor by email volume, urgency, attribution, and flow type.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Email Client Risk

Analyse HTML rendering compatibility across 10+ email clients (Gmail, Outlook 2016–2021, Apple Mail, Samsung, etc.). Returns per-client issues and a risk score.

GET/emails/{id}/client-risk

Return stored client risk analysis for an email.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID

Response

Returns { overallRisk, clients: [{ client, severity, issues[] }] }
POST/emails/{id}/client-risk/analyze

Force re-analysis of client compatibility for a stored email.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredEmail ID
POST/emails/client-risk/previewAgency

Analyse raw HTML without saving. Pass HTML + subject, get back a risk report immediately.

Parameters

NameInTypeRequiredDescription
htmlContentbodystringrequiredRaw HTML email content
subjectbodystringoptionalSubject line for analysis context

Variant Detection

Cluster detected A/B subject line and content variants. Uses semantic similarity + UTM signals to group emails into campaign sequences.

GET/competitors/{id}/campaigns

All detected A/B variant clusters for a competitor.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Response

Returns Campaign[] { utmCampaign, emailCount, linkCount, firstSeenAt, lastSeenAt, recentEmails[] }
POST/competitors/{id}/cluster-variantsAgency

Re-run the variant clustering algorithm for a competitor.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredCompetitor ID

Embeddable Widgets

White-label intelligence widgets that can be embedded in client dashboards. Each widget is scoped to a competitor and can display metrics, send timings, or subject grade summaries.

GET/widgetsAgency

List all widgets configured for this workspace.

POST/widgetsAgency

Create a new embeddable widget.

Parameters

NameInTypeRequiredDescription
slugbodystringrequiredURL-safe identifier
competitorIdbodyuuidoptionalScope widget to a competitor
allowedDomainsbodystring[]optionalDomains allowed to embed this widget
DELETE/widgets/{id}Agency

Delete a widget configuration.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredWidget ID

Billing

Manage subscriptions via Stripe. Use these endpoints to initiate checkout sessions and access the customer portal.

POST/billing/checkout

Create a Stripe Checkout session for plan upgrade.

Response

Returns { url } — redirect user to this URL to complete payment.
POST/billing/portal

Create a Stripe Customer Portal session for subscription management.

Response

Returns { url } — redirect user to manage their plan.

Notifications

In-app notification feed for intelligence alerts, new email detection, and system events.

GET/notifications

List recent notifications for the authenticated user.

Parameters

NameInTypeRequiredDescription
unreadOnlyquerybooleanoptionalFilter to unread only
POST/notifications/{id}/read

Mark a notification as read.

Parameters

NameInTypeRequiredDescription
idpathuuidrequiredNotification ID
POST/notifications/read-all

Mark all notifications as read.

Webhooks

Inbound webhook endpoints used by Mailgun to deliver captured emails. These are infrastructure endpoints — not intended for direct API use.

POST/webhooks/mailgun

Mailgun MIME message delivery endpoint. Processes inbound emails, runs ESP fingerprinting, AI enrichment, and stores to database.

Parameters

NameInTypeRequiredDescription
X-Mailgun-SignaturebodystringrequiredMailgun HMAC signature (auto-verified)

Response

Internal use only — must be configured in Mailgun Routes.

Blog (Public)

Public blog endpoints. No authentication required.

GET/blog/posts

List published blog posts.

Parameters

NameInTypeRequiredDescription
pagequeryintoptionalPage number
pageSizequeryintoptionalItems per page
tagquerystringoptionalFilter by tag
GET/blog/posts/{slug}

Get a single blog post by slug.

Parameters

NameInTypeRequiredDescription
slugpathstringrequiredURL slug

Quick Start

Node.js / TypeScript

const res = await fetch(
  'https://app.competitorinbox.com/competitors',
  { headers: { 'X-API-Key': process.env.CI_SECRET_KEY } }
)
const { competitors } = await res.json()

Python

import httpx, os
r = httpx.get(
  "https://app.competitorinbox.com/intelligence/dns-probe",
  params={"domain": "klaviyo.com"},
  headers={"X-API-Key": os.environ["CI_SECRET_KEY"]}
)
print(r.json()["spf"]["record"])

PHP

$ch = curl_init('https://app.competitorinbox.com/competitors');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'X-API-Key: ' . getenv('CI_SECRET_KEY'),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);

cURL — DNS Probe

curl "https://app.competitorinbox.com/intelligence/dns-probe?domain=klaviyo.com" \
  -H "X-API-Key: sk_live_your_key" \
  | jq '.auth_risk'