Skip to main content
POST
People search
Every action returns normalized output. The Provider’s native output is not repeated there; it stays on the Run and is readable with Get Run. search returns total_matches and output.items[], one row per person. enrich and find_email return one person with the same fields at the top level. A value the selected Provider does not report is null; Glasser does not fill it in. Read result_status separately from status: success, no_result, error or pending. An empty but valid answer is no_result and keeps the action’s shape: every field is null, or items is []. find_email without an email is no_result. charge_usd totals this response’s runs and is null until all Runs settle. With provider: auto, fallback can create multiple Runs, each listed in runs[] with its own charge. See Provider selection and charges.

Output by action

Every field is present on every row; a value the Provider does not report is null. Fields follow the field conventions. A person has these fields: name, first_name, last_name, job_title, seniority, department, headline, linkedin_url, city, region, country, country_code, email, email_status, email_catch_all, email_source, phone, company_name, company_domain, company_linkedin_url, apollo_match_confidence, pdl_likelihood, hunter_email_score, zoominfo_accuracy_score.
  • Names, job titles and labels are as the Provider reports them. PDL names are lower case. name is null when the Provider gives only first and last name; Glasser does not join them. Apollo search masks the last name, so last_name is null.
  • seniority and department are labels in the answering Provider’s own vocabulary (for example Apollo founder, PDL cxo, LeadMagic C-Team). They are not the request’s seniorities values and are not comparable across Providers.
  • email is the address the Provider gives as the work email. PDL fills it only from work_email; its other addresses stay on the Run. Apollo, ZoomInfo and LeadMagic search rows have no email.
  • email_status is the Provider’s own verification label (verified, VERIFIED, valid). Providers verify in different ways, so do not compare the labels. Read them with email_catch_all (the domain accepts every address, so a mailbox check cannot confirm this one) and email_source (Hunter: found on the web, or generated from the domain’s address pattern). Hunter charges for a generated address.
  • total_matches counts the matches in the Provider’s whole dataset, not only this page. It is null for LeadMagic, which gives only the page count.
  • Scores from a Provider’s own model carry its name and are null for the others: apollo_match_confidence (high, medium, low, none), pdl_likelihood (1–10), hunter_email_score (0–100), zoominfo_accuracy_score (0–100).

Filters

  • PDL matches job_titles exactly as given, so “CTO” does not match “Co-founder & CTO”. It matches locations as a substring, so “london” also matches “new london, connecticut”.
  • ZoomInfo has no founder, owner, partner, head, entry or intern level, so with auto those requests skip ZoomInfo. ZoomInfo’s senior is its whole “Non Manager” tier, which also includes junior individual contributors.
  • Hunter search lists only the personal addresses at company_domain, not role mailboxes such as info@. Prospeo enrich returns only people it holds a verified work email for. find_email via Apollo also accepts linkedin_url on its own; an Apollo match without a real email is a miss and is not charged.

Headers

idempotency-key
string
required

Generate a unique value for each intended execution (a UUID is recommended). Retry with the same key and execution parameters to retrieve the original Run without a second charge. Changing execution parameters with the same key returns 409; changing task_id or metadata does not update the original Run.

Minimum string length: 1

Body

application/json
action
enum<string> | null

Default: search.

  • search: supply at least one of job_titles, seniorities, locations, company_domain, or keywords. Apollo and ZoomInfo rows carry no email or phone; PDL rows are full records; Hunter lists the personal addresses at company_domain.
  • enrich: supply linkedin_url, email, or full_name plus company_domain. Prospeo returns only people it holds a verified work email for.
  • find_email: supply full_name and company_domain. Apollo also accepts linkedin_url alone; an Apollo match without a real email is a miss and is not charged.

Filters are never silently dropped. With auto, Providers that cannot apply them are skipped; a named Provider that cannot apply them returns 400.

Available options:
search,
enrich,
find_email
provider
enum<string> | null

Default auto: select the first eligible Provider in Glasser's preference order. A named Provider must support the request and be allowed by your Key; it does not fall back to another Provider. Available values are listed below.

Available options:
auto,
apollo,
pdl,
leadmagic,
zoominfo,
hunter,
prospeo
job_titles
string[] | null

Job titles to match. PDL matches each title exactly as given, so 'CTO' does not match 'Co-founder & CTO'.

Required array length: 1 - 20 elements
Required string length: 1 - 200
seniorities
enum<string>[] | null

Seniority levels, one or more of owner, founder, c_suite, partner, vp, head, director, manager, senior, entry, intern. A Provider without a matching level returns 400 when named and is skipped under auto. ZoomInfo has no founder, owner, partner, head, entry or intern level; its senior is the whole Non Manager tier, which also includes junior individual contributors.

Required array length: 1 - 11 elements
Available options:
owner,
founder,
c_suite,
partner,
vp,
head,
director,
manager,
senior,
entry,
intern
locations
string[] | null

Locations as free text. PDL matches each as a substring of the person's location name, so 'london' also matches 'new london, connecticut'.

Required array length: 1 - 20 elements
Required string length: 1 - 200
company_domain
string | null

A website domain such as stripe.com. A full URL is accepted and reduced to its host.

