Key Benefits
- Automated verification: Every result is checked against your criteria before becoming an item — no manual filtering needed.
- Structured enrichments: Extract specific data points (names, emails, URLs, numbers) from each result using web research, not just page scraping.
- Real-time updates: Use webhooks and monitors to keep websets continuously updated without polling.
Writing Good Queries
The query drives search behavior. Be specific and descriptive — Websets uses Exa’s neural search, so natural language works well.| Approach | Example | Why It Works |
|---|---|---|
| Specific + contextual | ”AI startups in the US that raised Series A in 2025” | Constrains geography, stage, and timing |
| Entity-focused | ”VP of Engineering at mid-size fintech companies” | Clear entity type with role specificity |
| Domain-scoped | ”Machine learning research papers on efficient transformers” | Targets a content type naturally |
Writing Effective Criteria
Criteria determine whether a search result becomes an item. Each result is verified against every criterion — only results matching all criteria are kept. Keep criteria verifiable. Each criterion should be something that can be confirmed from publicly available web content.successRate on search responses to see what percentage of evaluated items matched each criterion. A very low success rate might indicate an overly strict or ambiguous criterion.
Choosing Entity Types
Theentity field shapes how results are found and structured. Auto-detection works well in most cases, but explicit types give you more control.
| Type | When to Use | Properties You Get |
|---|---|---|
company | Company websites, LinkedIn company pages | company.name, company.location, company.employees, company.industry |
person | People profiles, LinkedIn individuals | person.name, person.location, person.position |
article | Blog posts, news articles | article.author, article.publishedAt |
research_paper | Academic papers, arXiv | researchPaper.author, researchPaper.publishedAt |
custom | Anything else (job postings, events, etc.) | custom.author, custom.publishedAt |
Designing Enrichments
Enrichments extract additional data from each item using web research. Think of them as questions Websets answers for every result. Be specific about what you want. Vague enrichments produce vague results.| Good | Bad |
|---|---|
| ”Find the CEO’s full name" | "Who runs this company?" |
| "Company’s LinkedIn page URL" | "Find social media" |
| "Estimated annual revenue in USD" | "How big is this company?" |
| "Year the company was founded" | "When did they start?” |
| Format | Use For | Example Description |
|---|---|---|
text | Names, descriptions, freeform answers | ”Find the CEO’s full name” |
number | Counts, amounts, years | ”Estimated employee count” |
date | Specific dates | ”Date of most recent funding round” |
url | Links to specific pages | ”Company’s LinkedIn page URL” |
email | Contact emails | ”General contact email address” |
phone | Phone numbers | ”Main office phone number” |
options | Multiple choice classification | ”Industry vertical” with options |
options for classification tasks — it’s more reliable than asking for freeform text when you have a known set of categories:
Async Patterns
Websets are asynchronous — results arrive over time as searches complete and enrichments process. Usewait_until_idle in SDKs for simple workflows:
webset.item.created— fires as each item passes verification (stream results as they arrive)webset.item.enriched— fires when an enrichment result is ready for an itemwebset.idle— fires when all searches and enrichments complete
running — you don’t have to wait for idle.
Idempotency and Deduplication
UseexternalId to prevent duplicate websets. If you create a webset with an externalId that already exists, you’ll get a 409 error instead of a duplicate. You can then use externalId in place of id for all API calls.
Monitors for Recurring Searches
Monitors run searches on a schedule to keep websets updated with fresh results."behavior": "append" in monitor searches to add new items without removing existing ones. Use "override" to re-evaluate existing items against new criteria.
Imports for Your Own Data
Imports let you bring URLs from your own sources (CRM exports, spreadsheets, etc.) and run enrichments on them:Common Patterns
Lead Generation Pipeline
Competitive Intelligence
Tips
- Enrichment results are always arrays. Even for single values,
resultis["value"]ornullif not found. - Enrichment results have
enrichmentId, notdescription. Build a map fromwebset.enrichmentsto resolve IDs to descriptions:{e.id: e.description for e in webset.enrichments}. - Item data is nested under
properties. Accessitem.properties.url,item.properties.company.name— notitem.url. expand=itemssaves a call.GET /websets/{id}?expand=itemsreturns the webset and its latest 100 items in one request.- Webhook secrets are shown once. Store the
secretfrom the create response immediately for signature verification. - Preview before committing. Use
POST /websets/previewto test a query without creating a webset.

