Quickstart
Three steps to your first activity response:
- 01 Get an API key from your account page (or by replying to the welcome email).
- 02 Connect your CRM (Salesforce or HubSpot) so we can sync your account list, and send us your competitor list.
- 03 Call
/competitive_activityin claude (MCP). On the next business day after your list ingests.
# Your first call — last 24h of competitive activity curl -X GET https://api.dealintelligence.io/v1/competitive_activity \ -H "Authorization: Bearer $DI_API_KEY" \ -G --data-urlencode "timeframe=24h" # Response: 200 OK { "events": [ { "event_id": "evt_8H3K9PqR2nL", "event_type": "open_opportunity", "timestamp": "2026-05-19T14:22:08Z", "confidence": 0.99, "buyer": { "name": "M. Eisenberg", "company": "Workday", ... }, "competitor": { "company": "Acme", "seller": {...} } }, ... ], "count": 7, "next_cursor": "cur_aB42xZ..." }
Authentication
All requests authenticate via a Bearer token in the Authorization header. API keys are issued on signup and rotate-able from your account page. Test keys (di_test_*) and live keys (di_live_*) are separate; test keys hit a deterministic activity fixture so your CI doesn't flap.
The remote Claude connector (Option A below) uses OAuth 2.1 sign-in instead of an API key — you authorize access from your browser and nothing is stored in the client. API keys apply to the REST API, Clay, webhooks, and the self-hosted MCP server.
Authorization: Bearer di_live_xxxxxxxxxxxx
# Test mode — deterministic fixtures, no rate limit, no billing
Authorization: Bearer di_test_xxxxxxxxxxxx
Your first activity
Once your account list is ingested (typically within 24 hours of upload), activities refresh on a daily cadence — new observations land each morning UTC. You can also pull historical activities from the prior 90 days via any endpoint. Most customers start with a 30-day pilot, then wire the daily refresh into Clay or Claude.
Claude (MCP)
Every endpoint becomes a tool call your agent can use to query activities, slice by competitor / industry / owner, build account-level rollups, or join against CRM pipeline state. Connect one of two ways, depending on whether you use Claude in the browser or Claude Code in your terminal.
Claude connector
A hosted, read-only Claude MCP server with one-click OAuth. No API key to manage, and you always run the latest version.
- 01 In Claude, open Settings → Connectors → Add custom connector. (One-click discovery in the Claude connector directory is coming soon.)
- 02 Paste the server URL below and click Connect.
- 03 Sign in with your Deal Intelligence account and approve read-only access. Claude now has the full tool surface.
# Remote MCP server — OAuth 2.1, no API key
https://api.dealintelligence.io/mcp
You authorize access from your browser and approve the read:competitive_activity scope; no key is stored in Claude. Access requires an active Deal Intelligence plan, and every tool is read-only — the connector never writes to your CRM.
Claude Code
For Claude Code and local setups, point at the same hosted server over HTTP and authenticate with an API key (generate one in Settings → API keys) instead of the browser OAuth flow:
// ~/.claude/mcp.json — remote MCP server over HTTP, API-key auth { "mcpServers": { "deal_intelligence": { "type": "http", "url": "https://api.dealintelligence.io/mcp", "headers": { "Authorization": "Bearer di_live_xxxxxxxxxxxx" } } } }
Restart Claude. The agent gets the full tool surface — 11 read-only tools: five primary activity-stream tools plus aggregation, slice, CRM-cross, and discovery helpers. Have your agent call discover() first; it returns your tenant's filter vocabulary so the model can suggest realistic competitor / industry / owner values without guessing.
// Primary — verified activity streams deal_intelligence.competitive_activity({ timeframe, event_type, competitor, industry, region, employee_band, job_function, seniority, owner, ... }) deal_intelligence.closed_lost_revival({ window }) deal_intelligence.churn_risk({ window }) deal_intelligence.account_activity({ account, window }) deal_intelligence.buyer_activity({ name, company, title, window }) // Aggregations — "where should I look first?" deal_intelligence.top_accounts({ window, by, account_status, limit }) deal_intelligence.multi_competitor_accounts({ window, min_competitors }) // Slice — scope to one competitor deal_intelligence.competitor_summary({ competitor, window }) // CRM-cross — activities joined with pipeline state deal_intelligence.pipeline_at_risk({ window, stage_filter, min_amount }) deal_intelligence.renewals_at_risk({ days_to_renewal, window }) // Discovery — call this first deal_intelligence.discover({ discovery_window })
Example agent prompt
❯ Find every customer account in EMEA approaching renewal in the next
60 days that's getting hit by Reverb. For each, draft a save-play
note for the CSM that includes the buyer name, the renewal amount,
and the last three Slack threads in #cs-saves about that account.
→ deal_intelligence.discover()
→ deal_intelligence.renewals_at_risk({ days_to_renewal: 60, window: "30d" })
→ deal_intelligence.competitor_summary({ competitor: "Reverb", window: "30d" })
→ slack.search_threads({ channel: "#cs-saves", accounts: [...] })
Found 4 renewals at risk in EMEA touched by Reverb. Drafting save notes...
CRM sync
Salesforce and HubSpot, supported natively. New competitive activity writes to the matching Account, Contact, and Lead records as custom fields — trigger-ready signals your CRM workflows (and any tool that reads your CRM, like Clay) can act on directly.
# Salesforce custom fields (HubSpot uses the equivalent properties) di_competitors__c # semicolon-joined competitor list di_latest_competitor__c # most recent competitor di_activity_types__c # semicolon-joined activity types di_latest_activity_type__c # most recent activity type di_latest_activity_date__c # most recent activity date
Slack
Connect the Deal Intelligence Slack app and each qualified competitive activity is posted to your channel as a card: the buyer (name, title, company), the competitor they engaged, and links to the buyer's and the company's social. When your CRM is connected, the card also shows the matched account's status, owner, and any active open opportunity — and tags the owner — so reps can act without leaving Slack.
Slack delivery is enabled per account: select your channel in Deal Intelligence settings.
# Example card posted to your channel
Leonardo Do Carmo — Regional Sales Director at Sumo Logic recently engaged with your competitor.
Account: Sumo Logic
Alert Type: New Business
Account Details: Redwood City, California, US
837 employees · Software Development
Email: ldocarmo@sumologic.com
Account SDR: @Shoshi
Competitor: Gong
Account Status: Lead
Account Owner: Jake Albro
Contact Location: Loughton, England, United Kingdom
Company Tier: Tier 3
Tenure in Role: 3 months
[ View in CRM ]
Clay
Deal Intelligence flows into Clay through infrastructure you already run — your CRM or a webhook. Signals land in your Clay tables two ways:
Via your CRM (recommended — no extra setup)
CRM sync writes competitive-signal fields (di_latest_competitor__c, di_competitors__c, and more) onto your Salesforce or HubSpot records. Clay reads those objects natively, so the signals appear as columns in any Clay table sourced from your CRM — no extra setup on our side, and no separate key to manage.
Via webhook (event-driven)
Create a Clay table with a Webhook source, copy the per-table URL Clay generates, and add it as a webhook destination in your Deal Intelligence settings. Each new competitive activity posts a row into the table, where your downstream Clay steps — territory routing, owner assignment, sequence enrollment — run automatically.
Webhooks
Activities deliver to any HTTPS endpoint within minutes of observation. Each webhook delivery is signed with HMAC-SHA256. Verify the signature before acting on the payload.
// Configure a webhook in your account settings POST https://api.dealintelligence.io/v1/webhooks { "url": "https://your-app.com/webhooks/di", "events": ["competitive_activity", "churn_risk"], "filter": { "confidence_min": 0.97 } } // Delivery includes a signature header X-DI-Signature: t=1716156128,v1=5257a869e7ecebeda32affa62cdca3fa... X-DI-Event-Id: evt_8H3K9PqR2nL X-DI-Delivery: d_29a8b3... // Verify with HMAC-SHA256 over the raw body const sig = req.headers['x-di-signature']; const computed = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(rawBody) .digest('hex'); if (computed !== sig.split('v1=')[1]) throw new Error('invalid');
Retries: failed deliveries (non-2xx response) retry with exponential backoff for 24 hours. After 24 hours the event is moved to a dead-letter queue, queryable via /webhooks/dead_letter. Replay any event via /webhooks/replay/{event_id}.
Troubleshooting
Most issues fall into one of the cases below. If you're still stuck, email support@dealintelligence.io.
Connecting in Claude
- Connector won't add / "couldn't connect." Confirm the MCP URL is exactly
https://api.dealintelligence.io/mcp(https, no trailing space). Claude discovers the OAuth server automatically via/.well-known/oauth-protected-resource— verify that returns JSON:curl -s https://api.dealintelligence.io/.well-known/oauth-protected-resource. - Sign-in succeeds but tools return nothing. Your account must be provisioned for the connector (paid plan). The first call returns a "your account isn't activated" message until
mcp_entitledis set — contact sales@dealintelligence.io. - 401 / "unauthorized" on tool calls. The OAuth token expired or the connector lost its grant. Remove and re-add the connector in Settings → Connectors to re-run the sign-in.
Empty or partial results
- A tool returns no rows. Your filter is likely too narrow. Widen the window (
30d→90d), or calldiscoverfirst to see the competitor, industry, and owner values that actually exist in your tenant — pass those exact strings. - Accounts show but owner / stage / amount are blank. Those fields come from your connected CRM. Confirm Salesforce or HubSpot is connected in settings; CRM-cross tools (
pipeline_at_risk,renewals_at_risk) need it. - A CRM-enriched call is slow or drops CRM fields. The CRM phase is capped at 25s; if your Salesforce is slow the tool returns the event data without enrichment rather than failing. Retry, or scope to a single account with
account_activity.
Claude Code / local setups
- Prefer an API key over browser OAuth. Generate one in Settings → API keys and pass it as a Bearer token (see Claude (MCP)).
- Calls 401 after a redirect. Point the client at the path with the trailing slash (
/mcp/) to avoid a redirect that can drop theAuthorizationheader.