---
title: "Search leads by filters"
method: POST
path: "/v1/search/people"
tags: ["enrichment"]
---

# Search leads by filters

`POST /v1/search/people`

## Request

- Base URL: `https://developer.saleshandy.com` (the document declares no server; this is the origin it was published from)
- URL: `https://developer.saleshandy.com/v1/search/people`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/saleshandy/apis/develop-with-saleshandy/docs/v1/search/people/post.ts> (a function with typed inputs; its response is checked against the schema)

## Request body

- SearchLeadsOpenAPIDto
  - `full_name` IncludesFilterExactMatchDto
    - `includes` string[]
    - `exactMatch` 0 | 1
  - `decision_maker` boolean
  - `company_bootstraped` boolean
  - `is_b2b` boolean
  - `linkedin_url` string[]
  - `location` IncludesExcludesFilter1Dto
    - `includes` string[]
    - `excludes` string[]
    - `exactMatch` 0 | 1
  - `department` PeopleDepartmentIncludesExcludesDto
    - `includes` string[]
    - `excludes` string[]
  - `company_hq_location` IncludesExcludesFilter1Dto
    - `includes` string[]
    - `excludes` string[]
    - `exactMatch` 0 | 1
  - `certifications` IncludesFilterDto
    - `includes` string[]
  - `job_title` IncludesExcludesFilterDto
    - `includes` string[]
    - `excludes` string[]
    - `exactMatch` 0 | 1
    - `shouldSearchPast` number
  - `management_level` PeopleManagementLevelIncludesExcludesDto
    - `includes` string[]
    - `excludes` string[]
  - `jobs_changed_within` RangeFilterDto
    - `min` string
    - `max` string
  - `company_annual_revenue` RangeFilterDto
    - `min` string
    - `max` string
  - `company_funding_amount` RangeFilterDto
    - `min` string
    - `max` string
  - `company_funding_date` RangeFilterDto
    - `min` string
    - `max` string
  - `company_founded_year` RangeFilterDto
    - `min` string
    - `max` string
  - `skills` IncludesExcludesFilter1Dto
    - `includes` string[]
    - `excludes` string[]
    - `exactMatch` 0 | 1
  - `current_company_experience` RangeFilterDto
    - `min` string
    - `max` string
  - `current_role_tenure` RangeFilterDto
    - `min` string
    - `max` string
  - `total_experience` RangeFilterDto
    - `min` string
    - `max` string
  - `company_industry` PeopleCompanyIndustryIncludesExcludesDto
    - `includes` string[]
    - `excludes` string[]
  - `company_name` IncludesExcludesFilter2Dto
    - `includes` string[]
    - `excludes` string[]
    - `exactMatch` 0 | 1
    - `shouldSearchPast` number
  - `projected_base_salary` RangeFilterDto
    - `min` string
    - `max` string
  - `company_size` RangeFilterDto
    - `min` string
    - `max` string
  - `linkedin_connection_count` RangeFilterDto
    - `min` string
    - `max` string
  - `linkedin_followers_count` RangeFilterDto
    - `min` string
    - `max` string
  - `education_degrees` PeopleEducationDegreeIncludesExcludesDto
    - `includes` string[]
    - `excludes` string[]
  - `social_link` IncludesFilterDto
    - `includes` string[]
  - `keywords` IncludesFilterDto
    - `includes` string[]
  - `page` number
  - `tab` 'total' | 'netNew': Which results to search. `netNew` returns only leads/companies not yet revealed by your account; `total` returns all matches, including ones you have already revealed.
  - `limitPerCompany` number
  - `company_domain` IncludesExcludesFilter4Dto
    - `includes` string[]
    - `excludes` string[]

## Response `201`

Leads searched successfully

