API Overview

The Discoperi M&A Intelligence API gives you programmatic access to the full verified deal database, sector analytics, advisor league tables, and real-time deal webhooks. All responses are JSON.

πŸ”’
The REST API is available on Corporate plan subscriptions. Team subscribers get CSV/JSON file export. See all plans β†’

The API is built around standard REST conventions. All timestamps are ISO 8601 UTC. All monetary values are in USD millions unless otherwise stated.

Authentication

Authenticate all requests using your API key in the Authorization header as a Bearer token. Find your API key in your account dashboard under Settings β†’ API.

HTTP header
# Include on every request
Authorization: Bearer dsc_live_xxxxxxxxxxxxxxxxxxxxxxxx
cURL
curl -X GET "https://api.discoperi.com/v1/deals" \
  -H "Authorization: Bearer dsc_live_xxxxxxxx" \
  -H "Content-Type: application/json"
⚠️
Never expose your API key in client-side code. Always make API calls server-side or via a backend proxy. Rotate compromised keys immediately in your account settings.

API key prefixes

dsc_live_ β€” production key, calls against live data
dsc_test_ β€” test key, returns sample/fixture data, never billed

Base URL

Base URL
https://api.discoperi.com/v1

All endpoints are prefixed with /v1/. We version the API to allow non-breaking changes. When a breaking change is necessary, we release a new version and maintain the previous version for at least 12 months.

Rate limits

PlanRequests/minuteRequests/dayWebhook concurrency
Corporate12050,0005 webhooks
Team (export only)N/AN/AN/A

Rate limit headers are returned on every response:

Response headers
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 114
X-RateLimit-Reset: 1711123200

If you exceed the rate limit, you receive a 429 Too Many Requests response. Use exponential backoff with an initial delay of 1 second.

Errors

The API returns standard HTTP status codes and a consistent error envelope:

Error response
{
  "error": {
    "code":    "invalid_filter",
    "message": "Unknown sector value: 'fintech'. Valid values: Technology, Healthcare…",
    "status":  400
  }
}
StatusCodeMeaning
400invalid_filterA query parameter has an invalid value
401unauthorizedMissing or invalid API key
403plan_requiredThis endpoint requires Corporate plan
404not_foundDeal or resource not found
429rate_limitedToo many requests β€” use X-RateLimit-Reset
500server_errorInternal error β€” contact [email protected]

Endpoints

GET /deals List verified deals with filtering, sorting, pagination Corporate +

Query parameters

ParameterTypeRequiredDescription
sectorstringoptionalFilter by sector. One of: Technology, Healthcare, Financial Services, Industrials, Energy, Consumer, Real Estate, Media, Other
typestringoptionalDeal type: Acquisition, Merger, Buyout, LBO, Carve-out, Spin-off, Tender Offer
min_valuenumberoptionalMinimum deal value in USD millions
max_valuenumberoptionalMaximum deal value in USD millions
from_datestringoptionalISO 8601 date β€” earliest close date (e.g. 2026-01-01)
to_datestringoptionalISO 8601 date β€” latest close date
acquirer_countrystringoptionalISO 3166-1 alpha-2 country code (e.g. US, DE, GB)
min_sourcesintegeroptionalMinimum source count (1–6). Default: 1
sortstringoptionalSort field: close_date (default), value, sources
orderstringoptionalasc or desc (default: desc)
limitintegeroptionalResults per page: 1–100 (default: 20)
cursorstringoptionalPagination cursor from previous response
Example request
curl -X GET "https://api.discoperi.com/v1/deals?sector=Healthcare&min_value=500&limit=10" \
  -H "Authorization: Bearer dsc_live_xxxxxxxx"
Response
{
  "data": [
    {
      "id":               "deal_abc123",
      "acquirer":         "Siemens AG",
      "acquirer_country": "DE",
      "target":           "Varian Medical Systems",
      "target_country":   "US",
      "sector":           "Healthcare",
      "deal_type":        "Acquisition",
      "value_usd_m":      2100,
      "close_date":       "2026-03-14",
      "advisors_buy":     ["Goldman Sachs"],
      "advisors_sell":    ["JPMorgan"],
      "source_count":     3,
      "quality_score":    0.923,
      "verified":         true
    }
  ],
  "meta": {
    "total":       847,
    "cursor":      "eyJpZCI6ImRlYWxfYWJjMTIzIn0",
    "has_more":    true
  }
}
GET /deals/{id} Get full deal record by ID (all 39 fields) Corporate +
Example
curl https://api.discoperi.com/v1/deals/deal_abc123 \
  -H "Authorization: Bearer dsc_live_xxxxxxxx"

