API Reference
Base URL https://api.dealintelligence.io/v1. All responses are JSON. Cursor-based pagination on every endpoint.
Authentication: Bearer token in the Authorization header. Test keys (di_test_*) and live keys (di_live_*) are separate. All timestamps are UTC ISO 8601. All list parameters are multi-value (OR'd within dimension, AND'd across dimensions).
Primary
/competitive_activity
Verified connection events across every account in your book. Each event arrives with a priority_score (0–100), a multi_competitor flag, and an inline headline_opportunity block when there's an open deal. Default sort is priority_score desc.
Every slice filter is multi-value. The two highest-leverage shortcuts are multi_competitor_only=true and has_open_opp_only=true.
GET /v1/competitive_activity
?timeframe=24h # 1h, 24h, 7d, 14d, 30d, 60d, 90d, 180d, 365d
&event_type=Churn+Risk&event_type=Renewal+Risk
&competitor=Reverb&competitor=Linkpoint
&industry=Fintech&industry=Insurance
®ion=EMEA
&employee_band=Mid-Market
&job_function=Sales
&seniority=C-Level&seniority=VP
&owner=Natalie+Smith
&in_crm_only=true
&min_priority_score=60
&multi_competitor_only=true
&has_open_opp_only=true
&dedupe_within_days=7
&view=raw
&limit=100
/account_activity
Everything about one account. Smart resolver: pass a name, domain, or Salesforce Account.Id — the detector picks the right strategy.
Returns: account block, headline_opportunity, summary, buying_committee, competitors, timeline, recommended_followups.
GET /v1/account_activity ?account=workday.com &window=90d &view=all &timeline_limit=50 &in_crm_only=true
/buyer_activity
Everything about one buyer across every employer. Splits events by employer (newest first). Ships pre-computed personal_signals: decision-maker likelihood, competitor breadth, sustained interest.
Identifiers: linkedin_url (most reliable) or name + optional company, title. Pass company whenever you have it.
GET /v1/buyer_activity ?name=Daniel+Vorderstrasse &company=SoundHound &title=Director+of+Sales &linkedin_url=https://linkedin.com/in/ACwAA... &window=180d &limit=100
/closed_lost_revival
Closed-lost accounts where competitors are back in the door. Account-rollup-first: one row per closed-lost account with revived activity. Each row carries a save_score (0–100) blending competitor breadth, seniority reached, recency, and multi-competitor buyers.
GET /v1/closed_lost_revival ?window=90d &owner=Natalie+Smith&owner=Jacob+Fleisher &min_save_score=60 &include_events=true &events_per_account=5 &limit=25
/churn_risk
Customer accounts where competitors are landing — renewal early-warning. Account-rollup-first with risk_score (0–100), inline renewal block, momentum block, and recommended_followups.
GET /v1/churn_risk ?window=7d &severity_min=low &min_risk_score=60 &owner=Sarah+Park &customers_only=true &include_renewal_only=false &include_events=true &events_per_account=5 &limit=25
Aggregations
Account-level rollups over the same event stream. "Where should I look first?"
/top_accounts
Rank accounts by competitive activity. Sort by reachout volume, competitor breadth, buyer count, recency, or seniority.
GET /v1/top_accounts ?window=30d &by=competitor_breadth &account_status=customer &in_crm_only=false &limit=25
/multi_competitor_accounts
Accounts approached by 2+ distinct competitors in the same window — the strongest signal in the product.
GET /v1/multi_competitor_accounts ?window=30d &min_competitors=2 &in_crm_only=false &limit=25
/competitor_summary
Footprint of one competitor across your book. Returns top accounts reached, plus aggregate counts.
GET /v1/competitor_summary ?competitor=Reverb &window=30d &in_crm_only=false &limit=25
/pipeline_at_risk
Open opportunities whose accounts have competitive reachouts. Per-account rows with headline opportunity and reachout summary. Sorted by reachout count, then amount.
GET /v1/pipeline_at_risk ?window=30d &stage_filter=Negotiation &min_amount=50000 &limit=25
/renewals_at_risk
Customers approaching renewal with recent competitive activity. Competitor activity often shows up weeks before formal renewal discussions begin.
GET /v1/renewals_at_risk ?days_to_renewal=90 &window=30d &limit=25
/discover
Tenant identity, filter vocabulary, and full tool catalog. Returns static enums (region, employee_band, job_function, seniority, account_status, alert_type) plus dynamic vocabulary discovered from recent events.
GET /v1/discover ?discovery_window=90d
Error codes
| Code | Meaning | What to do |
|---|---|---|
| 200 | OK | Process the payload. |
| 202 | Accepted | Account list ingesting. Wait 24h. |
| 400 | Bad request | Inspect error.field for the parameter. |
| 401 | Unauthorized | Rotate your API key. |
| 403 | Tier limit | Up-tier or wait for next billing cycle. |
| 404 | Not found | Entity isn't on your ingested list yet. |
| 429 | Rate limited | Backoff with Retry-After header. |
| 5xx | Server error | Automatic retry. Webhook delivery is idempotent. |
Rate limits
All endpoints share a single rate limit budget per API key: 600 req/min (10/sec) on Basic and Pro, 3,000 req/min on Custom. Webhook deliveries do not count against your budget.
Event schema
Every endpoint returns the same event shape. The full JSON schema is published at /schema/event.json with semver-stable releases. Breaking changes ship as new endpoint versions (/v2/...); existing versions supported for 24 months minimum after a successor ships.