> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.goextrovert.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Search Schema

> Returns the people-search filter grammar: every field a query may filter on (`fields`), what each accepts, the bounds a whole query is held to (`limits`) and the whole-query refusals (`rules`). A field with `valuePolicy` `closed` carries its whole vocabulary in `values`; a `custom` field takes free values. Free: consumes no credits.

A query is a flat list of conditions, all of which must hold: `{"filters":[{"field":"contact.titleLatest","op":"any.include","mode":"WORD","values":["sales director"]},{"field":"contact.titleLatest","op":"any.exclude","mode":"STRICT","values":["intern"]},{"field":"account.employeeSize","op":"range","ranges":[{"start":51,"end":200}]}]}`. Each condition names one `field`, one of that field's `ops` as `op`, and the payload keys of the field's `control`:

| `control` | `op` | Payload keys |
|---|---|---|
| `text_match` | `any.include`, `any.exclude`, `all.include` | `mode` (one of `matchModes`), `values` |
| `value_list` | `any.include`, `any.exclude` | `values` |
| `keyword_sources` | `any.include`, `any.exclude` | `sources`: `[{"source":"HEADLINE","mode":"WORD"}]`, `values` |
| `enum_list` | `in` | `values` |
| `numeric_range_list` | `range` | `ranges`: `[{"start":51,"end":200},{"start":1001}]` |
| `numeric_range` | `range` | `start`, `end` |
| `duration_range` | `range` | `min`, `max`: `{"year":1,"month":6}` |
| `date_range` | `range` | `start`, `end` |
| `metric_employee_rows` | `rows` | `rows`: `[{"departments":["sales"],"start":10,"end":50}]` |
| `metric_growth_rows` | `rows` | `rows`: `[{"departments":["sales"],"start":10,"end":50,"timeFrame":"TWELVE"}]` |

A field takes only the `op` values its `ops` lists. `any.include` matches any of the values, `any.exclude` drops matches of any of them, `all.include` requires every value. `mode`, `values`, `sources`, `ranges` and `rows` are required where the control takes them, and every array is non-empty. A keyword condition has no `mode` of its own: each source carries one, each source from `sources` at most once, at most `maxSources` per condition. A band takes `start`, `end` or both, inclusive, and the bands of `ranges` combine with OR; a duration takes `min`, `max` or both, each `{"year":…,"month":…}` with both keys required (`month` 0 to 11 on top of whole years, e.g. `{"year":5,"month":0}` for five years); a date is epoch milliseconds or an ISO date such as `"2024-01-01"`; `metric_growth_rows` counts percent over a `timeFrame` from `timeFrames`. A key the control does not take, an `op` the field does not list, or a second condition with the same `field` and `op` is refused: put all the values of one `field` and `op` pair into one condition. A query needs at least one condition that is not `any.exclude`. The whole `query`, serialized as compact JSON, takes at most 149504 bytes. A refusal names the condition by its place in the list and, where known, its field and op, e.g. `query.filters[0].ranges[1]: starts above its end (account.employeeSize range)`. `limits.maxQueryBytes` and `limits.maxQueryDepth` count the query after the backend normalizes it, not the request as sent.

Person fields: `contact.titleLatest` job title of the primary active role, `contact.titleCurrent` any active role, `contact.titlePrevious` past roles; `contact.seniority` level; `contact.departmentAndFunction` the person's function; `contact.location` where the person is; `contact.durationCurrentJob` time in the current role, `contact.durationCurrentCompany` time at the current company, `contact.durationTotal` total experience; `contact.skill`; `contact.certification`; `contact.educationDegree`, `contact.educationFieldOfStudy`; `contact.language` languages spoken (closed values, but a `text_match` control, so a condition still needs `mode`); `contact.keyword` terms searched in chosen sections of the profile; `contact.profileBadge` LinkedIn profile badges; `contact.linkedInFollowers`.
Company fields (the employer): `account.name`, `account.domain` and `account.linkedin` (company LinkedIn URL) each name the employer, and an `any.exclude` condition on any of them may list several employers to leave out; `account.industries`; `account.productAndServices`; `account.technologies`; `account.employeeSize` headcount; `account.retailSize` number of offices; `account.revenue` annual revenue in USD; `account.foundedYear`; `account.type` company type such as `PUBLIC_COMPANY` or `NON_PROFIT`; `account.socialMedia` has a profile on a network; `account.language` operating language; `account.keyword` terms searched in chosen parts of the company record; `account.fundingType` round types, `account.fundingTotalAmount` and `account.fundingLastAmount` in USD, `account.fundingDate` last round date; `account.metricEmployee` headcount per department, `account.metricGrowth` headcount growth per department in percent over a window; `account.naics` 6-digit NAICS codes; `account.location` where the company has an office.



## OpenAPI

````yaml https://api.goextrovert.com/client/v2/docs-json get /client/v2/lead-finder/search-schema
openapi: 3.1.0
info:
  title: Extrovert Client API
  description: >-
    Public API for Extrovert platform integration. Use your API key for
    authentication.
  version: '1.0'
  contact: {}
