Skip to main content

Bulk Enrichment

Enrich up to 1,000 companies in a single request — build target account lists, score your CRM, or research an entire market segment at once.

No-code alternative

Prefer a visual workflow? Upload a CSV of domains in the Dashboard and export enriched results — no API integration needed. See Target Account Lists for a step-by-step walkthrough.

Submit a Batch

curl -X POST https://api.veraenrich.com/enrich/bulk \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domains": ["stripe.com", "shopify.com", "twilio.com"]}'

Response (202 Accepted):

{
"status": "processing",
"batchId": "batch-uuid-here",
"totalDomains": 3,
"queuedDomains": 3,
"invalidDomains": 0,
"estimatedDurationMin": 1,
"message": "Started processing 3 domains (~1 min)"
}

Check Batch Status

curl https://api.veraenrich.com/enrich/bulk/BATCH_ID \
-H "Authorization: Bearer YOUR_API_KEY"
{
"batchId": "batch-uuid-here",
"status": "processing",
"totalDomains": 100,
"processedCount": 45,
"succeededCount": 42,
"failedCount": 3,
"progress": 45,
"errors": [
{"domain": "invalid.xyz", "error": "Unable to reach website"}
]
}
StatusDescription
processingActively being processed
completedAll domains processed
failedBatch failed to start (all domains invalid)

Implementation

async function bulkEnrich(domains) {
const headers = {
'Authorization': `Bearer ${process.env.VERA_API_KEY}`,
'Content-Type': 'application/json'
};

const response = await fetch('https://api.veraenrich.com/enrich/bulk', {
method: 'POST',
headers,
body: JSON.stringify({ domains })
});

const { batchId } = await response.json();

// Poll for completion (~3s per domain, 5s interval)
const maxAttempts = Math.ceil((domains.length * 3) / 5) + 20;

for (let i = 0; i < maxAttempts; i++) {
const status = await fetch(
`https://api.veraenrich.com/enrich/bulk/${batchId}`,
{ headers: { 'Authorization': headers.Authorization } }
).then(r => r.json());

console.log(`Progress: ${status.progress}%`);

if (status.status === 'completed') return status;
if (status.status === 'failed') throw new Error('Batch failed');

await new Promise(r => setTimeout(r, 5000));
}

throw new Error('Timeout waiting for batch');
}

Domain Handling

Accepted formats: stripe.com, www.stripe.com, https://stripe.com, https://stripe.com/pricing — all normalize to the same domain. Duplicates are automatically deduplicated.

Rejected: empty strings, IP addresses, invalid TLDs. Invalid domains are reported in the response errors array and don't block the batch.

Limits

LimitValue
Max domains per batch1,000
Concurrent batches1 per team
Processing speed~3s per domain

Error Handling

Batch-level errors are returned as HTTP status codes (see Error Codes). Individual domain failures appear in the errors array — the batch continues processing remaining domains.

Next Steps