- union
  - object
    - `message` string
    - `payload` object
      - `status` string: Search status string, e.g. "success".
      - `display_limit` number: Maximum number of results the account is allowed to retrieve for this search.
      - `total_results` number: Total number of matching results across all pages.
      - `page` number: Current page number, matching the request's `page` parameter.
      - `per_page` number: Number of results returned on this page.
      - `total_pages` number: Total number of pages available.
      - `has_next_page` boolean: Whether a page after the current one exists.
      - `has_previous_page` boolean: Whether a page before the current one exists.
      - `people` object[]: The matching people for this page. When there are zero matching results, `payload` itself becomes the literal empty array `[]` instead of an object containing this field. Client code reading `payload.people` should confirm `payload` is not itself an array first (e.g. `Array.isArray(payload)`).
        - `id` number: Numeric identifier for this person.
        - `full_name` string: Person's full name.
        - `picture_url` string: Profile picture URL.
        - `job_title` string: Current job title.
        - `company_name` string: Current employer's company name.
        - `company_logo_url` string, nullable: Current employer's logo URL. `null` when unavailable.
        - `company_website` string: Current employer's website. Can be an empty string.
        - `department` string: Department at the current company.
        - `location` object: Person's location.
          - `country` string: Country name. Can be an empty string.
          - `state` string: State or province name. Can be an empty string. In some records this holds the same value as `city`, or is blank, rather than a distinct state name.
          - `city` string: City name. Can be an empty string. See the note on `state` above about data quality in this object.
        - `total_experience` number: Total professional experience, in months.
        - `decision_maker` boolean: Whether this person is flagged as a decision maker.
        - `company_is_b2b` boolean, nullable: Whether the person's company is flagged as B2B. `null` when unknown.
        - `isRevealed` boolean: Whether this lead has been revealed by your account. Always `false` on the `netNew` tab and for `imported` leads.
        - `revealType` 'profileOnly' | 'email' | 'phone' | 'emailphone' | 'personalEmail' | 'personalEmailPhone' | 'emailPersonalEmailPhone' | 'emailPersonalEmail' | 'imported', nullable: How this lead was revealed or added to your account. `null` when not revealed.
  - object
    - `message` string
    - `payload` unknown[]: Empty when no results match — `payload` itself becomes a literal empty array instead of an object with an empty `people` array. Client code should check `Array.isArray(payload)` before reading `payload.people`.
      - unknown

## Other responses

- `400`: 1001: Invalid token<br><br>

## Changes

- **2026-10-23** `e7a29c931aa7`: 5 info
  - added the new optional request property `company_name/allOf[#/components/schemas/IncludesExcludesFilter2Dto]/exactMatch`
  - added the new optional request property `tab`
  - added the optional property `oneOf[subschema #1: Success]/payload/people/items/company_logo_url` to the response with the `201` status
  - added the optional property `oneOf[subschema #1: Success]/payload/people/items/isRevealed` to the response with the `201` status
  - …1 more
- **2026-09-18** `78695b8296c5`: 1 breaking
  - the response property `oneOf[subschema #1: Success]/payload/people/items/company_is_b2b` became nullable for the status `201`
- **2026-09-16** `a483e105b20f`: 53 breaking, 55 warning, 2 info
  - added `#/components/schemas/IncludesExcludesFilter1Dto` to the `company_hq_location` request property `allOf` list
  - added `#/components/schemas/IncludesExcludesFilter1Dto` to the `location` request property `allOf` list
  - added `#/components/schemas/IncludesExcludesFilter1Dto` to the `skills` request property `allOf` list
  - added `#/components/schemas/IncludesExcludesFilter2Dto` to the `company_name` request property `allOf` list
  - …106 more

[Operation history](https://skmtc.dev/saleshandy/apis/develop-with-saleshandy/changes/v1/search/people/post.md)

---

[API](https://skmtc.dev/saleshandy/apis/develop-with-saleshandy.md) - [All operations](https://skmtc.dev/saleshandy/apis/develop-with-saleshandy/llms.txt) - [OpenAPI document](https://skmtc.dev/saleshandy/apis/develop-with-saleshandy/revisions/e7a29c931aa7?raw)