Required string length: 3 - 253
keywords
string | null
Required string length: 1 - 300
full_name
string | null
Required string length: 1 - 200
email
string | null

An email address.

Maximum string length: 320
Pattern: ^[^\s@]+@[^\s@]+\.[^\s@]+$
linkedin_url
string | null

The person's LinkedIn profile URL, linkedin.com/in/. Not a company page.

Maximum string length: 2048
Pattern: linkedin\.com\/in\/[^/?#\s]+
limit
integer | null

Rows to return. Keep it small: the routed Endpoint's charge rule may read it. Each capability caps it further.

Required range: 1 <= x <= 100
task_id
string | null

Group related Runs, including automatic fallback, under one Task. Reuse a stable string and filter the Runs list by task to retrieve them.

metadata

Optional tracking fields, returned on the Run and available as filters. They never go to the Provider or affect routing, Price, or idempotency.

  • Up to 20 keys: lowercase letters, digits, and underscores; start with a letter; at most 40 characters.
  • Values: strings of 1–500 characters.
  • user_id: your End user's opaque ID, never their email address or name.

Invalid entries are dropped whole, not truncated. The request continues, and the Run returns the fields that were stored.

Response

Success

id
string
required
run_url
string
required

Open this Run in the console. Requires Workspace membership.

provider
string
required
Pattern: ^[a-z0-9][a-z0-9-]*$
endpoint
string
required
Pattern: ^\/.+$
endpoint_version
integer
required
status
enum<string>
required

QUEUED or RUNNING: still in progress. COMPLETED: a Provider response is available, including non-2xx responses. FAILED: read failure. STOPPED: stopped before dispatch. Read charge_usd separately from status.

Available options:
QUEUED,
RUNNING,
COMPLETED,
FAILED,
STOPPED
failure
object | null
required

Why the Run failed. Non-null only when status is FAILED.

input
object
required
output
object
required

Normalized fields per action; enrich and find_email return one person with the same fields as a search row. The Provider's native output is not repeated here; it stays on the Run (GET /v1/runs/:id). Values a Provider does not report are null; an empty answer is the action's shape with every field null, or items: [], with result_status no_result. Names, titles and labels are as the Provider reports them. A score from a Provider's own model is named after the Provider (pdl_likelihood) and is null for the others.

  • search: total_matches, items[]: name, first_name, last_name, job_title, seniority, department, headline, linkedin_url, city, region, country, country_code, email, email_status, email_catch_all, email_source, phone, company_name, company_domain, company_linkedin_url, apollo_match_confidence, pdl_likelihood, hunter_email_score, zoominfo_accuracy_score
  • enrich: name, first_name, last_name, job_title, seniority, department, headline, linkedin_url, city, region, country, country_code, email, email_status, email_catch_all, email_source, phone, company_name, company_domain, company_linkedin_url, apollo_match_confidence, pdl_likelihood, hunter_email_score, zoominfo_accuracy_score
  • find_email: name, first_name, last_name, job_title, seniority, department, headline, linkedin_url, city, region, country, country_code, email, email_status, email_catch_all, email_source, phone, company_name, company_domain, company_linkedin_url, apollo_match_confidence, pdl_likelihood, hunter_email_score, zoominfo_accuracy_score
provider_response
object | null
required

Non-null only when status is COMPLETED.

  • For 2xx responses, output contains Provider-native JSON (any shape), or null for an empty body.
  • For non-2xx responses, error contains the Provider's error body and output is null.

Sensitive fields are removed from both bodies.

charge_usd
string | null
required

Total charge of runs in this Solution response. Null until all listed Runs settle. Each Run retains its own charge; failures can also be charged.

Pattern: ^(0|[1-9]\d*)\.(\d{2}|\d{2}\d{0,3}[1-9])$
charge_basis
object | null
required

Single-Run charge basis, or null for a multi-Run total. Read runs[].charge_basis for each charge.

stoppable
boolean
required

Whether a stop request can currently be accepted. This does not guarantee that the Run can stop before dispatch.

stop_requested_at
string<date-time> | null
required

When a stop was requested. The Run can still continue if dispatch had already started.

created_at
string<date-time>
required

ISO-8601 UTC timestamp

started_at
string<date-time> | null
required

ISO-8601 UTC timestamp

completed_at
string<date-time> | null
required

ISO-8601 UTC timestamp

task_id
string | null
required
metadata
object
required

Your stored tracking fields. Use them to filter Runs. They never go to the Provider or affect routing, Price, or idempotency.

  • Up to 20 keys: lowercase letters, digits, and underscores; start with a letter; at most 40 characters.
  • Values: strings of 1–500 characters.
  • user_id: your End user's opaque ID, never their email address or name.
action
enum<string>
required
Available options:
search,
enrich,
find_email
result_status
enum<string>
required

Business delivery status, independent of the final Run lifecycle in status. no_result is an empty but valid answer; error means the Provider output could not be delivered.

Available options:
success,
no_result,
error,
pending
error
object | null
required
runs
object[]
required
result_url
string
required

Authenticated, read-only URL path for polling this normalized result and total charge. Use with the API origin. Does not create Runs or resume fallback. GET /v1/runs/:id still returns the native, individual Run.