openapi: 3.2.0 info: contact: email: support@getanyapi.com description: 'Any API, one wallet, USD, no subscriptions. Each API is a single discovered operation: send the normalized input, get a normalized result. Prices and payment outcomes are reported in USD; each operation documents the settlement policy for its enabled payment rails.' title: Any People Search API version: 1.0.0 x-guidance: 'Use each operation''s published method and path with its normalized JSON input (see the operation requestBody). Before setting a client or tool timeout, GET /v1/apis/{sku} and inspect its trailing-30-day latency p50/p95/p99 and sample; p99 is an observation, not a maximum. To pay: send your AnyAPI key (Authorization: Bearer, billed from your USD wallet). For operations that advertise an inline rail, pay per call inline with x402 - call with no key, receive HTTP 402 with a PAYMENT-REQUIRED header, then retry with the PAYMENT-SIGNATURE header (base, no account needed); or pay per call inline with MPP (Machine Payments Protocol) - call with no key, receive HTTP 402 with a WWW-Authenticate: Payment challenge, then retry with the Authorization: Payment header (tempo, no account needed). x402 settles after execution; execution failure is reported as released; mpp settles before execution; execution failure is reported as charged_undelivered.' servers: - url: https://api.getanyapi.com security: - bearerAuth: [] - apiKeyAuth: [] tags: - name: People Search x-group: People_search paths: /v1/run/people_search.ai_ark: post: description: 'Search professional profiles with account, contact, and saved-list filters. **Price:** billed per result - \$8.40 per 1,000 results, capped at \$840.00 per 1,000 requests. **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - AI Ark pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_ai_ark parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: page: 0 size: 1 schema: additionalProperties: false example: page: 0 size: 1 properties: account: additionalProperties: true description: 'Company-level filters, keyed by filter name. Accepted names: domain, employeeSize, foundedYear, funding, geoLocation, industries, keyword, language, linkedin, metric, naics, name, phoneNumber, productAndServices, retailSize, revenue, socialMedia, socialMediaLink, technologies, technology, type, url, location. Any other name is rejected. Most names take {"any"|"all": {"include": [...], "exclude": [...]}}, for example {"type": {"any": {"include": ["PUBLIC_COMPANY"]}}}. The any/all object goes INSIDE the filter name, never at the top of account. Size and money filters (employeeSize, foundedYear, revenue, retailSize) instead take {"type": "RANGE", "range": {"start": 50, "end": 200}} or {"type": "ALL"|"NONE"}; geoLocation takes {"position": {"lat": 0, "lng": 0}, "radius": 50, "unit": "km"|"mi"}; keyword takes {"any"|"all": {"include"|"exclude": {"content": ["..."], "sources": [{"mode": "WORD"|"SMART"|"STRICT", "source": "NAME"|"KEYWORD"|"SEO"|"DESCRIPTION"|"INDUSTRY"}]}}}.' type: object contact: additionalProperties: true description: 'Person-level filters, keyed by filter name. Accepted names: certification, certifications, company, contactLanguage, contactLocation, currentCompany, department, departmentAndFunction, education, experience, fullName, function, keyword, language, linkedin, location, name, pastCompany, profileBadge, seniority, skill, skills, socialMedia, socialMediaFollower, socialMediaLink, socialProfile, title. Any other name is rejected. Names take {"any"|"all": {"include": [...], "exclude": [...]}}, with the any/all object INSIDE the filter name rather than at the top of contact. Free-text search goes through keyword, which takes {"any"|"all": {"include"|"exclude": {"content": ["..."], "sources": [{"mode": "WORD"|"SMART"|"STRICT", "source": "HEADLINE"|"SUMMARY"|"ORGANIZATION"|"SKILL"|"WORK_HISTORY_DESCRIPTION"|"EDUCATION_DESCRIPTION"|"CERTIFICATION"|"PUBLICATION"|"PATENT"|"AWARD"|"COURSE"|"PROJECTS"|"VOLUNTEERING"|"LANGUAGE_SKILL"|"TEST_SCORE"}]}}}, for example {"keyword": {"any": {"include": {"content": ["engineer"], "sources": [{"mode": "SMART", "source": "HEADLINE"}]}}}}.' type: object lists: additionalProperties: true description: AI Ark saved-list filter expression. type: object page: default: 0 description: Zero-based result page. minimum: 0 type: integer preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer size: default: 10 description: Maximum people to return on this page. maximum: 100 minimum: 1 type: integer title: People Search - AI Ark input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: Normalized people and page metadata, or null when no people matched. oneOf: - type: 'null' - additionalProperties: false properties: page: description: Zero-based page number returned by the source. minimum: 0 type: integer people: description: People returned on this page. items: properties: birthDate: description: Birthday as published on the profile, in YYYY-MM-DD form. LinkedIn lets a member hide the year, and the source encodes that as the placeholder year 1600 - treat the year as unknown when it reads 1600 rather than as a real date. type: string careerStartUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer city: description: Location city. type: string companyAcquisitionCount: description: Number of acquisitions the source records for the current company. minimum: 0 type: integer companyAcquisitions: description: Acquisitions the source records for the current company, with the role telling you which side the company was on. items: properties: announcedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer imageKey: description: The source's internal image key for the counterparty. It is a bare key, not a URL. type: string name: description: Counterparty organization name. type: string recordId: description: The source's own slug for the counterparty organization. type: string role: description: The current company's side of the deal, for example acquiree. type: string type: object type: array companyAddress: description: Current company headquarters address as published by the source. type: string companyCity: description: Current company headquarters city. type: string companyContinent: description: Current company headquarters continent. type: string companyCountry: description: Current company headquarters country. type: string companyCrunchbaseUrl: description: Current company's Crunchbase URL. format: uri type: string companyDescription: description: Current company description. type: string companyDomain: description: Current company domain. type: string companyDomainLtd: description: The source's second copy of the current company's domain. Usually identical to companyDomain; it can differ when the source resolves a redirect or a country domain differently, so compare the two rather than assuming they match. type: string companyEmployeeCount: description: Estimated employees at the current company. minimum: 0 type: integer companyEmployeeRangeMin: description: Lower bound of the current company's published employee range. minimum: 0 type: integer companyFacebookUrl: description: Current company's canonical Facebook URL. format: uri type: string companyFoundedYear: description: Year the current company was founded. type: integer companyId: description: The source's own record identifier for the current company, exposed so you can trace a result back to the record it came from. type: string companyImage: description: 'Current company logo URL. This is a SIGNED, EXPIRING image-proxy URL - the path carries an exp: epoch roughly five days out - so fetch and store the image promptly rather than storing this URL.' format: uri type: string companyIndustries: description: Additional industries for the current company. items: type: string type: array companyIndustry: description: Current company's primary industry. type: string companyKeywords: description: Keywords describing the current company. items: type: string type: array companyLanguages: description: Languages the current company publishes in. items: type: string type: array companyLatitude: description: Current company headquarters latitude in decimal degrees. type: number companyLegalName: description: Current company's registered legal name. type: string companyLinkedinUrl: description: Current company's canonical LinkedIn URL. format: uri type: string companyLocations: description: Every office the source lists for the current company, including the headquarters already reported in the companyCountry/companyCity fields. items: properties: address: description: Office address as published by the source. type: string city: description: Office city. type: string continent: description: Office continent. type: string country: description: Office country. type: string latitude: description: Office latitude in decimal degrees. type: number longitude: description: Office longitude in decimal degrees. type: number postalCode: description: Office postal code. type: string state: description: Office state or region. type: string street: description: Office street or neighbourhood line. type: string type: object type: array companyLongitude: description: Current company headquarters longitude in decimal degrees. type: number companyNaics: description: NAICS codes for the current company. items: type: string type: array companyName: description: Current company name. type: string companyOverview: description: Longer overview of the current company. Overlaps companyDescription but is a separately maintained blurb and is often longer or more current. type: string companyPostalCode: description: Current company headquarters postal code. type: string companyRevenueMax: description: Upper bound of the current company's estimated annual revenue in USD. minimum: 0 type: integer companyRevenueMin: description: Lower bound of the current company's estimated annual revenue in USD. minimum: 0 type: integer companyRevenueRange: description: The same annual revenue estimate as a single hyphenated range string, for example 500000000-1000000000. It duplicates companyRevenueMin and companyRevenueMax; use those for arithmetic. type: string companySeoDescription: description: The meta description the source scraped from the current company's website. It is site copy, not the source's own writing, so it may be in another language or out of date. type: string companyStartUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer companyState: description: Current company headquarters state or region. type: string companyStreet: description: Current company headquarters street or neighbourhood line. type: string companySubOrganizations: description: The source's own record identifiers for the current company's sub-organizations, exposed so you can look each one up in the company endpoints. items: type: string type: array companyTechnologies: description: Technologies detected on the current company's web presence. items: properties: category: description: Technology category. type: string name: description: Technology name. type: string type: object type: array companyTwitterUrl: description: Current company's canonical X (Twitter) URL. format: uri type: string companyType: description: Current company's organization type. type: string companyUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer companyWebsiteUrl: description: Current company website URL. format: uri type: string connectionCount: description: LinkedIn connection count. minimum: 0 type: integer country: description: Location country. type: string creator: description: Whether the profile is in LinkedIn creator mode. type: boolean departments: description: Departments the current role belongs to. items: type: string type: array educations: description: Education history listed on the profile. items: properties: degreeName: description: Degree earned. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer fieldOfStudy: description: Field of study. type: string grade: description: Grade as published on the profile. type: string schoolId: description: 'The source''s own record identifier for the school. Untyped passthrough: the source returns null on the profiles observed so far, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' schoolImage: description: 'The school logo as the source returns it. Untyped passthrough: the source returns null on the profiles observed so far, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' schoolName: description: School name. type: string schoolUrl: description: Canonical school page URL. format: uri type: string startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer type: object type: array experience: description: Work history grouped by company, most recent first. items: properties: companyEmployeeRangeMax: description: Upper bound of this company's published employee range. minimum: 0 type: integer companyEmployeeRangeMin: description: Lower bound of this company's published employee range. minimum: 0 type: integer companyId: description: The source's own record identifier for this company, exposed so you can trace a result back to the record it came from. type: string companyImage: description: 'Company logo URL. This is a SIGNED, EXPIRING image-proxy URL - the path carries an exp: epoch roughly five days out - so fetch and store the image promptly rather than storing this URL.' format: uri type: string companyLinkedinUrl: description: Canonical LinkedIn URL for this company. format: uri type: string companyName: description: Company name for this block of work history. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer positions: description: Individual roles held at this company. items: properties: companyName: description: Company name as published on the role. type: string description: description: Role description. type: string employmentType: description: Employment type, for example Full-time. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer location: description: Role location. type: string startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer title: description: Role title. type: string type: object type: array startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer type: object type: array facebookUrl: description: Canonical Facebook profile URL. format: uri type: string firstName: description: Person's first name. type: string followable: description: 'Whether the profile can be followed without connecting. Untyped passthrough: the source returns null for most profiles, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' followerCount: description: LinkedIn follower count. minimum: 0 type: integer fullName: description: Person's full name. minLength: 1 type: string functions: description: Job functions the current role covers. items: type: string type: array githubUrl: description: Canonical GitHub profile URL. format: uri type: string headline: description: Professional profile headline. type: string hiring: description: Whether the profile is flagged as hiring. type: boolean image: description: 'Profile photo URL. This is a SIGNED, EXPIRING image-proxy URL - the path carries an exp: epoch roughly five days out - so fetch and store the image promptly rather than storing this URL.' format: uri type: string industry: description: Industry the person works in. type: string influencer: description: Whether the profile carries a LinkedIn influencer badge. type: boolean lastName: description: Person's last name. type: string linkedinHandle: description: LinkedIn public profile handle, the trailing segment of the profile URL. type: string linkedinUrl: description: Canonical LinkedIn profile URL. format: uri type: string location: description: Formatted location. type: string locationPosition: description: 'Coordinates for the person''s location as the source returns them. Untyped passthrough: the source returns null for most profiles, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' locationShort: description: Shorter form of the same location, usually city and state without country or continent. It duplicates part of location. type: string middleName: description: Person's middle name. type: string networkInfluencer: description: The same influencer flag as the badge above, carried on the source's network statistics instead of its badge block. Expected to agree with influencer; compare them if the distinction matters to you. type: boolean openToWork: description: Whether the profile is flagged open to work. type: boolean premium: description: Whether the profile carries a LinkedIn premium badge. type: boolean previousJobTitles: description: 'Job titles the person held before the current one, as the source returns them. Untyped passthrough: the source returns null for most profiles, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it. The experience array carries the same history in a typed form.' primaryLanguage: description: Primary profile language code. type: string primaryLanguageCountry: description: Country code paired with the primary profile language, for example US. type: string profileBackground: description: 'The profile background or cover image as the source returns it. Untyped passthrough: the source returns null for most profiles, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' profileId: description: The source's own record identifier for this person, exposed so you can trace a result back to the record it came from. type: string profileLanguages: description: 'Languages the person lists on the profile, as the source returns them. Untyped passthrough: the source returns null for most profiles, so its populated shape is not yet proven and this field carries whatever the source sends without reshaping it.' seniority: description: Seniority level inferred for the current role. type: string skills: description: Skills listed on the profile. items: type: string type: array state: description: Location state or region. type: string subDepartments: description: Sub-departments the current role belongs to. items: type: string type: array summary: description: Profile summary or about section. type: string supportedLocales: description: Every locale the profile is available in. The first entry usually repeats primaryLanguage and primaryLanguageCountry. items: properties: country: description: Country code for this locale. type: string language: description: Language code for this locale. type: string type: object type: array title: description: Current job title. type: string titleStartUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer twitterUrl: description: Canonical X (Twitter) profile URL. format: uri type: string updatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: integer verified: description: Whether LinkedIn has verified the profile. type: boolean required: - fullName - linkedinUrl type: object type: array size: description: Configured page size. minimum: 0 type: integer total: description: Total matching people. minimum: 0 type: integer totalPages: description: Total result pages. minimum: 0 type: integer required: - people - page - size - total - totalPages type: object found: description: Whether the search returned at least one person. type: boolean required: - found - data title: People Search - AI Ark output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - AI Ark tags: - People Search x-mint: href: /api-reference/people-search/ai-ark x-payment-info: price: currency: USD max: '0.840000' min: '0.000000' mode: dynamic protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: currency: USD max: '0.840000' min: '0.001000' minimumUsd: '0.001000' mode: dynamic quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: currency: USD max: '0.840000' min: '0.000000' minimumUsd: null mode: dynamic quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.crustdata_v3: post: description: 'Find up to 100 professional profiles by company domain and title keywords. **Price:** \$144.00 per 1,000 requests (flat per request - same cost regardless of results returned). **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - Crustdata v3 pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_crustdata_v3 parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: companyDomain: posthog.com limit: 1 titleKeywords: engineer schema: additionalProperties: false example: companyDomain: posthog.com limit: 1 titleKeywords: engineer properties: companyDomain: description: Company domain without a path. minLength: 1 type: string country: minLength: 1 type: string fuzzyTitle: default: true type: boolean limit: default: 3 maximum: 100 minimum: 1 type: integer preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer profileKeywords: oneOf: - minLength: 1 type: string - items: minLength: 1 type: string minItems: 1 type: array requireVerifiedEmail: default: false type: boolean seniority: oneOf: - minLength: 1 type: string - items: minLength: 1 type: string minItems: 1 type: array titleKeywords: oneOf: - minLength: 1 type: string - items: minLength: 1 type: string minItems: 1 type: array required: - companyDomain - titleKeywords title: People Search - Crustdata v3 input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: oneOf: - type: 'null' - additionalProperties: false properties: hasMore: description: True when more profiles exist beyond this page. type: boolean profiles: description: Matching professional profiles. items: properties: allEmployers: description: Every employer on the profile, current and past. Duplicates the contents of currentEmployers and pastEmployers in one combined list. items: properties: businessEmailVerified: description: True when a business email at this employer has been verified. type: boolean companyDomain: description: Employer website domain. type: string companyHeadcount: description: Latest observed employee count at the employer. type: integer companyHeadcountRange: description: Employer headcount band, e.g. 51-200. type: string companyHeadquartersCountry: description: Country of the employer's headquarters. type: string companyHqLocation: description: Full headquarters location of the employer. type: string companyHqLocationAddressComponents: description: The employer's headquarters location split into address components (city, county, state, country). Restates companyHqLocation in parts. items: type: string type: array companyId: description: Crustdata company identifier for this employer, accepted by the Company Enrichment endpoint. type: string companyIndustries: description: All LinkedIn industries listed for the employer. items: type: string type: array companyIndustry: description: Primary LinkedIn industry of the employer. type: string companyLinkedinId: description: LinkedIn's own numeric identifier for the employer company page. type: string companyLinkedinUrl: description: Employer LinkedIn company page URL. format: uri type: string companyName: description: Employer name. type: string companyType: description: Employer company type, e.g. Privately Held or Public Company. type: string companyWebsite: description: Employer website URL. format: uri type: string description: description: Role description as written on the profile. type: string employmentType: description: Employment type, e.g. Full-time or Contract. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. End of the role. type: integer functionCategory: description: Job function category, e.g. Engineering or Sales. type: string linkedinId: description: LinkedIn's own numeric identifier for the employer page. Crustdata returns the same value as companyLinkedinId on this record. type: string location: description: Location of the role. type: string positionId: description: Crustdata identifier for this specific position record. type: string primaryEmployer: description: True when this is the profile's primary listed position. type: boolean seniority: description: Seniority level of the role, e.g. Entry Level or Owner / Partner. type: string startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Start of the role. type: integer title: description: Job title held at this employer. type: string updatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time this employment record was refreshed. type: integer yearsAtCompany: description: Whole years spent at this employer. type: integer yearsAtCompanyRange: description: Human-readable tenure band, e.g. 3 to 5 years. type: string type: object type: array certifications: description: Certifications listed on the profile. items: properties: certificationId: description: Crustdata identifier for this certification record. type: string expiresUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. When the certification expires. type: integer issuedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. When the certification was issued. type: integer issuer: description: Organization that issued the certification. type: string issuerLinkedinId: description: LinkedIn's own numeric identifier for the issuing organization page. type: string name: description: Certification name. type: string url: description: Link to the certification. format: uri type: string type: object type: array city: description: City of residence. type: string connectionCount: description: Number of LinkedIn connections. type: integer contactUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time the contact section was refreshed. type: integer continent: description: Continent of residence. type: string country: description: Country of residence. type: string currentEmployers: description: Positions the person currently holds. items: properties: businessEmailVerified: description: True when a business email at this employer has been verified. type: boolean companyDomain: description: Employer website domain. type: string companyHeadcount: description: Latest observed employee count at the employer. type: integer companyHeadcountRange: description: Employer headcount band, e.g. 51-200. type: string companyHeadquartersCountry: description: Country of the employer's headquarters. type: string companyHqLocation: description: Full headquarters location of the employer. type: string companyHqLocationAddressComponents: description: The employer's headquarters location split into address components (city, county, state, country). Restates companyHqLocation in parts. items: type: string type: array companyId: description: Crustdata company identifier for this employer, accepted by the Company Enrichment endpoint. type: string companyIndustries: description: All LinkedIn industries listed for the employer. items: type: string type: array companyIndustry: description: Primary LinkedIn industry of the employer. type: string companyLinkedinId: description: LinkedIn's own numeric identifier for the employer company page. type: string companyLinkedinUrl: description: Employer LinkedIn company page URL. format: uri type: string companyName: description: Employer name. type: string companyType: description: Employer company type, e.g. Privately Held or Public Company. type: string companyWebsite: description: Employer website URL. format: uri type: string description: description: Role description as written on the profile. type: string employmentType: description: Employment type, e.g. Full-time or Contract. type: string functionCategory: description: Job function category, e.g. Engineering or Sales. type: string linkedinId: description: LinkedIn's own numeric identifier for the employer page. Crustdata returns the same value as companyLinkedinId on this record. type: string location: description: Location of the role. type: string positionId: description: Crustdata identifier for this specific position record. type: string primaryEmployer: description: True when this is the profile's primary listed position. type: boolean seniority: description: Seniority level of the role, e.g. Entry Level or Owner / Partner. type: string startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Start of the role. type: integer title: description: Job title held at this employer. type: string updatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time this employment record was refreshed. type: integer yearsAtCompany: description: Whole years spent at this employer. type: integer yearsAtCompanyRange: description: Human-readable tenure band, e.g. 3 to 5 years. type: string type: object type: array educationBackground: description: 'Education history exactly as Crustdata returns it. Untyped passthrough: the structure ships verbatim and is not validated, because it was empty for every profile we captured.' educationUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time the education section was refreshed. type: integer emails: description: Email addresses found for the person. items: type: string type: array employerUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time the employment section was refreshed. type: integer flagshipProfileUrl: description: LinkedIn flagship profile URL. Usually the same value as linkedinUrl; Crustdata returns both and they can differ when the profile has a vanity URL. format: uri type: string followerCount: description: Number of LinkedIn followers. type: integer headline: description: LinkedIn headline. type: string honors: description: 'Honors and awards exactly as Crustdata returns them. Untyped passthrough: the structure ships verbatim and is not validated, because it was empty for every profile we captured.' image: description: Profile picture URL. format: uri type: string indexedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. When Crustdata last indexed the record for search, which is usually just after recordUpdatedUtc. type: integer languages: description: Languages listed on the profile. items: type: string type: array lastName: description: Family name of the person. type: string linkedinUrl: description: LinkedIn profile URL. format: uri type: string name: description: Full name of the person. type: string openToCards: description: 'LinkedIn open-to cards (open to work, hiring, providing services) exactly as Crustdata returns them. Untyped passthrough: the structure ships verbatim and is not validated, because it was empty for every profile we captured.' pastEmployers: description: Positions the person previously held. items: properties: businessEmailVerified: description: True when a business email at this employer has been verified. type: boolean companyDomain: description: Employer website domain. type: string companyHeadcount: description: Latest observed employee count at the employer. type: integer companyHeadcountRange: description: Employer headcount band, e.g. 51-200. type: string companyHeadquartersCountry: description: Country of the employer's headquarters. type: string companyHqLocation: description: Full headquarters location of the employer. type: string companyHqLocationAddressComponents: description: The employer's headquarters location split into address components (city, county, state, country). Restates companyHqLocation in parts. items: type: string type: array companyId: description: Crustdata company identifier for this employer, accepted by the Company Enrichment endpoint. type: string companyIndustries: description: All LinkedIn industries listed for the employer. items: type: string type: array companyIndustry: description: Primary LinkedIn industry of the employer. type: string companyLinkedinId: description: LinkedIn's own numeric identifier for the employer company page. type: string companyLinkedinUrl: description: Employer LinkedIn company page URL. format: uri type: string companyName: description: Employer name. type: string companyType: description: Employer company type, e.g. Privately Held or Public Company. type: string companyWebsite: description: Employer website URL. format: uri type: string description: description: Role description as written on the profile. type: string employmentType: description: Employment type, e.g. Full-time or Contract. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. End of the role. type: integer functionCategory: description: Job function category, e.g. Engineering or Sales. type: string linkedinId: description: LinkedIn's own numeric identifier for the employer page. Crustdata returns the same value as companyLinkedinId on this record. type: string location: description: Location of the role. type: string positionId: description: Crustdata identifier for this specific position record. type: string primaryEmployer: description: True when this is the profile's primary listed position. type: boolean seniority: description: Seniority level of the role, e.g. Entry Level or Owner / Partner. type: string startUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Start of the role. type: integer title: description: Job title held at this employer. type: string updatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time this employment record was refreshed. type: integer yearsAtCompany: description: Whole years spent at this employer. type: integer yearsAtCompanyRange: description: Human-readable tenure band, e.g. 3 to 5 years. type: string type: object type: array personId: description: Crustdata identifier for this person. type: string profileLanguage: description: Language the profile itself is written in. type: string profilePictureUrl: description: Profile photo URL as LinkedIn serves it, query string intact because LinkedIn signs these URLs. The image field carries Crustdata's cached copy of the same photo, which does not expire. format: uri type: string profileUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time the profile section was refreshed. type: integer recentlyChangedJobs: description: True when the person changed employer recently. type: boolean recordUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. When Crustdata last wrote the record. Differs from updatedUtc, which reports the profile's own last-updated stamp. type: integer region: description: Region string as published on the profile. type: string regionAddressComponents: description: The region string split into address components (city, county, state, country). Restates region in parts. items: type: string type: array skills: description: Skills listed on the profile. items: type: string type: array state: description: State or province of residence. type: string summary: description: Profile summary or About section text. type: string twitterHandle: description: X (Twitter) handle listed on the profile. type: string updatedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Last time any part of this profile record was refreshed. type: integer yearsOfExperience: description: Total whole years of professional experience. type: integer yearsOfExperienceRange: description: Human-readable experience band, e.g. More than 10 years. type: string required: - name type: object type: array totalCount: description: Total number of profiles matching the search. minimum: 0 type: integer required: - profiles type: object found: description: False when the search matched no professional profiles. type: boolean required: - found - data title: People Search - Crustdata v3 output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - Crustdata v3 tags: - People Search x-mint: href: /api-reference/people-search/crustdata-v3 x-payment-info: price: amount: '0.144000' currency: USD mode: fixed protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: amount: '0.144000' currency: USD minimumUsd: '0.001000' mode: fixed quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: amount: '0.144000' currency: USD minimumUsd: null mode: fixed quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.fullenrich: post: description: 'Prospect FullEnrich''s person database by title, seniority, function, skill, language and location, plus any current or past employer firmographic. Every row carries the person''s employer record. Billed per person returned. **Price:** billed per result - \$25.20 per 1,000 results, capped at \$2,520.00 per 1,000 requests. **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - FullEnrich pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_fullenrich parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: currentCompanyDomains: - exact_match: true value: stripe.com limit: 1 schema: additionalProperties: false example: currentCompanyDomains: - exact_match: true value: stripe.com limit: 1 minProperties: 1 properties: currentCompanyDomains: description: 'Filter by current employer domain. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyFoundedYears: description: 'Filter by current employer founding year. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyHeadcounts: description: 'Filter by current employer headcount band. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyHeadquarters: description: 'Filter by current employer headquarters location. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyIds: description: 'Filter by FullEnrich company id of the current employer. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyIndustries: description: 'Filter by current employer industry. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyLinkedinUrls: description: 'Filter by current employer LinkedIn URL. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyNames: description: 'Filter by current employer name. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanySpecialties: description: 'Filter by a current employer specialty. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentCompanyTypes: description: 'Filter by current employer ownership type. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentPositionJobFunctions: description: 'Filter by current job function. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentPositionSeniorityLevel: description: 'Filter by seniority, e.g. Owner, Founder, C-level, VP, Director, Manager. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentPositionSubFunctions: description: 'Filter by current job sub-function. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentPositionTitles: description: 'Filter by current job title. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array currentPositionYearsIn: description: 'Filter by years spent in the current position. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array cursor: description: Cursor from a previous response's nextCursor. Works at any depth, including past the 10000 offset ceiling. type: string limit: default: 10 description: Rows to return on this page, up to FullEnrich's maximum of 100. Every row returned is billed. maximum: 100 minimum: 1 type: integer offset: default: 0 description: Rows to skip. FullEnrich caps offset at 10000; past that, page with cursor. minimum: 0 type: integer pastCompanyDomains: description: 'Filter by the domain of a past employer. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array pastCompanyNames: description: 'Filter by an employer the person worked at before. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array pastPositionTitles: description: 'Filter by a job title the person held before. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personIds: description: 'Filter by FullEnrich person id. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personLanguages: description: 'Filter by a language the person speaks. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personLinkedinUrls: description: 'Filter by person LinkedIn URL. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personLocations: description: 'Filter by the person''s city, region or country. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personNames: description: 'Filter by person name. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array personSkills: description: 'Filter by a skill the person lists. Each entry is an object taking a `value` string and an optional `exact_match` boolean, e.g. [{"value": "stripe.com", "exact_match": true}]. A bare string is rejected.' items: additionalProperties: true properties: exact_match: description: Require an exact match rather than a fuzzy one. type: boolean value: description: The value to match. type: string type: object type: array preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer title: People Search - FullEnrich input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: One page of matching records plus FullEnrich's paging state. oneOf: - type: 'null' - additionalProperties: false properties: nextCursor: description: Cursor for the next page, or null when this lane is complete. Send it back as cursor. type: - string - 'null' offset: description: Rows skipped before this page. type: integer people: description: Matching people, each with their current employer's firmographic record. Email addresses and phone numbers are not included; FullEnrich reveals those through its enrichment endpoints. items: properties: city: description: City the person is in. type: string company: description: The person's current employer, with FullEnrich's full firmographic record. properties: companyId: description: FullEnrich's own company identifier. type: string companyType: description: Ownership type, e.g. Public Company, Privately Held. type: string description: description: Company description. type: string domain: description: Primary company domain. type: string foundedYear: description: Year the company was founded. Zero when FullEnrich holds none. type: integer headcount: description: Employees FullEnrich currently counts. type: integer headcountRange: description: Employee headcount band, e.g. 5001-10000. type: string headquarters: description: Headquarters address. properties: city: description: City. type: string country: description: Country name. type: string countryCode: description: ISO 3166-1 alpha-2 country code. type: string line1: description: First address line. type: string line2: description: Second address line, carrying city, region, postal code and country. type: string region: description: State or region. type: string type: object image: description: Company logo URL. format: uri type: string industry: description: Main industry. type: string linkedinFollowers: description: LinkedIn follower count. type: integer linkedinHandle: description: Company LinkedIn vanity handle. type: string linkedinId: description: Company LinkedIn numeric id. type: string linkedinUrl: description: Company LinkedIn page URL. format: uri type: string name: description: Company name. type: string offices: description: Every other office FullEnrich holds for the company. items: properties: line1: description: First address line. type: string line2: description: Second address line, carrying city, region, postal code and country. type: string type: object type: array specialties: description: Specialties the company lists for itself. items: type: string type: array website: description: Company website URL. format: uri type: string type: object country: description: Country name. type: string countryCode: description: ISO 3166-1 alpha-2 country code. type: string description: description: Profile summary text. type: string educations: description: Education history. items: properties: degree: description: Degree earned. type: string endUtc: description: UTC epoch timestamp in seconds (Unix time) study ended. Multiply by 1000 for a JS Date in milliseconds. type: number schoolName: description: School name. type: string startUtc: description: UTC epoch timestamp in seconds (Unix time) study started. Multiply by 1000 for a JS Date in milliseconds. type: number required: - schoolName type: object type: array firstName: description: First name. type: string fullName: description: Person's full name. type: string headline: description: LinkedIn headline. type: string isCurrent: description: True while FullEnrich treats the role as current. type: boolean jobStartUtc: description: UTC epoch timestamp in seconds (Unix time) the current role started. Multiply by 1000 for a JS Date in milliseconds. type: number jobTitle: description: Current job title. type: string languages: description: Languages the person speaks. items: properties: language: description: Language name. type: string proficiency: description: Proficiency band, e.g. FULL_PROFESSIONAL. type: string required: - language type: object type: array lastName: description: Last name. type: string linkedinConnections: description: LinkedIn connection count. type: integer linkedinHandle: description: LinkedIn vanity handle. type: string linkedinId: description: LinkedIn numeric member id. type: string linkedinUrl: description: LinkedIn profile URL. format: uri type: string personId: description: FullEnrich's own person identifier. type: string region: description: State or region. type: string seniority: description: Seniority band for the current role, e.g. Manager, C-level. type: string skills: description: Skills the person lists. items: type: string type: array required: - fullName type: object type: array total: description: Rows matching the filters across all pages. type: integer required: - people type: object found: description: False when nothing matched the filters. type: boolean required: - found - data title: People Search - FullEnrich output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - FullEnrich tags: - People Search x-mint: href: /api-reference/people-search/fullenrich x-payment-info: price: currency: USD max: '2.520000' min: '0.000000' mode: dynamic protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: currency: USD max: '2.520000' min: '0.001000' minimumUsd: '0.001000' mode: dynamic quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: currency: USD max: '2.520000' min: '0.000000' minimumUsd: null mode: dynamic quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.lusha: post: description: 'Prospect Lusha''s contact database by department, seniority, job title, location, company size, industry and technology. One flat price per page; reveal a contact''s email and phone with Person Enrichment - Lusha. **Price:** \$84.00 per 1,000 requests (flat per request - same cost regardless of results returned). **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - Lusha pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_lusha parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: filters: companies: include: names: - PostHog contacts: include: departments: - Engineering & Technical pages: page: 0 size: 10 schema: additionalProperties: false example: filters: companies: include: names: - PostHog contacts: include: departments: - Engineering & Technical pages: page: 0 size: 10 properties: excludeDnc: description: Exclude contacts whose phone numbers are all marked do-not-call. type: boolean filters: additionalProperties: true description: 'Prospecting filters. Two keys are accepted, contacts and companies, and each takes an include and an exclude object. contacts.include and contacts.exclude accept departments, seniority, locations, existing_data_points and signals; companies.include and companies.exclude accept names, locations, sizes, revenues, technologies, intentTopics, mainIndustriesIds, subIndustriesIds, naicsCodes and sicCodes. Locations are objects such as {"country": "United States"}; sizes and revenues are ranges such as {"min": 200, "max": 500}. Example: {"companies": {"include": {"names": ["PostHog"]}}, "contacts": {"include": {"departments": ["Engineering & Technical"]}}}.' properties: companies: additionalProperties: true description: Company-level include and exclude filters. type: object contacts: additionalProperties: true description: Person-level include and exclude filters. type: object type: object includePartialContact: description: Include contacts Lusha holds only partial information for. Defaults to true upstream. type: boolean pages: additionalProperties: false description: Which page of results to return. Lusha charges one flat price per page whatever its size. properties: page: default: 0 description: Zero-based page number. minimum: 0 type: integer size: default: 10 description: Contacts per page. Lusha rejects a size below 10 or above 100. maximum: 100 minimum: 10 type: integer type: object preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer required: - filters title: People Search - Lusha input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: One page of matching contacts plus its paging counters. oneOf: - type: 'null' - additionalProperties: false properties: currentPage: description: Zero-based page number this response holds. type: integer pageLength: description: Contacts returned on this page. type: integer people: description: Contacts on this page. Email addresses and phone numbers are not included here; reveal them with Person Enrichment - Lusha. items: properties: available: description: What Lusha holds for this contact and would return on reveal. Every flag is a boolean; privateEmail can also come back as a redaction marker. properties: companyCity: description: Employer city is available. type: boolean companyCountry: description: Employer country is available. type: boolean companyEmployeesCount: description: Employer headcount is available. type: boolean companyFunding: description: Employer funding data is available. type: boolean companyIntent: description: Employer buying-intent data is available. type: boolean companyMainIndustry: description: Employer top-level industry is available. type: boolean companyRevenue: description: Employer revenue is available. type: boolean companySubIndustry: description: Employer sub-industry is available. type: boolean companyTechnologies: description: Employer technology stack is available. type: boolean contactLocation: description: The person's location is available. type: boolean department: description: A department is available. type: boolean directPhone: description: A direct dial is available. type: boolean emails: description: Any email address is available. type: boolean mobilePhone: description: A mobile number is available. type: boolean phones: description: Any phone number is available. type: boolean privateEmail: description: A personal email address is available. Lusha redacts this flag on some plans, in which case it is a string marker rather than a boolean. type: - boolean - string seniority: description: A seniority band is available. type: boolean socialLink: description: A social profile link is available. type: boolean workEmail: description: A work email address is available. type: boolean type: object companyDescription: description: Employer description. type: string companyDomain: description: Fully qualified host for the employer's website. type: string companyId: description: Lusha's own company identifier for the employer. type: string companyName: description: Employer name. type: string contactId: description: Lusha's contact identifier for this search row. type: string fullName: description: Person's full name. type: string image: description: Employer logo URL. format: uri type: string isShown: description: True when this contact has already been revealed on the Lusha account. type: boolean jobTitle: description: Current job title. type: string personId: description: Lusha's own person identifier. type: string required: - fullName type: object type: array totalResults: description: Total contacts matching the filters across all pages. type: integer required: - people type: object found: description: False when no contact matched the filters. type: boolean required: - found - data title: People Search - Lusha output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - Lusha tags: - People Search x-mint: href: /api-reference/people-search/lusha x-payment-info: price: amount: '0.084000' currency: USD mode: fixed protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: amount: '0.084000' currency: USD minimumUsd: '0.001000' mode: fixed quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: amount: '0.084000' currency: USD minimumUsd: null mode: fixed quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.peopledatalabs: post: description: 'Search People Data Labs'' person dataset with SQL or an Elasticsearch query. Results carry the professional and firmographic record plus availability flags for contact data; pull the actual email and phone with Person Enrichment - People Data Labs. Billed per profile returned. **Price:** billed per result - \$168.00 per 1,000 results, capped at \$9,912.00 per 1,000 requests. **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - People Data Labs pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_peopledatalabs parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: limit: 1 sql: SELECT * FROM person WHERE job_company_website = 'posthog.com' schema: additionalProperties: false anyOf: - required: - sql - required: - query example: limit: 1 sql: SELECT * FROM person WHERE job_company_website = 'posthog.com' properties: dataInclude: description: Comma-separated People Data Labs fields to include, or a leading - list to exclude. Projection changes the payload only; billing still follows profiles returned. type: string dataset: description: People Data Labs dataset to search, when your plan exposes more than one. type: string limit: default: 10 description: Maximum profiles to return. Every profile returned is billed, so start at 1 to check a query and read total before asking for more. maximum: 59 minimum: 1 type: integer preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer query: additionalProperties: true description: 'Elasticsearch-style query over the People Data Labs person dataset, e.g. {"bool": {"must": [{"term": {"job_company_website": "posthog.com"}}]}}. Send this or sql, never both.' type: object sql: description: People Data Labs SQL, in the form SELECT * FROM person WHERE ... . String literals take single quotes, only SELECT * is supported, and field names must be real People Data Labs person fields including nested subfields such as experience.title.name. Do not include a LIMIT clause; People Data Labs rejects it. Use limit instead. Send this or query, never both. minLength: 1 type: string titlecase: description: Return text in title case instead of People Data Labs' lowercase default. type: boolean title: People Search - People Data Labs input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: The matching profiles plus the total the query matched. People Data Labs paginates with a scroll token that is not exposed here, so a call returns one page and total tells you how much is behind it. oneOf: - type: 'null' - additionalProperties: false properties: datasetVersion: description: Version of the People Data Labs dataset these records came from. type: string people: description: Matching person profiles, up to limit. items: properties: activityScore: description: People Data Labs' qualitative score for how recently the profile showed activity. type: string available: description: What People Data Labs holds for this person but does not return in search. Each flag is true when Person Enrichment - People Data Labs would return that field for this profile. properties: birthDate: description: A birth date is available. type: boolean birthYear: description: A birth year is available. type: boolean facebookId: description: A Facebook numeric id is available. type: boolean facebookUrl: description: A Facebook profile URL is available. type: boolean facebookUsername: description: A Facebook handle is available. type: boolean githubUrl: description: A GitHub profile URL is available. type: boolean githubUsername: description: A GitHub handle is available. type: boolean locationAddressLine2: description: A second address line is available. type: boolean locationStreetAddress: description: The current street address is available. type: boolean mobilePhone: description: A mobile phone number is available. type: boolean personalEmails: description: Personal email addresses are available. type: boolean phoneNumbers: description: Phone numbers are available. type: boolean recommendedPersonalEmail: description: A recommended personal email address is available. type: boolean streetAddresses: description: Street addresses are available. type: boolean twitterUrl: description: An X (Twitter) profile URL is available. type: boolean twitterUsername: description: An X (Twitter) handle is available. type: boolean workEmail: description: A work email address is available. type: boolean type: object companyAddressLine2: description: Second line of the current employer's headquarters address. type: string companyContinent: description: Current employer headquarters continent. type: string companyFacebookUrl: description: Current employer Facebook page URL. format: uri type: string companyFounded: description: Year the current employer was founded. type: integer companyGeo: description: Current employer headquarters coordinates as "lat,lon". type: string companyId: description: People Data Labs company id for the current employer. type: string companyIndustry: description: Current employer industry. type: string companyIndustryV2: description: Current employer industry on People Data Labs' newer taxonomy. type: string companyLinkedinId: description: Current employer LinkedIn numeric id. type: string companyLinkedinUrl: description: Current employer LinkedIn page URL. format: uri type: string companyLocality: description: Current employer headquarters city. type: string companyLocationCountry: description: Current employer headquarters country. type: string companyLocationName: description: Current employer headquarters as one display string. type: string companyMetro: description: Current employer headquarters metro area. type: string companyName: description: Current employer name. type: string companyPostalCode: description: Current employer headquarters postal code. type: string companyRegion: description: Current employer headquarters state or region. type: string companySize: description: Current employer headcount band. type: string companyStreetAddress: description: Current employer headquarters street address. type: string companyTwitterUrl: description: Current employer X (Twitter) profile URL. format: uri type: string companyWebsite: description: Current employer website domain. type: string continent: description: Continent. type: string countries: description: Every country associated with the person. items: type: string type: array country: description: Country. type: string education: description: Education history. items: properties: degrees: description: Degrees earned. items: type: string type: array endDate: description: When study ended. type: string gpa: description: Grade point average, when published. type: number majors: description: Majors studied. items: type: string type: array minors: description: Minors studied. items: type: string type: array schoolName: description: School name. type: string schoolType: description: School type. type: string schoolWebsite: description: School website domain. type: string startDate: description: When study started. type: string type: object type: array emails: description: One entry per email address People Data Labs holds for the person. Search returns the kind only; the address itself comes from Person Enrichment - People Data Labs. items: properties: type: description: Address kind, e.g. professional or personal. type: string type: object type: array experience: description: Work history. items: properties: companyId: description: People Data Labs company id for the employer. type: string companyIndustry: description: Employer industry. type: string companyLinkedinUrl: description: Employer LinkedIn page URL. format: uri type: string companyName: description: Employer name. type: string companySize: description: Employer headcount band. type: string companyWebsite: description: Employer website domain. type: string endDate: description: When the role ended, absent while the role is current. type: string isPrimary: description: True for the role People Data Labs treats as current. type: boolean startDate: description: 'When the role started: YYYY, YYYY-MM or YYYY-MM-DD.' type: string title: description: Job title held. type: string titleLevels: description: Seniority levels for the title. items: type: string type: array titleRole: description: Normalized role for the title. type: string type: object type: array firstName: description: First name. type: string fullName: description: Person's full name. type: string geo: description: Coordinates as "lat,lon". type: string industry: description: Industry the person works in. type: string interests: description: Interests the person lists. items: type: string type: array jobChangedUtc: description: UTC epoch timestamp in seconds (Unix time) the person last changed jobs. Multiply by 1000 for a JS Date in milliseconds. type: number jobStartDate: description: 'When the current role started: YYYY, YYYY-MM or YYYY-MM-DD.' type: string jobTitle: description: Current job title. type: string jobTitleClass: description: Normalized title class. type: string jobTitleLevels: description: Seniority levels for the current title. items: type: string type: array jobTitleRole: description: Normalized role for the current title. type: string jobTitleSubRole: description: Normalized sub-role for the current title. type: string jobVerifiedUtc: description: UTC epoch timestamp in seconds (Unix time) the current role was last verified. Multiply by 1000 for a JS Date in milliseconds. type: number lastInitial: description: Last initial. type: string lastName: description: Last name. type: string linkedinId: description: LinkedIn numeric member id. type: string linkedinUrl: description: LinkedIn profile URL. format: uri type: string linkedinUsername: description: LinkedIn vanity handle. type: string locality: description: City. type: string locationName: description: Where the person lives, as one display string. type: string locationNames: description: Every location People Data Labs has associated with the person. items: type: string type: array locationUpdatedUtc: description: UTC epoch timestamp in seconds (Unix time) the person's location was last updated. Multiply by 1000 for a JS Date in milliseconds. type: number metro: description: Metro area. type: string middleInitial: description: Middle initial. type: string middleName: description: Middle name. type: string pdlId: description: People Data Labs persistent person id. Send it to Person Enrichment - People Data Labs to re-pull this record. type: string postalCode: description: Postal code. type: string profileScore: description: People Data Labs' qualitative score for how complete the profile is. type: string profiles: description: Networks People Data Labs has a profile for. Search returns the network name only; profile URLs and handles come from Person Enrichment - People Data Labs. items: properties: network: description: Network name, e.g. linkedin, facebook, twitter. type: string required: - network type: object type: array region: description: State or region. type: string regions: description: Every region associated with the person. items: type: string type: array sex: description: Sex recorded for the person. type: string skills: description: Skills the person lists. items: type: string type: array required: - fullName type: object type: array total: description: Profiles matching the query across the whole dataset, not just this page. type: integer required: - people type: object found: description: False when the query matched no profile. type: boolean required: - found - data title: People Search - People Data Labs output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - People Data Labs tags: - People Search x-mint: href: /api-reference/people-search/peopledatalabs x-payment-info: price: currency: USD max: '9.912000' min: '0.000000' mode: dynamic protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: currency: USD max: '9.912000' min: '0.001000' minimumUsd: '0.001000' mode: dynamic quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: currency: USD max: '9.912000' min: '0.000000' minimumUsd: null mode: dynamic quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.prospeo: post: description: 'Prospect Prospeo''s contact database by job title, department, seniority, experience, location and any company firmographic. One flat price per page of 25. **Price:** \$66.00 per 1,000 requests (flat per request - same cost regardless of results returned). **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - Prospeo pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_prospeo parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: company: websites: include: - stripe.com page: 1 schema: additionalProperties: false example: company: websites: include: - stripe.com page: 1 minProperties: 1 properties: company: additionalProperties: true description: 'Filter by company names or websites, e.g. {"names": {"include": ["Stripe"]}, "websites": {"include": ["stripe.com"]}}.' type: object companyAttributes: additionalProperties: true description: Filter by company characteristics, e.g. B2B, has pricing, has a free trial. type: object companyEmailProvider: description: Filter by the company's email MX provider. items: type: string type: array companyFounded: additionalProperties: true description: Filter by founding year range. type: object companyFunding: additionalProperties: true description: Filter by funding stage or amount raised. type: object companyHeadcountByDepartment: description: Filter by headcount within a department. items: type: string type: array companyHeadcountCustom: additionalProperties: true description: Filter by a custom employee count range. type: object companyHeadcountGrowth: additionalProperties: true description: Filter by headcount growth. type: object companyHeadcountRange: description: Filter by Prospeo's predefined employee count bands. items: type: string type: array companyIndustry: additionalProperties: true description: Filter by company industry. type: object companyJobPostingHiringFor: description: Filter by the roles the company is currently hiring for. items: type: string type: array companyJobPostingQuantity: additionalProperties: true description: Filter by how many roles the company has open. type: object companyKeywords: additionalProperties: true description: Filter by keywords found in company data. type: object companyLocationSearch: additionalProperties: true description: Filter by company headquarters location. type: object companyNaics: additionalProperties: true description: Filter by NAICS codes. type: object companyRevenue: additionalProperties: true description: Filter by revenue range. type: object companySics: additionalProperties: true description: Filter by SIC codes. type: object companyTechnology: additionalProperties: true description: Filter by technologies the company uses. type: object companyType: description: Filter by ownership type. enum: - Private - Public - Non Profit - Other type: string maxPersonPerCompany: description: Cap how many people one company may contribute to the results. minimum: 1 type: integer page: default: 1 description: Page number, one-based. Prospeo returns 25 results per page and charges one flat price per page. minimum: 1 type: integer personContactDetails: additionalProperties: true description: Filter by which contact channels Prospeo holds for the person. type: object personDepartment: additionalProperties: true description: Filter by department. type: object personDuplicateControl: additionalProperties: true description: Duplicate-control settings exported from the Prospeo dashboard. type: object personJobTitle: additionalProperties: true description: 'Filter by job title, with exact, contains and boolean semantics, e.g. {"include": ["VP Sales"]}.' type: object personLocationSearch: additionalProperties: true description: Filter by where the person is located. type: object personName: additionalProperties: true description: Filter by person name. type: object personNameOrJobTitle: description: Free-text search across person name and job title. type: string personSeniority: additionalProperties: true description: 'Filter by seniority. Prospeo''s own values are case sensitive: Founder/Owner, C-Suite, Partner, Vice President, Head, Director, Manager, Senior, Entry, Intern. Common aliases such as vp and founder are normalized before the call.' type: object personTimeInCurrentCompany: additionalProperties: true description: Filter by time at the current company, as a numeric range. type: object personTimeInCurrentRole: additionalProperties: true description: Filter by time in the current role, as a numeric range. type: object personYearOfExperience: additionalProperties: true description: Filter by total years of experience, as a numeric range. type: object preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer title: People Search - Prospeo input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: One page of matching records plus Prospeo's paging counters. oneOf: - type: 'null' - additionalProperties: false properties: currentPage: description: Page number this response holds, one-based. type: integer people: description: Matching people, each with their current employer's firmographic record. Email addresses and mobile numbers come back masked; reveal them with Person Enrichment - Prospeo. items: properties: company: description: The person's current employer, with Prospeo's full firmographic record. properties: attributes: description: What Prospeo detects about how the company sells. properties: hasDemo: description: The website offers a demo. type: boolean hasDownloadable: description: The website offers a download. type: boolean hasFreeTrial: description: The website offers a free trial. type: boolean hasMobileApps: description: The company publishes mobile apps. type: boolean hasOnlineReviews: description: The company has online reviews. type: boolean hasPricing: description: The website publishes pricing. type: boolean isB2b: description: The company sells to businesses. type: boolean type: object companyId: description: Prospeo's own company identifier. Send it back as this SKU's companyId input. type: string crunchbaseUrl: description: Company Crunchbase profile URL. format: uri type: string description: description: Company description as the company writes it. type: string descriptionAi: description: Prospeo's own AI-written company summary. type: string descriptionSeo: description: Meta description from the company's website. type: string domain: description: Primary company domain. type: string emailTech: description: How the company's email is hosted. properties: domain: description: Domain the company's email addresses use. type: string mxProvider: description: Mail provider behind the domain's MX records. type: string type: object employeeCount: description: Employees Prospeo currently counts. type: integer employeeCountOnProspeo: description: Employees of this company that Prospeo holds a profile for. type: integer employeeRange: description: Employee headcount band, e.g. 10000+. type: string facebookUrl: description: Company Facebook page URL. format: uri type: string founded: description: Year the company was founded. type: integer funding: description: Funding history. properties: events: description: One entry per funding round. items: properties: amount: description: Amount raised in USD. type: number amountPrinted: description: Amount raised as a display string. type: string link: description: Source URL for the round. format: uri type: string raisedUtc: description: UTC epoch timestamp in seconds (Unix time) the round closed. Multiply by 1000 for a JS Date in milliseconds. type: number stage: description: Round stage, e.g. Series E-J. type: string type: object type: array latestStage: description: Most recent funding stage. type: string latestUtc: description: UTC epoch timestamp in seconds (Unix time) of the most recent round. Multiply by 1000 for a JS Date in milliseconds. type: number rounds: description: Number of funding rounds raised. type: integer totalRaised: description: Total capital raised, in USD. type: number totalRaisedPrinted: description: Total capital raised as a display string. type: string type: object image: description: Company logo URL. format: uri type: string industry: description: Company industry. type: string instagramUrl: description: Company Instagram profile URL. format: uri type: string jobPostings: description: Open roles Prospeo currently sees for the company. properties: activeCount: description: Open roles currently posted. type: integer activeTitles: description: Titles of the open roles. items: type: string type: array type: object keywords: description: Keywords Prospeo assigns the company. items: type: string type: array linkedinId: description: Company LinkedIn numeric id. type: string linkedinUrl: description: Company LinkedIn page URL. format: uri type: string location: description: Company headquarters. properties: city: description: City. type: string country: description: Country name. type: string countryCode: description: ISO 3166-1 alpha-2 country code. type: string rawAddress: description: Headquarters address as one display string. type: string state: description: State or region. type: string type: object naicsCodes: description: NAICS classification codes for the company. items: type: string type: array name: description: Company name. type: string otherWebsites: description: Other domains the company owns. items: type: string type: array phoneHq: description: Headquarters switchboard number. properties: country: description: Country the number belongs to. type: string countryCode: description: ISO 3166-1 alpha-2 code for that country. type: string international: description: Number in international format. type: string national: description: Number in national format. type: string phone: description: Phone number as Prospeo stores it. type: string type: object revenueRange: description: Annual revenue band in USD. properties: max: description: Upper bound in USD. type: number min: description: Lower bound in USD. type: number type: object revenueRangePrinted: description: Annual revenue band as a display string. type: string sicCodes: description: SIC classification codes for the company. items: type: string type: array technologies: description: Technologies Prospeo detects in the company's stack. items: type: string type: array twitterUrl: description: Company X (Twitter) profile URL. format: uri type: string type: description: Ownership type, e.g. Private, Public, Non Profit. type: string website: description: Company website URL. format: uri type: string youtubeUrl: description: Company YouTube channel URL. format: uri type: string type: object email: description: Work email address. Prospeo returns the address only once it is revealed; status says why it is absent otherwise. properties: email: description: The email address, when Prospeo revealed one. type: string revealed: description: True when the address below is the full value rather than a masked preview. type: boolean status: description: Prospeo's verdict for the address, e.g. VERIFIED or UNAVAILABLE. type: string type: object firstName: description: First name. type: string fullName: description: Person's full name. type: string headline: description: LinkedIn headline. type: string jobChangeDetectedUtc: description: UTC epoch timestamp in seconds (Unix time) Prospeo last detected a job change. Multiply by 1000 for a JS Date in milliseconds. type: number jobHistory: description: Every role Prospeo holds for the person, most recent first. items: properties: companyId: description: Prospeo company id for the employer. type: string companyName: description: Employer name. type: string current: description: True while the role is current. type: boolean departments: description: Departments Prospeo assigns the role. items: type: string type: array durationMonths: description: How long the role has run, in months. type: integer endMonth: description: Month the role ended, absent while current. type: integer endYear: description: Year the role ended, absent while current. type: integer jobKey: description: Prospeo's identifier for this role. type: string seniority: description: Seniority band, e.g. C-Suite, Manager, Entry. type: string startMonth: description: Month the role started, 1 to 12. type: integer startYear: description: Year the role started. type: integer title: description: Job title held. type: string type: object type: array jobKey: description: Prospeo's identifier for the current role. type: string jobTitle: description: Current job title. type: string lastName: description: Last name. type: string linkedinMemberId: description: LinkedIn numeric member id. type: string linkedinUrl: description: LinkedIn profile URL. format: uri type: string location: description: Where the person is located. properties: city: description: City. type: string country: description: Country name. type: string countryCode: description: ISO 3166-1 alpha-2 country code. type: string state: description: State or region. type: string timeZone: description: IANA time zone, e.g. America/New_York. type: string timeZoneOffset: description: Current offset from UTC in hours. type: number type: object mobile: description: Mobile phone number. Digits are masked until the number is revealed; send enrichMobile to reveal it. properties: country: description: Country the number belongs to. type: string countryCode: description: ISO 3166-1 alpha-2 code for that country. type: string international: description: Number in international format. type: string mobile: description: The number as Prospeo stores it. type: string national: description: Number in national format. type: string revealed: description: True when the digits below are the full number rather than a masked preview. type: boolean status: description: Prospeo's verdict for the number, e.g. VERIFIED or UNAVAILABLE. type: string type: object personId: description: Prospeo's own person identifier. Send it back as this SKU's personId input. type: string skills: description: Skills the person lists. items: type: string type: array required: - fullName type: object type: array perPage: description: Results Prospeo returns per page. Prospeo fixes this at 25 and charges one flat price per page. type: integer totalCount: description: Results matching the filters across all pages. type: integer totalPages: description: Pages of results behind these filters. type: integer required: - people type: object found: description: False when no record matched the filters. type: boolean required: - found - data title: People Search - Prospeo output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - Prospeo tags: - People Search x-mint: href: /api-reference/people-search/prospeo x-payment-info: price: amount: '0.066000' currency: USD mode: fixed protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: amount: '0.066000' currency: USD minimumUsd: '0.001000' mode: fixed quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: amount: '0.066000' currency: USD minimumUsd: null mode: fixed quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.quickenrich: post: description: 'Build a prospect list by title, industry, headcount, revenue, or location, and see which people have a work email or phone on file before you pay to reveal one. Contact values themselves are masked here; use Person Enrichment or the QuickEnrich company contacts search to resolve them. **Price:** \$0.50 per 1,000 requests (flat per request - same cost regardless of results returned). **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - QuickEnrich pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_quickenrich parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: country: include: - US hasEmail: true limit: 2 title: include: - CEO schema: additionalProperties: false anyOf: - required: - title - required: - companyName - required: - companyDomain - required: - industry - required: - employeeCount - required: - revenue - required: - services - required: - city - required: - locality - required: - country - required: - linkedinBio - required: - hasEmail - required: - hasPhone description: 'At least one filter is required: any include/exclude dimension, hasEmail, or hasPhone.' example: country: include: - US hasEmail: true limit: 2 title: include: - CEO properties: city: additionalProperties: false description: Filter on city name. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object companyDomain: additionalProperties: false description: Filter on employer website domain. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object companyName: additionalProperties: false description: Filter on employer name. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object country: additionalProperties: false description: Filter on ISO 3166-1 alpha-2 country code, e.g. "US". properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object employeeCount: additionalProperties: false description: Filter on employer headcount band. These bands differ from the companyEmployeeCount string returned on a result. properties: exclude: description: Reject any of these values. items: enum: - < 5 - 5 - 19 - 20 - 99 - 100 - 249 - 250 - 499 - 500 - 999 - 1000 - 4999 - 5000 - 9999 - '>10000' - Not Available type: string maxItems: 50 type: array include: description: Match any of these values. items: enum: - < 5 - 5 - 19 - 20 - 99 - 100 - 249 - 250 - 499 - 500 - 999 - 1000 - 4999 - 5000 - 9999 - '>10000' - Not Available type: string maxItems: 50 type: array type: object hasEmail: description: Keep only people with a work email on file. The address itself is not returned here. type: boolean hasPhone: description: Keep only people with a phone on file. The number itself is not returned here. type: boolean industry: additionalProperties: false description: Filter on the employer's LinkedIn industry label. Values must match the QuickEnrich industry vocabulary exactly, e.g. "IT Services and IT Consulting". properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object limit: default: 10 description: Maximum people to return on this page. maximum: 100 minimum: 1 type: integer linkedinBio: additionalProperties: false description: Filter on words found in the employer's LinkedIn bio. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object locality: additionalProperties: false description: Filter on locality. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object page: default: 1 description: One-based result page. minimum: 1 type: integer preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer revenue: additionalProperties: false description: Filter on employer revenue band. properties: exclude: description: Reject any of these values. items: enum: - < 500k - 500k - 1 Million - 1 - 2.5 Million - 2.5 - 5 Million - 5 - 10 Million - 10 - 20 Million - 20 - 50 Million - 50 - 100 Million - 100 - 500 Million - 500 Million - 1 Billion - '>1 Billion' - Not Available type: string maxItems: 50 type: array include: description: Match any of these values. items: enum: - < 500k - 500k - 1 Million - 1 - 2.5 Million - 2.5 - 5 Million - 5 - 10 Million - 10 - 20 Million - 20 - 50 Million - 50 - 100 Million - 100 - 500 Million - 500 Million - 1 Billion - '>1 Billion' - Not Available type: string maxItems: 50 type: array type: object services: additionalProperties: false description: Filter on the services the employer lists. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object title: additionalProperties: false description: Filter on job title. properties: exclude: description: Reject any of these values. items: type: string maxItems: 50 type: array include: description: Match any of these values. items: type: string maxItems: 50 type: array type: object title: People Search - QuickEnrich input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: One page of results, or null when the request matched nothing. oneOf: - type: 'null' - additionalProperties: false properties: hasMore: description: Whether the upstream reports further pages beyond this one. type: boolean page: description: One-based page this response covers. type: integer pageSize: description: Records per page upstream applied. type: integer people: description: People on this page. items: properties: address: description: Street address on the employer record. type: string addressLine2: description: Second address line on the employer record. type: string city: description: City on the employer record. type: string companyDomain: description: Employer website domain. type: string companyEmail: description: Public address published on the employer home page. type: string companyEmployeeCount: description: Employer headcount band, e.g. "20 - 99". Upstream band vocabulary; "Not Available" means the band is unknown. type: string companyIndustry: description: Employer industry label. type: string companyLinkedinUrl: description: Employer LinkedIn company URL. type: string companyName: description: Employer name. type: string companyPhone: description: Employer main phone line. type: string companyRevenue: description: Employer revenue band, e.g. "1 - 2.5 Million". Upstream band vocabulary; "Not Available" means the band is unknown. type: string country: description: ISO 3166-1 alpha-2 country code on the employer record. type: string emailDomain: description: Domain the work email resolves to. type: string empId: description: QuickEnrich's stable record id for this person, for de-duplicating across pages. type: string firstName: description: Person's first name. type: string hasEmail: description: Whether a work email is held for this person. The address itself is masked on this SKU. type: boolean hasLinkedin: description: Whether a LinkedIn profile is held for this person. type: boolean hasPhone: description: Whether a phone is held for this person. The number itself is masked on this SKU. type: boolean lastName: description: Person's last name. type: string linkedinUrl: description: Person's LinkedIn profile URL. type: string locality: description: Locality on the employer record. type: string postalCode: description: Postal code on the employer record. type: string region: description: State or region code on the employer record. type: string title: description: Person's job title. type: string required: - firstName - hasEmail - hasPhone - hasLinkedin type: object type: array total: description: Total records matching the request. type: integer totalPages: description: Total pages available. type: integer required: - people - page - pageSize - total - totalPages - hasMore type: object found: description: False when the filters matched no people. type: boolean required: - found - data title: People Search - QuickEnrich output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - QuickEnrich tags: - People Search x-mint: href: /api-reference/people-search/quickenrich x-payment-info: price: amount: '0.000500' currency: USD mode: fixed protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: amount: '0.001000' currency: USD minimumUsd: '0.001000' mode: fixed quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: amount: '0.000500' currency: USD minimumUsd: null mode: fixed quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution /v1/run/people_search.quickenrich_company: post: description: 'List the known contacts at one company domain, with work emails and direct phone lines where they are held. Returns up to 20 people per page for a flat per-request price. Coverage is strongest for small and local businesses. **Price:** \$7.20 per 1,000 requests (flat per request - same cost regardless of results returned). **Routing:** one lane serves this API today, so a failed attempt has nowhere to fail over to. Payment outcome follows the selected rail''s settlement policy. **Catalog:** People Search - QuickEnrich Company Contacts pricing and uptime - live USD price, lane routing, and measured 30-day uptime. Every People_search endpoint.' operationId: people_search_quickenrich_company parameters: - description: Optional. Comma-separated keys (dotted paths like `author.name` descend into nested objects) to keep on each result item. Keys are matched relative to each result item after the `data`/`items` envelope is unwrapped, not against the top-level response envelope, so use `jq` to reshape the whole envelope. Shrinks the response without changing cost. in: query name: fields required: false schema: type: string - description: Optional. Cap the number of result rows returned; a `_truncated` note reports how many were withheld so you can page via the API's own `limit`. Does not change cost. in: query name: max_items required: false schema: minimum: 0 type: integer - description: Optional. Return only a structural outline (top-level keys, item counts, and per-field byte sizes) instead of the full data. Does not change cost. in: query name: summary required: false schema: type: boolean - description: 'Optional. A jq expression applied to the result envelope; its output replaces `output` (multiple outputs collect into an array). Reshape freely, e.g. `jq=.data | {title, description, md: .markdown[:3500]}`. Runs sandboxed with a 250ms / 2MB budget; on failure the full result is returned with a `jqError`. Does not change cost.' in: query name: jq required: false schema: type: string - description: Optional. The most you are willing to pay for this one request, in US dollars (for example 0.05). Any route that would charge more than this is not used, so a request only ever runs on something you can afford. If nothing is available at or below your amount, the request is refused before it runs, nothing is charged, and the message tells you the cheapest price per request so you can raise it. Leave it out to accept the normal price. in: query name: max_cost_usd required: false schema: type: string - description: Optional wallet idempotency key, scoped to this customer for 24 hours. When the gateway honors the key, this synchronous in-process execution can continue after the caller disconnects, bounded by its execution deadline. A completed replayable result charges normally exactly once and can be replayed without another provider run or charge. A pending duplicate returns 409 idempotency_in_progress; reuse with different request semantics returns 409 idempotency_conflict. in: header name: Idempotency-Key required: false schema: maxLength: 255 minLength: 1 type: string requestBody: content: application/json: example: companyDomain: southmemphisfence.com schema: additionalProperties: false example: companyDomain: southmemphisfence.com properties: companyDomain: description: Company website domain, normalized upstream (example.com or https://example.com both work). minLength: 1 type: string page: default: 1 description: One-based result page. Each page holds up to 20 people. minimum: 1 type: integer preferLatencyUnderMs: description: 'Optional; omit it and routing is unchanged, with the cheapest source serving. Prefer sources whose typical response time (median over the trailing 30 days, as published on this endpoint''s lane health) is under this many milliseconds; among those, the cheapest serves. This can raise your price: when the cheapest source misses the target, a faster and dearer one serves, and you are quoted and charged its price. If no source is that fast the request is still served, by whichever source offers the best speed for its price - it is never refused for being slow. Sources we have not timed are tried last. This is a preference, not a guarantee: the median describes past requests and is not a ceiling on this one, and it excludes any wait this request itself asks for. On a paginated walk it applies to the first page only: later pages stay with the source that page chose, at the price it was quoted.' minimum: 1 type: integer title: description: One job title, or several comma-separated, e.g. "CEO, CFO". maxLength: 255 type: string required: - companyDomain title: People Search - QuickEnrich Company Contacts input type: object required: true responses: '200': content: application/json: schema: properties: costUsd: description: USD charged on the original run. On a replay this value is echoed for parity; the replay itself is free. type: number hint: description: 'Optional one-line nudge, absent when there is nothing to say. `large_result:` suggests the fields/max_items/summary/jq controls for a big response. `paging_unavailable:` means this result came from a source that cannot return a `nextCursor`, so it may be INCOMPLETE and cannot be continued - re-run with `requireCursor: true` to be served only by a source that can page, which may cost more per request.' type: string items: description: Number of result rows returned. For per-result SKUs the per-item cost is charged against this count; for input-priced SKUs the charge is per submitted input, independent of this count. type: integer jqError: description: Present only when a `jq` expression failed; `output` then carries the full unshaped result and this explains why the reshape did not apply. type: string output: anyOf: - additionalProperties: false properties: data: description: One page of results, or null when the request matched nothing. oneOf: - type: 'null' - additionalProperties: false properties: page: description: One-based page this response covers. type: integer pageSize: description: Records per page upstream applied. type: integer people: description: People on this page. items: properties: address: description: Street address on the employer record. type: string city: description: City on the employer record. type: string companyDomain: description: Employer website domain. type: string companyEmployeeCount: description: Employer headcount band, e.g. "20 - 99". Upstream band vocabulary; "Not Available" means the band is unknown. type: string companyIndustry: description: Employer industry label. type: string companyLinkedinUrl: description: Employer LinkedIn company URL. type: string companyName: description: Employer name. type: string companyPhone: description: Employer main phone line. type: string companyRevenue: description: Employer revenue band, e.g. "1 - 2.5 Million". Upstream band vocabulary; "Not Available" means the band is unknown. type: string country: description: ISO 3166-1 alpha-2 country code on the employer record. type: string email: description: Work email address. type: string emailDomain: description: Domain the work email resolves to. type: string emailVerifiedUtc: description: UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. type: number firstName: description: Person's first name. type: string lastName: description: Person's last name. type: string linkedinUrl: description: Person's LinkedIn profile URL. type: string phone: description: Direct business phone line held for the person. Mostly desk lines; read phoneType before treating it as a mobile. type: string phoneType: description: Line type reported upstream, e.g. "mobile" or "landline". type: string postalCode: description: Postal code on the employer record. type: string region: description: State or region code on the employer record. type: string title: description: Person's job title. type: string required: - firstName type: object type: array total: description: Total records matching the request. type: integer totalPages: description: Total pages available. type: integer required: - people - page - pageSize - total - totalPages type: object found: description: False when the domain matched no contacts. type: boolean required: - found - data title: People Search - QuickEnrich Company Contacts output type: object - type: 'null' description: Normalized output, or null when the replay payload was not retained. provider: description: Always "AnyAPI". type: string replayed: description: True when this response replays the durable result of an earlier run without billing or upstream execution. type: boolean resultId: description: Opaque handle to the full unshaped result, cached ~15 min. Re-shape it for free (fields/max_items/summary/jq) via GET /v1/results/{id}, no re-billing. Absent when the result was too large to cache. type: string required: - output - provider - costUsd - items - replayed type: object description: Normalized result. headers: Idempotency-Replayed: description: Present only when the request carried an Idempotency-Key this gateway honored. "false" means the key was claimed and the run executed freshly; "true" means it replayed a prior identical run and was NOT charged again. Absent means either no key was sent or this gateway does not honor keys, so a retry could be charged twice. schema: enum: - 'false' - 'true' type: string PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string Payment-Receipt: description: Inline mpp payment receipt. schema: type: string X-PAYMENT-RESPONSE: description: Inline x402 payment receipt. schema: type: string '400': content: application/json: schema: $ref: '#/components/schemas/Error' description: Input did not match the schema, or the upstream rejected the request. '401': content: application/json: schema: $ref: '#/components/schemas/Error' description: Missing or invalid API key. '402': content: application/json: schema: oneOf: - $ref: '#/components/schemas/PaymentRequiredError' - $ref: '#/components/schemas/TrialCapReached' application/problem+json: schema: properties: challengeId: minLength: 1 type: string status: const: 402 type: integer required: - status - challengeId type: object description: Insufficient wallet balance or spend cap, or an inline-payment challenge. Agent trials receive a trial_cap_reached continuation with a live RFC 8628 device authorization. headers: PAYMENT-REQUIRED: description: Inline x402 payment challenge. schema: type: string WWW-Authenticate: description: Inline mpp payment challenge. schema: type: string '404': content: application/json: schema: $ref: '#/components/schemas/Error' description: Unknown SKU, or the upstream had no matching resource. '409': content: application/json: schema: $ref: '#/components/schemas/Error' description: 'Idempotency collision. Codes: idempotency_in_progress means retry after the Retry-After delay; idempotency_conflict means use a new key for different request semantics; idempotency_needs_review means stop retrying and contact AnyAPI support with X-Anyapi-Request-Id.' '422': content: application/json: schema: $ref: '#/components/schemas/Error' description: The request was well formed but this API cannot serve the requested target site; the body's `alternatives` array lists the AnyAPI APIs that can. '429': content: application/json: schema: $ref: '#/components/schemas/Error' description: The upstream was rate limited; inspect `payment` when present before deciding whether to retry. '500': content: application/json: schema: $ref: '#/components/schemas/Error' description: An internal error prevented completion. Inspect payment when present before retrying. '502': content: application/json: schema: $ref: '#/components/schemas/Error' description: Every provider failed with a server/transport error, or inline payment settlement could not be confirmed; inspect `payment` when present before retrying. security: - bearerAuth: [] - apiKeyAuth: [] - {} summary: People Search - QuickEnrich Company Contacts tags: - People Search x-mint: href: /api-reference/people-search/quickenrich-company x-payment-info: price: amount: '0.007200' currency: USD mode: fixed protocols: - x402: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact - mpp: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rails: - headers: challenge: - PAYMENT-REQUIRED credential: - PAYMENT-SIGNATURE - X-PAYMENT receipt: - PAYMENT-RESPONSE - X-PAYMENT-RESPONSE pricing: amount: '0.007200' currency: USD minimumUsd: '0.001000' mode: fixed quoteBasis: floor protocol: asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' network: eip155:8453 payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' scheme: exact rail: x402 settlement: onExecutionFailure: released onUnknownFinalization: indeterminate timing: after_execution - headers: challenge: - WWW-Authenticate credential: - Authorization receipt: - Payment-Receipt pricing: amount: '0.007200' currency: USD minimumUsd: null mode: fixed quoteBasis: funded_ceiling protocol: asset: '0x20c000000000000000000000b9537d11c60e8b50' currency: USD intent: charge method: tempo network: tempo payTo: '0x754BD2A6799e766B1E2b9f1Ae7fBdC0CeD96ef13' rail: tempo scheme: exact rail: mpp settlement: onExecutionFailure: charged_undelivered onVerificationError: indeterminate timing: before_execution components: schemas: AgentUpgrade: properties: authorizationServer: format: uri type: string clientId: type: string device: $ref: '#/components/schemas/DeviceUpgrade' scope: type: string required: - authorizationServer - scope type: object Payment: properties: costUsd: description: Known USD payment amount for this request. minimum: 0 type: number rail: minLength: 1 type: string settlementState: enum: - charged_undelivered - indeterminate type: string required: - rail - settlementState - costUsd type: object Error: properties: code: description: Stable machine-readable error code when the endpoint defines one. type: string error: description: Customer-safe error message. type: string payment: $ref: '#/components/schemas/Payment' requestId: description: This run's AnyAPI request id, the same value as the X-Anyapi-Request-Id response header. Quote it to support. Absent on endpoints that do not execute a run. format: uuid type: string required: - error type: object PaymentRequiredError: allOf: - $ref: '#/components/schemas/Error' - properties: error: not: const: trial_cap_reached type: object DeviceUpgrade: properties: deviceCode: type: string expiresIn: minimum: 0 type: integer grantType: type: string interval: minimum: 1 type: integer tokenEndpoint: format: uri type: string userCode: type: string verificationUri: format: uri type: string verificationUriComplete: format: uri type: string required: - verificationUriComplete - verificationUri - userCode - deviceCode - tokenEndpoint - grantType - interval - expiresIn type: object TrialCapReached: properties: error: const: trial_cap_reached type: string message: description: Human-relayable continuation instructions, including an executable token poll. type: string upgrade: $ref: '#/components/schemas/AgentUpgrade' required: - error - message - upgrade type: object securitySchemes: apiKeyAuth: description: Your AnyAPI key. in: header name: X-API-Key type: apiKey x-default: YOUR_ANYAPI_KEY bearerAuth: description: Your AnyAPI key as a Bearer token. scheme: bearer type: http x-default: YOUR_ANYAPI_KEY