API v1

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

GET /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
GET /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
GET /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
GET /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
GET /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?"

GET /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
GET /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
GET /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
GET /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
GET /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
GET /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

CodeMeaningWhat to do
200OKProcess the payload.
202AcceptedAccount list ingesting. Wait 24h.
400Bad requestInspect error.field for the parameter.
401UnauthorizedRotate your API key.
403Tier limitUp-tier or wait for next billing cycle.
404Not foundEntity isn't on your ingested list yet.
429Rate limitedBackoff with Retry-After header.
5xxServer errorAutomatic 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.