Skip to main content

POST /v1/validate/bulk

Validate multiple email addresses (up to 100) in a single API request. This endpoint is synchronous and returns conservative temporary SMTP results immediately. For durable retries after 15 minutes and four additional hours for explicit unknown_temporary SMTP responses, use Async Validation Jobs. Each result also contains additive combined-evidence fields. Enterprise-gateway inference is returned in shadow mode and does not override the canonical result, the production send_recommendation, or billing.

Endpoint

Headers

Retry-safe requests

Use a unique Idempotency-Key for each logical batch. Reusing the key with the same ordered, canonical email list and benchmark-receipt setting returns the exact successful JSON response with Idempotency-Replayed: true. The original response sets the header to false. Email order is part of the request identity because result order is preserved. A changed list, changed order, or changed benchmark-receipt setting returns 409 idempotency_key_conflict. A duplicate still in progress returns 409 idempotency_request_in_progress with Retry-After: 2. Only successful responses are retained; deterministic and transient failures can be retried with the same key after their cause is resolved.

Request Body

Example Request

Response

Success Response (200 OK)

Response Fields

array
required
Array of validation results, one per input emailEach result has the same fields as the single validation endpoint
object
required
Summary statistics for the bulk validation
object
Present only when X-GTM-Benchmark-Receipt: email-benchmark-receipt-v6 (or explicit compatibility v2/v3/v4/v5) was requested. Contains schema_version, an ES256 compact-JWS token, and the signed server issued_at timestamp. The token binds aggregate hashes of the cohort and ordered benchmark projection. Version 6 also binds the requested fresh-evidence mode. Its projection includes the bounded provider family, taxonomy version, and decisive reviewed Microsoft SMTP route provenance when available; it contains no raw email addresses, tenant MX hosts, internal route IDs, or verdicts. Verify it with the benchmark key published at https://api.gtmapis.com/.well-known/jwks.json.
integer
required
Total number of emails validated
integer
required
Count of valid results (personal emails)
integer
required
Count of valid_role_based results
integer
required
Count of risky results (catch-all domains)
integer
required
Count of invalid results
integer
required
Count of unknown results
integer
required
Count of High-Value Validations: valid personal emails that are not role-based, catch-all, risky, invalid, or unknown.
integer
required
Count of results from catch-all domains. These are not High-Value Validations by default.
integer
required
Credits reserved before uncached validation work starts.
integer
required
Total credits charged for this bulk validation. This is kept as a compatibility alias for consumed credits.Sum of all credits_charged values in results
integer
required
Credits consumed after applying GTMAPIs credit policy. For Email Validation this matches credits_charged.
integer
required
Reserved credits returned because the corresponding results were role-based, catch-all, invalid, risky, unknown, or otherwise non-chargeable.
number | null
required
Effective credits consumed per High-Value Validation. This is null when the response contains no high-value validations.

Limits

Exceeding Limits

Too many emails in one request (> 100):
Solution: Split into multiple requests of 100 emails each, or use /v1/validate/batch for larger asynchronous jobs.

Processing Time

Processing time varies with cache state, DNS responsiveness, and SMTP server behavior. Use /v1/validate/bulk for synchronous batches up to 100 emails, and use /v1/validate/batch or the signed CSV upload flow for larger jobs that need polling and download handoffs.

Best Practices

Batch Processing

For large lists (1000+ emails), process in batches:

Error Handling

An upstream validation failure returns 502, code: "validation_upstream_failed", retry_after: 30, and a matching Retry-After: 30 header. Wait for that delay before retrying the same logical request. The failed validation does not consume credits. Handle errors gracefully:

Filtering Results

Filter by quality for campaign use:

Credit Estimate

Estimate the maximum credits before processing:

Common Patterns

Deduplicate Before Validation

Save credits by removing duplicates:

Progress Tracking

Track progress for large batches:

Next Steps

Single Validation

Validate one email at a time

CSV Upload Guide

Upload and validate CSV files via dashboard