The lead record, as JSON.
What lands in your CRM, warehouse or webhook when a buyer on one of our pages compares two vendors. Every field in the lead schema, the events behind it, the intent data API and the four other ways to receive it, and how to dedupe on your side.
Every field, and what fills it.
Angle brackets are personal values, redacted here. The structure is identical on every lead we send.
- stage is
researchingorin_market. It flips to in-market when we record analternatives_read,comparisonorpricing_viewevent, and for no other reason. - consideration_set lists the vendors on the comparison pages this person opened, by name.
- consent holds the property, the timestamp, the exact opt-in wording, and whether your company was named when the person opted in.
- events is everything this person did across all seven properties, oldest first.
{
"lead_id": "nr_7f3a9c2e",
"person": {
"name": "<name on the lead>",
"work_email": "<work email>",
"linkedin_url": "<profile url>",
"phone": "<phone, where held>",
"role": "Controller",
"seniority": "Manager",
"function": "Finance"
},
"company": {
"name": "Acme Manufacturing",
"domain": "acme.example",
"employees": "100-499",
"revenue_band": "$100M-$499M",
"industry": "Manufacturing",
"region": "NAMER"
},
"stage": "in_market",
"category": "ERP",
"consideration_set": ["NetSuite", "Sage Intacct"],
"events": [
{ "type": "newsletter_open", "property": "financeopsclub", "at": "2026-07-09T14:02:11Z" },
{ "type": "download", "property": "spotsaas", "asset": "2026 Finance Benchmark", "at": "2026-09-14T09:41:03Z" },
{ "type": "alternatives_read", "property": "spotsaas", "page": "/netsuite-alternatives", "at": "2026-11-08T16:20:45Z" },
{ "type": "comparison", "property": "spotsaas", "page": "/compare/netsuite-vs-sage-intacct", "vendors": ["NetSuite", "Sage Intacct"], "at": "2026-11-12T08:15:27Z" }
],
"consent": {
"property": "spotsaas",
"at": "2026-09-14T09:41:03Z",
"wording": "<the opt-in text the person accepted>",
"advertiser_named": true
},
"delivered_at": "2026-11-12T09:00:00Z"
}Six event types. These three mark a buyer as in-market.
newsletter_openOpened one of the 20+ issuesresearchingcategory_readRead a guide or explainerresearchingdownloadTook a benchmark, checklist or reportresearchingalternatives_readRead an "X alternatives" pagein_marketcomparisonPut two vendors side by side. The event carries both vendor namesin_marketpricing_viewOpened a pricing comparisonin_marketFive ways to receive it.
CSV or JSON to SFTP or S3, one file a day, containing every lead since the last file.
Snowflake share or REST API, paged on delivered_at. You pull on your schedule.
One POST per event or per lead, the moment it is recorded. This is how it reaches Clay, n8n, Make and your own agents.
Salesforce, HubSpot, Marketo or Eloqua, mapped to your objects, once a day.
Email-hashed lists pushed to LinkedIn, Meta, Google and your DSP, for activation programs.
Keys, matching and re-delivery.
lead_id stays the same for a person across every property and every delivery. Upsert on it.
Match on person.work_email, lower-cased. If that misses, fall back to company.domain plus person.name.
When a researching lead crosses into market we send the record again: same lead_id, new stage, new events appended. Nothing is overwritten without a trace.
Send us your customer and competitor domains. We hold matching profiles back before delivery instead of asking you to filter them out after.
Webhooks fire once per event, so one person produces several calls over a term. Batch on lead_id if your receiver prefers one row per person.
Schema, webhook, dedupe, refresh and suppression.
What is the lead schema?
One JSON object per lead: lead_id, person (name, work email, LinkedIn, phone, role, seniority, function), company (name, domain, employees, revenue band, industry, region), stage, category, consideration_set, events with timestamps, consent (property, time, wording, advertiser_named) and delivered_at. The structure is identical on every lead.
How does the webhook work?
One POST per event or per lead, sent the moment it is recorded, as JSON to the HTTPS endpoint you register. It carries the full record rather than just the event, so Clay, n8n, Make or your own agents can act on it without a second call. Non-2xx responses are retried.
How should I dedupe leads?
Upsert on lead_id, which stays constant for a person across every property and delivery. To match into your CRM, use person.work_email lower-cased, then fall back to company.domain plus person.name. Webhooks fire per event, so batch on lead_id if you want one row per person.
How often is the data refreshed?
Daily files and CRM syncs run once a day and include every lead since the previous run. The REST API and Snowflake share update on the same cadence and are paged on delivered_at. Webhooks are immediate. When a researching lead crosses into market, it is re-delivered with the new stage.
How does suppression work?
Send us your customer and competitor domains, and any individual opt-outs, before delivery starts. Matching profiles are held back on our side so they never reach your CRM. Suppression lists can be updated at any point in the term, and CCPA opt-outs are honoured network-wide.

Get a sample file for your category.
Tell us the category and the stack it lands in. We send a redacted sample in this exact shape along with the program plan, the properties it runs on, and the buying model that fits.
Built for procurement, not just for marketing.
Consent on every record. Nothing your legal team has to take on faith.