servers:
  - url: https://api.goextrovert.com/
    description: API Server
security: []
tags: []
paths:
  /client/v2/lead-finder/search-schema:
    get:
      tags:
        - Lead Finder
      summary: Get Search Schema
      description: >-
        Returns the people-search filter grammar: every field a query may filter
        on (`fields`), what each accepts, the bounds a whole query is held to
        (`limits`) and the whole-query refusals (`rules`). A field with
        `valuePolicy` `closed` carries its whole vocabulary in `values`; a
        `custom` field takes free values. Free: consumes no credits.


        A query is a flat list of conditions, all of which must hold:
        `{"filters":[{"field":"contact.titleLatest","op":"any.include","mode":"WORD","values":["sales
        director"]},{"field":"contact.titleLatest","op":"any.exclude","mode":"STRICT","values":["intern"]},{"field":"account.employeeSize","op":"range","ranges":[{"start":51,"end":200}]}]}`.
        Each condition names one `field`, one of that field's `ops` as `op`, and
        the payload keys of the field's `control`:


        | `control` | `op` | Payload keys |

        |---|---|---|

        | `text_match` | `any.include`, `any.exclude`, `all.include` | `mode`
        (one of `matchModes`), `values` |

        | `value_list` | `any.include`, `any.exclude` | `values` |

        | `keyword_sources` | `any.include`, `any.exclude` | `sources`:
        `[{"source":"HEADLINE","mode":"WORD"}]`, `values` |

        | `enum_list` | `in` | `values` |

        | `numeric_range_list` | `range` | `ranges`:
        `[{"start":51,"end":200},{"start":1001}]` |

        | `numeric_range` | `range` | `start`, `end` |

        | `duration_range` | `range` | `min`, `max`: `{"year":1,"month":6}` |

        | `date_range` | `range` | `start`, `end` |

        | `metric_employee_rows` | `rows` | `rows`:
        `[{"departments":["sales"],"start":10,"end":50}]` |

        | `metric_growth_rows` | `rows` | `rows`:
        `[{"departments":["sales"],"start":10,"end":50,"timeFrame":"TWELVE"}]` |


        A field takes only the `op` values its `ops` lists. `any.include`
        matches any of the values, `any.exclude` drops matches of any of them,
        `all.include` requires every value. `mode`, `values`, `sources`,
        `ranges` and `rows` are required where the control takes them, and every
        array is non-empty. A keyword condition has no `mode` of its own: each
        source carries one, each source from `sources` at most once, at most
        `maxSources` per condition. A band takes `start`, `end` or both,
        inclusive, and the bands of `ranges` combine with OR; a duration takes
        `min`, `max` or both, each `{"year":…,"month":…}` with both keys
        required (`month` 0 to 11 on top of whole years, e.g.
        `{"year":5,"month":0}` for five years); a date is epoch milliseconds or
        an ISO date such as `"2024-01-01"`; `metric_growth_rows` counts percent
        over a `timeFrame` from `timeFrames`. A key the control does not take,
        an `op` the field does not list, or a second condition with the same
        `field` and `op` is refused: put all the values of one `field` and `op`
        pair into one condition. A query needs at least one condition that is
        not `any.exclude`. The whole `query`, serialized as compact JSON, takes
        at most 149504 bytes. A refusal names the condition by its place in the
        list and, where known, its field and op, e.g.
        `query.filters[0].ranges[1]: starts above its end (account.employeeSize
        range)`. `limits.maxQueryBytes` and `limits.maxQueryDepth` count the
        query after the backend normalizes it, not the request as sent.


        Person fields: `contact.titleLatest` job title of the primary active
        role, `contact.titleCurrent` any active role, `contact.titlePrevious`
        past roles; `contact.seniority` level; `contact.departmentAndFunction`
        the person's function; `contact.location` where the person is;
        `contact.durationCurrentJob` time in the current role,
        `contact.durationCurrentCompany` time at the current company,
        `contact.durationTotal` total experience; `contact.skill`;
        `contact.certification`; `contact.educationDegree`,
        `contact.educationFieldOfStudy`; `contact.language` languages spoken
        (closed values, but a `text_match` control, so a condition still needs
        `mode`); `contact.keyword` terms searched in chosen sections of the
        profile; `contact.profileBadge` LinkedIn profile badges;
        `contact.linkedInFollowers`.

        Company fields (the employer): `account.name`, `account.domain` and
        `account.linkedin` (company LinkedIn URL) each name the employer, and an
        `any.exclude` condition on any of them may list several employers to
        leave out; `account.industries`; `account.productAndServices`;
        `account.technologies`; `account.employeeSize` headcount;
        `account.retailSize` number of offices; `account.revenue` annual revenue
        in USD; `account.foundedYear`; `account.type` company type such as
        `PUBLIC_COMPANY` or `NON_PROFIT`; `account.socialMedia` has a profile on
        a network; `account.language` operating language; `account.keyword`
        terms searched in chosen parts of the company record;
        `account.fundingType` round types, `account.fundingTotalAmount` and
        `account.fundingLastAmount` in USD, `account.fundingDate` last round
        date; `account.metricEmployee` headcount per department,
        `account.metricGrowth` headcount growth per department in percent over a
        window; `account.naics` 6-digit NAICS codes; `account.location` where
        the company has an office.
      operationId: LeadFinderClientApiController_getSearchSchema
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetSearchSchemaResponseDto'
        '401':
          description: Invalid or missing API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientApiErrorResponseDto'
      security:
        - api-key: []