Returns the complete deal record including all 39 structured fields, all source URLs, rationale, key terms, and the full quality score breakdown.

GET /sectors Sector summary statistics Corporate +

Returns deal count, total value, average deal size, and YoY change for each sector. Optional ?period=ytd|1y|3y|all parameter.

GET /advisors Advisor league table data Corporate +

Returns ranked advisor data. Filter by ?role=buy|sell|legal, ?sector=Healthcare, or date range. Returns deal count, total value advised, market share, and top sectors.

POST /webhooks Create a deal alert webhook Corporate +

Webhooks fire within minutes of a new matching deal being published. Each webhook POST contains the full deal object.

Create webhook
curl -X POST https://api.discoperi.com/v1/webhooks \
  -H "Authorization: Bearer dsc_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourserver.com/hooks/discoperi",
    "filters": {
      "sectors": ["Healthcare", "Technology"],
      "min_value": 500,
      "acquirer_country": "US"
    },
    "secret": "your_webhook_signing_secret"
  }'

Every webhook request is signed with HMAC-SHA256 using your secret. Verify signatures server-side to confirm authenticity.

GET /stats Database-level statistics and health All plans +

Returns total deal count, total tracked value, last ingestion timestamp, and source health. Available on all plans including test keys.

Deal schema

Every deal record exposes up to 39 fields. Some fields are only populated when disclosed in source material.

  • idstringUnique deal identifier (stable, permanent)
  • acquirerstringAcquiring entity name (normalised)
  • acquirer_countrystringISO 3166-1 alpha-2 country code
  • targetstringTarget entity name
  • target_countrystringISO 3166-1 alpha-2 country code
  • sectorstringOne of 9 standardised sector values
  • deal_typestringAcquisition, Merger, Buyout, LBO, Carve-out, Spin-off, Tender Offer
  • value_usd_mnumber|nullDeal value in USD millions. Null if undisclosed.
  • value_originalnumber|nullValue in original disclosed currency
  • currency_originalstring|nullISO 4217 currency code of original value
  • close_datestringISO 8601 date of deal closing
  • announcement_datestring|nullISO 8601 date of original announcement
  • advisors_buystring[]Buy-side financial advisors (array)
  • advisors_sellstring[]Sell-side financial advisors (array)
  • legal_buystring[]Buy-side legal counsel (array)
  • legal_sellstring[]Sell-side legal counsel (array)
  • rationalestringAI-extracted deal rationale (2–3 sentences)
  • key_termsstringExtracted deal terms (consideration type, conditions, etc.)
  • source_countintegerNumber of independent sources that reported this deal
  • quality_scorenumberComposite quality score 0.0–1.0
  • source_urlsstring[]All source URLs used for verification
  • verifiedbooleantrue when source_count β‰₯ 2 and quality_score β‰₯ 0.75
  • published_atstringISO 8601 timestamp when published to database

SDKs & code examples

Python
import requests

client = requests.Session()
client.headers.update({"Authorization": "Bearer dsc_live_xxxxxxxx"})

# Get all Healthcare deals above $500M
resp = client.get("https://api.discoperi.com/v1/deals", params={
    "sector":    "Healthcare",
    "min_value": 500,
    "limit":     20,
})
deals = resp.json()["data"]
for deal in deals:
    print(f"{deal['acquirer']} β†’ {deal['target']}: ${deal['value_usd_m']}M")
JavaScript / Node.js
const resp = await fetch('https://api.discoperi.com/v1/deals?sector=Technology&min_value=1000', {
  headers: { 'Authorization': 'Bearer dsc_live_xxxxxxxx' }
});
const { data, meta } = await resp.json();
console.log(`${meta.total} deals found`);
data.forEach(d => console.log(d.acquirer, 'β†’', d.target));
Webhook receiver (Express.js)
const crypto = require('crypto');

app.post('/hooks/discoperi', express.raw({ type: 'application/json' }), (req, res) => {
  // Verify signature
  const sig = req.headers['x-discoperi-signature'];
  const expected = crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET)
    .update(req.body).digest('hex');
  if (sig !== `sha256=${expected}`) return res.status(401).send('Invalid signature');

  const deal = JSON.parse(req.body);
  console.log('New deal:', deal.acquirer, 'β†’', deal.target, deal.value_usd_m);
  res.json({ received: true });
});

Changelog

πŸ†•
v1.0 β€” March 2026
Initial API release. Endpoints: /deals, /deals/{id}, /sectors, /advisors, /search, /webhooks, /stats.

Breaking changes will always be announced at least 90 days in advance via email and the API changelog. Subscribe to API updates in your account settings.