Skip to main content
GET
Poll every 2–5 seconds until the search reaches a terminal status. Once a full search is completed, page its PIDs. Polling and PID retrieval do not consume record capacity.

Status values

Preview jobs can return completed. Use materialization_extent to distinguish preview from full; status alone does not indicate that full PID results are available.

Progressive preview results

Submit once and poll the same job ID. For third-party previews that execute as one Elasticsearch query, total_count becomes available before demographic statistics finish. Use total_count !== null to display the audience size; 0 means the completed count found no matches. Continue polling for stats and terminal status.
Count available; demographics still running
total_count is exact for the count query, not a threshold or sampled estimate. Demographic statistics retain their existing sampling behavior for large audiences. If a later step fails, the count remains available alongside status: "failed"; a count alone does not mean the preview completed. Statuses reflect observed worker progress, so fast stages may be skipped between polls. Terminal status takes precedence over delayed worker updates. Clients should continue polling for any nonterminal status, including new processing stages. Full jobs and previews requiring other execution paths may only provide their count when processing completes.

Request

Headers

string
required
An API key for the organization that submitted the search.

Path Parameters

string
required
UUID returned by Async Person Search.

Response

Success Response (200 OK)

string
Async search and segment UUID.
string
Current processing status.
object
Terminal failure details for failed or cancelled jobs. null for every other status.
string
Stable machine-readable failure category: search_criteria_failed, search_processing_failed, search_timed_out, search_worker_lost, or search_cancelled.
string
Caller-safe explanation and, when available, a suggested replacement search.
boolean
Always false. Failed and cancelled jobs are terminal; submit a new or revised search to continue.
string
Effective materialization mode applied to this job: preview or full. Results are available when this is full and status is completed.
string
ISO-8601 submission timestamp.
string
ISO-8601 timestamp of the latest status update, when available.
object
Parsed criteria tree used to build the segment, when available.
object[]
Criteria that could not be processed, when applicable.
Suggested alternative query when the original search cannot be resolved.
integer
Exact audience match count, available before demographics finish for supported third-party previews. null until available; retained if a later step fails.
object
Compact contact coverage and demographic distributions for the preview or completed segment. null while the job is still processing or when it fails.

Completed-job statistics

Every distribution bucket uses { label, count, percentage }. Percentages use total_count as the denominator and are rounded to two decimal places.
  • age uses Under 18, 18-24, ten-year adult bands through 65-74, and 75+.
  • gender uses Female, Male, and Unknown.
  • home_ownership uses Owned, Rented, and Unknown.
  • job_title is a high-cardinality dimension. It returns only the ten most frequent standardized current titles; remaining titles are intentionally omitted and are not combined into an Other bucket.
  • current_address_state returns the ten largest buckets plus an Other bucket when more values are present.
200 — completed preview
200 — failed criteria

Errors

Processing deadlines

Processing limits depend on the deployed worker configuration. The legacy Lambda worker has a four-minute processing budget, excluding queue wait and startup. When that budget is exhausted, polling returns failed with error.code: "search_timed_out". When Temporal workers are enabled for the async API, full materializations may run longer than five minutes. Worker failure or an execution timeout is persisted as failed with error.code: "search_worker_lost". Failure reporting can be delayed while the status service is unavailable. querying and updated_at do not establish worker liveness: updated_at is a stored segment update timestamp, not a heartbeat. Stop polling on terminal statuses. If your own polling timeout expires, you can resume polling the same job later. For very large audiences, narrow the criteria or use materialization_extent: "preview" when you only need counts and statistics.

Async API worker liveness

Jobs submitted through the async API may include an optional worker object with status (queued, running, or finished) and heartbeat_at (an ISO 8601 timestamp or null). This reports worker liveness, not a completion estimate. Continue to use the job’s top-level terminal status and error to determine success or failure. A stale heartbeat alone does not prove failure. Full materializations may take longer than five minutes.