Integration Guide
There are two ways to consume Web Intent data: the API (simplest — returns enriched results directly) and flat file delivery (highest volume — requires joining to your existing data).
| Method | Setup complexity | Best for | Volume |
|---|---|---|---|
| API | Low | Real-time targeting, app integrations | On-demand queries |
| Flat file | Medium | Data warehouse ingestion, bulk scoring | Daily full delivery |
API Integration
The API returns complete, enriched intent records — no joining required. Query by topic, company, contact, or any combination and get back full records with all fields populated.
GET /signals?type=web_intent&topic_name=Kubernetes&employee_count=1001-5000
→ Returns enriched company + contact records with intent data attached
Authentication, endpoints, filtering, and pagination are documented in the Signal API reference.
When to use the API:
- Building real-time intent triggers in your app
- Powering sales rep workflows (daily intent feeds per territory)
- Small-to-medium volume queries with specific filters
- You want enriched results without managing join logic
Flat File Delivery
Flat files deliver the highest volume of intent data — daily JSONL + Parquet files dropped to your cloud storage. The tradeoff: intent records arrive as topic-level observations that you join to your own company/contact data.
Company-Level Join
Company-level intent records include company_domain. Join directly to your CRM or data warehouse on domain:
Intent file (topic_id + company_domain) → JOIN on domain → Your CRM companies
SELECT
i.company_name,
i.company_domain,
i.topic_name,
i.category,
i.subcategory,
c.account_owner,
c.account_tier
FROM web_intent_company i
JOIN crm_companies c
ON i.company_domain = c.domain
WHERE i.category = 'Technology'
AND c.account_tier = 'enterprise';Contact-Level Join
Contact-level intent records include a up_id (universal person identifier) and business_email. You have two join paths:
Option A: Intent file (up_id) → JOIN on up_id → Contact DB file → full person record
Option B: Intent file (business_email) → JOIN on email → Your CRM contacts
Option A — Join via up_id to the Contact Database:
If you receive the full contact database file (delivered separately), join on up_id to get the complete person record alongside their intent topics:
SELECT
i.topic_name,
i.category,
c.first_name,
c.last_name,
c.business_email,
c.job_title,
c.seniority_level,
c.company_name,
c.company_domain
FROM web_intent_contact i
JOIN contact_database c
ON i.up_id = c.up_id
WHERE i.subcategory = 'Cybersecurity'
AND c.seniority_level IN ('VP', 'CXO', 'Director');Option B — Join via business_email to your CRM:
If you already have contacts in your CRM, join directly on email without needing the contact database file:
SELECT
i.topic_name,
i.category,
crm.contact_name,
crm.account_name,
crm.owner
FROM web_intent_contact i
JOIN crm_contacts crm
ON i.business_email = crm.email
WHERE i.topic_name = 'Salesforce'
AND crm.lead_status = 'open';Resolution Chain (Complete)
Company-level:
Intent file (topic_id + company_domain)
→ JOIN on company_domain
→ Your CRM companies
Contact-level:
Intent file (topic_id + up_id + business_email)
→ JOIN on up_id → Contact DB file → full person record (name, title, phone, LinkedIn)
→ OR JOIN on business_email → Your CRM contacts (if already in your system)
Delivery Cadence
- Frequency: Daily delivery
- Format: Timestamped folders containing JSONL and Parquet files
- Folder structure:
YYYY-MM-DD-HH-MM-SS/— each folder is a complete daily snapshot - Processing: Treat all signals in a new folder as fresh. Load the entire folder; no need to diff against prior deliveries
Deduplication
The same company + topic pair can appear on consecutive days if intent persists. This is expected behavior — it means the company is still actively consuming content on that topic.
Common deduplication strategies:
| Strategy | Logic | Use case |
|---|---|---|
| Latest only | Keep most recent record per company + topic | Simple alerting |
| Frequency scoring | Count appearances over N days | Prioritize sustained interest |
| First-seen windowing | Suppress if seen within last 7 days | Avoid duplicate outreach triggers |
Webhooks
For real-time push delivery, webhooks send intent signals to your endpoint as they're detected — no polling or file processing required.
Webhook configuration, payload format, and retry behavior are available on request. Contact your account team to enable webhook delivery for your integration.
Updated about 4 hours ago
