Skip to main content

Quick Answer

How do I run a full async person search from start to finish? Submit with materialization_extent: "full", poll until completed, unlock once with POST /results, then page the remaining PIDs with GET /results.Common questions this page answers:
  • When should I use async person search instead of the synchronous endpoint?
  • How do I know when my search is done?
  • Does retrieving PIDs consume record capacity?
  • How do I retrieve more than 100 PIDs?
  • Why did I get a 409?
What you need: An API key with Person Search access and a natural-language audience description of 500 characters or fewer.What you get back: Every Minerva PID matching the query, paged 100 at a time, without consuming record capacity.

Overview

Synchronous Person Search returns up to 100 PIDs immediately and stops there. Async Person Search defaults to preview materialization, which returns count and statistics without persisting every matching PID. Set materialization_extent to full to build the complete, reusable segment used by the unlock and pagination flow below. The async flow lets you materialize the full audience and inspect its size before requesting record export.
Use async preview when you need background processing plus audience count and statistics. Request full materialization only when you need every PID.

Before you start

1

Use an authorized API key

The key must belong to the organization creating the search and have access to Person Search.
2

Plan for record export

PID-only results are free. Fetching records through Enrich v2 or an activation uses record capacity once per record per term.
3

Write the query as an audience description

Describe shared attributes (“Software engineers in Austin who previously worked at a public technology company”), not a specific named person. See Writing good queries for the attribute categories the parser handles well — they are identical for sync and async.

The flow at a glance

All five steps return or prepare PID-only results without consuming record capacity. Enrichment and record exports are billed separately. Campaign activations to supported ad and direct mail platforms do not consume record allowance or incur record overage.
POST /person-search/v0/search-jobs accepts the query and returns immediately with 202 Accepted. Parsing and materialization continue in the background. The endpoint defaults to preview, so this full-results walkthrough opts into full materialization explicitly.
202
Store the segment_id. It is the identifier for the job, the segment, and every subsequent call in this flow. The submit response contains no PIDs — that is the key difference from synchronous search.

Full endpoint reference

Request body, headers, and the complete error table for the submit call.

Step 2 — Poll until the segment is built

GET /person-search/v0/search-jobs/{segment_id} reports progress. Poll every 2–5 seconds until the status is terminal. Polling never unlocks PIDs and never bills.
The job walks forward through these states:
Stop polling on every terminal state: previewed, completed, failed, and cancelled.
For failed and cancelled, inspect the response’s error object for its stable code and caller-safe message. error.retryable is always false because the job is terminal; submit a new or revised search to continue. When criteria caused the failure, error_criteria identifies them and suggested_search provides a rephrased query worth trying instead.

Full endpoint reference

Every status field, the criteria tree shape, and completed-job statistics.

Step 3 — Review audience size before unlocking

This is the step that makes the async flow worth using. Once status is completed, the status response tells you exactly the result size and availability: estimated_billable_count is 0 for available PID-only results. These results do not license records. Enrich v2 and record exports check your available record capacity and count each returned record once per organization per term. Use stats to qualify contact coverage and demographic distributions before requesting full data.

Step 4 — Unlock the PID results

POST /person-search/v0/search-jobs/{segment_id}/results unlocks the full materialization and returns your first PID page without consuming record capacity.
200
billable_count is 0 because this response contains only PIDs. Unlock is idempotent. Repeating POST returns the requested PID page.

Step 5 — Page through the remaining PIDs

After unlock, use GET on the same path for every subsequent page. GET is side-effect-free and never bills.
Each response returns at most 100 PIDs. Start at offset=0 and advance by returned until offset + returned >= total. The 100-PID cap applies to the HTTP response only, not to the segment — total reports the full count and you can page all of it.

Full endpoint reference

POST vs GET semantics, pagination parameters, and the complete error table.

Complete working example

The whole flow, end to end, with an audience-size check before the unlock:

Troubleshooting


What to do with the PIDs

Async person search returns Minerva PIDs only, with no person attributes attached. Take them somewhere next:

Enrich v2

Fetch full profile data — demographics, work history, contact channels — for the PIDs you unlocked.

Add Members to Segment

Persist the results into a segment you can track and activate.

Person Search Usage

Review daily delivery limits and consumption history.

Contact Append / Prospect

A separate async flow for ABM contacts at target companies.

Endpoint reference