components:
  schemas:
    GetSearchSchemaResponseDto:
      type: object
      properties:
        status:
          type: string
          const: success
          description: Response status
        data:
          type: object
          properties:
            version:
              type: string
              description: >-
                Grammar identifier, currently `people.v1`; sent back as
                `schemaVersion`.
            fields:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                    description: >-
                      The field id a query condition names as its `field`, e.g.
                      `contact.seniority`.
                    examples:
                      - contact.seniority
                      - account.industries
                  control:
                    type: string
                    description: >-
                      Which payload keys a condition on this field takes; the
                      search-schema guide lists the payload keys of each control
                      (`instructions` over MCP, the endpoint description in the
                      Public API).
                  valuePolicy:
                    type: string
                    description: >-
                      `closed`: only a value from `values`, matched exactly.
                      `custom`: any value; some custom fields have a catalog.
                  valueSyntax:
                    description: >-
                      `numeric_code`: a 6-digit NAICS code such as `541511`.
                      Omitted for free text.
                    type: string
                  numericDomain:
                    description: >-
                      What the bounds count: `count` (whole, non-negative),
                      `amount_usd` (non-negative, decimals allowed), `year`,
                      `percent` (may be negative).
                    type: string
                  scope:
                    description: >-
                      `latest`: the primary active role; `current`: every active
                      role; `previous`: past roles. Omitted when not applicable.
                    type: string
                  matchModes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Accepted `mode` values. SMART also matches similar or
                      related values. WORD matches the exact phrase, with extra
                      words allowed before or after it. STRICT matches the
                      complete field value, with no extra words. Empty when the
                      control has no mode.
                  values:
                    type: array
                    items:
                      type: string
                    description: >-
                      The whole vocabulary of a `closed` field; empty for
                      `custom`.
                  sources:
                    type: array
                    items:
                      type: string
                    description: >-
                      Sections the `sources` of a keyword condition may name;
                      empty on other fields.
                  timeFrames:
                    type: array
                    items:
                      type: string
                    description: >-
                      Growth windows in months: `THREE`, `SIX`, `TWELVE`,
                      `TWENTY_FOUR`; empty on other fields.
                  maxSources:
                    description: Most sources one keyword condition takes.
                    type: number
                  ops:
                    type: array
                    items:
                      type: string
                    description: >-
                      The `op` values a condition on this field accepts; never
                      empty.
                    examples:
                      - - any.include
                        - any.exclude
                      - - range
                required:
                  - field
                  - control
                  - valuePolicy
                  - matchModes
                  - values
                  - sources
                  - timeFrames
                  - ops
              description: >-
                Every field a query condition may filter on, and what each
                accepts.
            limits:
              description: Bounds a whole query is held to.
              type: object
              properties:
                maxValuesPerArray:
                  type: number
                  description: >-
                    Most values one `values` list of a condition takes; location
                    values count after economic zones are expanded to countries.
                maxQueryBytes:
                  type: number
                  description: >-
                    Largest query accepted, in bytes, counted after the backend
                    normalizes it.
                maxQueryDepth:
                  type: number
                  description: Deepest nesting the query may have.
                maxPageSize:
                  type: number
                  description: People the preview returns per query.
                resultCeiling:
                  type: number
                  description: >-
                    Deepest match a search reaches; a `FILTERS` import cannot
                    ask for more prospects than this.
              required:
                - maxValuesPerArray
                - maxQueryBytes
                - maxQueryDepth
                - maxPageSize
                - resultCeiling
            rules:
              description: Whole-query refusals no single condition expresses.
              type: object
              properties:
                excludeOnlyQueryRejected:
                  type: boolean
                  description: A query made only of `any.exclude` conditions is refused.
                emptyQueryRejected:
                  type: boolean
                  description: A query with no condition is refused.
              required:
                - excludeOnlyQueryRejected
                - emptyQueryRejected
          description: The published people-search filter grammar.
          required:
            - version
            - fields
        message:
          type: string
          description: Success message
          examples:
            - Operation completed successfully
      required:
        - status
        - data
        - message
    ClientApiErrorResponseDto:
      type: object
      properties:
        status:
          type: string
          description: Response status
          example: error
          enum:
            - error
        data:
          type: object
          description: Response data
          example: null
          nullable: true
        message:
          type: string
          description: Error message
          example: An error occurred while processing the request
      required:
        - status
        - data
  securitySchemes:
    api-key:
      type: apiKey
      in: header
      name: X-API-Key
      description: API Key for authentication

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.