openapi: 3.1.0
info:
  title: Lead411 API V3
  version: 3.0.0
  description: 'Lead411 V3 REST API — B2B company and contact data, search, suppression, CRM export, and account utilities.


    **Documentation:** [https://api.lead411.com/v3/docs/](https://api.lead411.com/v3/docs/)


    **Authentication:** Most endpoints accept `X-API-KEY` or `Authorization: Bearer <access_token>` (from Direct Login or
    OAuth token exchange).


    **Rate limits:** Responses may include rate-limit headers; expensive search/export routes share additional limits. See
    product documentation for defaults and overrides.


    **Legacy compatibility:** Some clients expect HTTP 200 with `status: error` for auth failures when legacy mode is enabled
    on the server.

    '
  contact:
    name: Lead411 Support
    url: https://www.lead411.com
servers:
- url: https://api.lead411.com/v3
  description: Production
- url: https://api.lead411.com/api/v3
  description: Production (alternate prefix used by some gateways)
tags:
- name: Auth
  description: Login, token refresh, OAuth, session validation, and logout.
- name: Customer
  description: Account profile, quota, and unlock statistics.
- name: Search
  description: JSON search, similar companies, employee search helpers, and search export.
- name: Suppression
  description: Email and company suppression lists.
- name: Company
  description: Company profile, employees, news, jobs, technology, and bulk lookup.
- name: Employee
  description: Employee lookup and unlock.
- name: Options
  description: Reference data and autocomplete helpers for search filters.
- name: CRM
  description: CRM configuration, field mapping, and push to default CRM.
- name: Export
  description: File export and download.
- name: MCP OAuth
  description: Claude MCP OAuth discovery and token endpoints (public).
- name: Internal
  description: Operator-only routes (not shown in customer navigation).
  x-lead411-audience: internal
paths:
  /auth/login:
    post:
      tags:
      - Auth
      summary: Authenticate user (email/password)
      operationId: authLogin
      responses:
        '200':
          description: Authenticate user (email/password)
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/TokenData'
              example: &id002
                status: success
                message: success
                data:
                  token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example
                  access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example
                  refresh_token: def50200example_refresh_token
                  expires_in: 3600
                  token_type: Bearer
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: 'Exchange email and password for access and refresh tokens. Use the returned access token as

        `Authorization: Bearer <token>` on protected routes.


        Credentials may be sent as JSON body **or** as query string (PHP v3 parity):

        `POST /auth/login?email=<email>&password=<password>`. JSON body fields win when both are present.'
      security: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LoginRequest'
            example: &id001
              email: user@example.com
              password: YOUR_PASSWORD
              device_name: my-integration
      x-lead411-auth-methods: []
      x-lead411-example-body: *id001
      parameters:
      - name: email
        in: query
        required: false
        schema:
          type: string
        description: User email. Legacy PHP v3 clients send this instead of a JSON body.
      - name: password
        in: query
        required: false
        schema:
          type: string
          format: password
        description: User password. Legacy PHP v3 clients send this instead of a JSON body.
      x-lead411-response-example: *id002
      x-lead411-usage-notes: Send JSON body, or query string `?email=&password=` (legacy PHP v3). After login, use Bearer
        on protected routes or continue with X-API-KEY if you already have an API key.
  /auth/refresh:
    post:
      tags:
      - Auth
      summary: Refresh access token
      operationId: authRefresh
      responses:
        '200':
          description: Refresh access token
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/TokenData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefreshRequest'
            example: &id003
              refresh_token: YOUR_REFRESH_TOKEN
      x-lead411-auth-methods: []
      x-lead411-example-body: *id003
      description: Refresh an access token using a valid refresh token.
  /oauth/authorize:
    post:
      tags:
      - Auth
      summary: Generate OAuth authorization code
      operationId: oauthAuthorize
      responses:
        '200':
          description: Generate OAuth authorization code
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OAuthCodeData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OAuthAuthorizeRequest'
            example: &id004
              client_id: YOUR_CLIENT_ID
              redirect_uri: https://your-app.example/callback
              response_type: code
              state: random-state
      x-lead411-auth-methods: []
      x-lead411-example-body: *id004
      description: Start OAuth authorization-code flow and receive a short-lived authorization code.
  /oauth/token:
    post:
      tags:
      - Auth
      summary: Exchange authorization code or refresh token
      operationId: oauthToken
      responses:
        '200':
          description: Exchange authorization code or refresh token
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/TokenData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OAuthTokenRequest'
            example: &id005
              grant_type: authorization_code
              code: YOUR_AUTH_CODE
              client_id: YOUR_CLIENT_ID
              client_secret: YOUR_CLIENT_SECRET
              redirect_uri: https://your-app.example/callback
      x-lead411-auth-methods: &id056
      - oauth
      x-lead411-example-body: *id005
      description: Exchange an authorization code or refresh token for access credentials.
  /auth/checkToken:
    post:
      tags:
      - Auth
      summary: Validate API key or bearer token
      operationId: authCheckToken
      responses:
        '200':
          description: Validate API key or bearer token
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CheckTokenData'
              example: &id007
                status: success
                message: success
                data:
                  valid: true
                  customer_id: 12345
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Validate the `X-API-KEY` or Bearer token sent on this request. Empty body is OK.
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id006 {}
      x-lead411-auth-methods: &id008
      - apiKey
      - bearer
      - oauth
      x-lead411-example-body: *id006
      x-lead411-response-example: *id007
  /logout:
    post:
      tags:
      - Auth
      summary: Logout / invalidate session
      operationId: authLogout
      responses:
        '200':
          description: Logout / invalidate session
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/LoggedOutData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id009 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id009
      description: Log out the current bearer session.
  /getCustomerDetails:
    post:
      tags:
      - Customer
      summary: Get customer details
      operationId: getCustomerDetails
      responses:
        '200':
          description: Get customer details
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CustomerProfile'
              example: &id011
                status: success
                message: success
                data:
                  email: user@example.com
                  first_name: Jane
                  last_name: Doe
                  company: Example Corp
                  unlock_quota: 500
                  bonus_quota: 0
                  package_id: 12
                  member_level: standard
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id010 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id010
      description: Get account profile details for the authenticated customer. Empty body is OK.
      x-lead411-response-example: *id011
  /getCustomerDetailsMore:
    post:
      tags:
      - Customer
      summary: Get customer details (includes customer_id)
      operationId: getCustomerDetailsMore
      responses:
        '200':
          description: Get customer details (includes customer_id)
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CustomerProfileExtended'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id012 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id012
      description: Same as `getCustomerDetails` plus `customer_id`.
  /get_customer_quota:
    post:
      tags:
      - Customer
      summary: Get customer quota
      operationId: getCustomerQuota
      responses:
        '200':
          description: Get customer quota
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CustomerQuota'
              example: &id014
                status: success
                message: success
                data:
                  unlock_quota: 500
                  bonus_quota: 50
                  total_quota: 550
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id013 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id013
      description: Current unlock quota balances for the account.
      x-lead411-response-example: *id014
  /get_customer_unlock_stats_info:
    post:
      tags:
      - Customer
      summary: Get customer unlock stats
      operationId: getCustomerUnlockStats
      responses:
        '200':
          description: Get customer unlock stats
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CustomerUnlockStats'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id015 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id015
      description: Quota plus unlock usage statistics.
  /search/get_similar_companies:
    post:
      tags:
      - Search
      summary: Get similar companies
      operationId: getSimilarCompanies
      responses:
        '200':
          description: Get similar companies
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SimilarCompaniesResult'
              example: &id017
                status: success
                message: success
                data:
                  source_company_id: 1743
                  totalRows: 5
                  showingRows: 5
                  record_for: company
                  page: 1
                  AllResults: []
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimilarCompaniesRequest'
            example: &id016
              website: lead411.com
              limit: 5
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id016
      description: Provide one of `company_id`, `website`, `domain`, or `url`.
      x-lead411-response-example: *id017
  /search/get_company_employees_data:
    post:
      tags:
      - Search
      summary: Advanced Employee Search
      operationId: getCompanyEmployeesData
      responses:
        '200':
          description: Advanced Employee Search
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/PHPSearchResult'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyEmployeesDataRequest'
            example: &id018
              company_ids: '1743'
              user_search_string: cisco.com
              title_keyword: ceo,cfo
              country_code: US
              State_array: CA,ON
              Industry_Codes: 48,500
              industry_linkedin: 1430,1247
              page: 1
              per_page: 25
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id018
      description: 'Advanced employee/company search with legacy PHP-compatible result shape.

        Send a JSON object with any combination of the request body fields below.

        Technology keywords (`Technology_array`, `SoftwareHardware_array`,

        `SoftwareHardware`, `softwareHardware`, or `technology`) accept a comma-separated

        string or a JSON string array. Pair them with `technology_uses_text`:

        `technology_uses_yes` (default) means “uses this tech”; `technology_uses_no`

        means “does not use this tech”.'
  /search/exportDownloadFile:
    post:
      tags:
      - Search
      summary: Export search results to file
      operationId: searchExportDownloadFile
      responses:
        '200':
          description: Export search results to file
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/ExportDownloadData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExportDownloadRequest'
            example: &id019
              select_action_download: employee
              employee_id: 12345,67890
              download_all: csv
      x-lead411-auth-methods: *id008
      description: Export search results to CSV/XLSX based on the submitted export payload.
      x-lead411-example-body: *id019
  /search/getNewsCategoryData:
    post:
      tags:
      - Search
      summary: Get news category reference data
      operationId: getNewsCategoryData
      responses:
        '200':
          description: Get news category reference data
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Return available news category options. Empty body is OK.
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id020 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id020
  /search/search_technology:
    post:
      tags:
      - Options
      summary: Search technology names
      operationId: searchTechnology
      responses:
        '200':
          description: Search technology names
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Search technology names used by the options UI. An empty body is treated as `{}`.
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id021
              search_string: Salesforce
              limit: 20
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id021
  /suppression/insertSuppressionEmail:
    post:
      tags:
      - Suppression
      summary: Insert suppression emails
      operationId: insertSuppressionEmail
      responses:
        '200':
          description: Insert suppression emails
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SuppressionInsertData'
              example: &id023
                status: success
                message: success
                data:
                  employee_ids:
                  - 12345
                  - 67890
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuppressionEmailRequest'
            example: &id022
              email_json: '["user@example.com"]'
              employee_id_json: ''
              sub_account_email: ''
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id022
      description: 'Suppress contacts by email and/or employee id. `email_json` and `employee_id_json` are JSON

        array strings, not raw arrays.'
      x-lead411-response-example: *id023
      x-lead411-usage-notes: 'In JSON, set `email_json` to a **string** whose value is a JSON array — e.g. `"email_json":
        "[\"a@b.com\"]"`. Do not send a raw JSON array unless your client encodes it the same way PHP clients do.'
  /suppression/getSuppressionEmails:
    post:
      tags:
      - Suppression
      summary: Get suppression emails
      operationId: getSuppressionEmails
      responses:
        '200':
          description: Get suppression emails
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SuppressionListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuppressionEmailRequest'
            example: &id024
              sub_account_email: ''
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id024
      description: List suppressed employees and companies for the current account. An empty body is treated as `{}`.
  /suppression/deleteSuppressionEmail:
    post:
      tags:
      - Suppression
      summary: Delete suppression emails
      operationId: deleteSuppressionEmail
      responses:
        '200':
          description: Delete suppression emails
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/DeletedFlagData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuppressionEmailRequest'
            example: &id025
              employee_id_json: '[12345]'
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id025
      description: Remove employee suppressions by passing `employee_id_json` as a JSON array string.
  /suppression/addSuppCompany:
    post:
      tags:
      - Suppression
      summary: Add suppressed company
      operationId: addSuppCompany
      responses:
        '200':
          description: Add suppressed company
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SuppressionCompanyAddData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuppressionCompanyRequest'
            example: &id026
              company_url: https://www.example.com/
              company_id: 0
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id026
      description: Add a suppressed company by `company_id` and/or `company_url`.
  /suppression/deleteAddedSuppCompany:
    post:
      tags:
      - Suppression
      summary: Delete suppressed company
      operationId: deleteAddedSuppCompany
      responses:
        '200':
          description: Delete suppressed company
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/DeletedFlagData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SuppressionCompanyRequest'
            example: &id027
              company_url: https://www.example.com/
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id027
      description: Remove a company suppression.
  /company/getCompanyInfo:
    post:
      tags:
      - Company
      summary: Get company info
      operationId: getCompanyInfo
      responses:
        '200':
          description: Get company info
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyInfoData'
              example: &id029
                status: success
                message: success
                data:
                  company_id: 1743
                  company_name: Example Inc
                  company_url: https://www.example.com
                  employee_count: 250
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyInfoRequest'
            example: &id028
              company_id: 1743
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id028
      description: 'Look up one company by `company_id`, `company_url`, `company_name`, or `linkedin_url`.

        Optional `exclude_data_request` omits named datasets. Allowed values:

        `company_suppression`, `company_outside_tech_data`, `company_inside_tech_data`,

        `indeed_data`, `hiring_zip_code`, `news_data`.'
      x-lead411-response-example: *id029
  /company/getCompanyEmployees:
    post:
      tags:
      - Company
      summary: Get company employees
      operationId: getCompanyEmployees
      responses:
        '200':
          description: Get company employees
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyEmployeesData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyEmployeesRequest'
            example: &id030
              company_id: 1743
              page: 1
              page_size: 25
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id030
      description: Paginated employee list for a company.
  /company/getCompanyNews:
    post:
      tags:
      - Company
      summary: Get company news
      operationId: getCompanyNews
      responses:
        '200':
          description: Get company news
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyNewsData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyIDRequest'
            example: &id031
              company_id: 1743
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id031
      description: Returns only `company_id` and company-specific `news_data`.
  /company/getCompanyJobs:
    post:
      tags:
      - Company
      summary: Get company jobs
      operationId: getCompanyJobs
      responses:
        '200':
          description: Get company jobs
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyJobsData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyIDRequest'
            example: &id032
              company_id: 1743
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id032
      description: Returns only `company_id`, `indeed_data`, and `hiring_zip_code`.
  /company/getCompanyTech:
    post:
      tags:
      - Company
      summary: Get company technology stack
      operationId: getCompanyTech
      responses:
        '200':
          description: Get company technology stack
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyTechData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyTechRequest'
            example: &id033
              company_id: 1743
              page: 1
              limit: 50
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id033
      description: 'Returns `company_id`, company profile `json_meta`, and one page of technologies

        in `company_outside_tech_data`. Pagination applies to this endpoint only

        (`getCompanyInfo` still returns its first 50 technologies and is not paged).

        `page` defaults to 1. `limit` is always 50 per page even if another value is sent.

        Results are ordered by technology id. The response includes `page`, `limit`,

        `total`, and `total_pages`.'
  /company/searchCompanyEmployees:
    post:
      tags:
      - Company
      summary: Search employees at company
      operationId: searchCompanyEmployees
      responses:
        '200':
          description: Search employees at company
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SearchCompanyEmployeesData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchCompanyEmployeesRequest'
            example: &id034
              company_linkedin_url: http://www.linkedin.com/company/cisco
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id034
      description: 'Search employees within a company. Identify the company with `company_id` or

        `company_linkedin_url`. `linkedin_url` looks up an employee by their LinkedIn

        profile (`linkedin.com/in/...`).'
      x-lead411-usage-notes: 'Send one identifier:

        `company_id` or `company_linkedin_url` to list employees at a company

        (`search_name`, `search_dept`, `search_title` apply).

        `linkedin_url` to look up a person by profile URL (`linkedin.com/in/...`).

        Do not send a company page URL in `linkedin_url`.'
  /company/getCompanyData:
    post:
      tags:
      - Company
      summary: Get company data bundle
      operationId: getCompanyData
      responses:
        '200':
          description: Get company data bundle
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyListRequest'
            example: &id035
              companies:
              - url: https://www.example.com
                company_name: Example Inc
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id035
      description: Resolve a list of companies from a `companies` array in the body.
  /company/get_company_data_using_csv:
    post:
      tags:
      - Company
      summary: Bulk company lookup via CSV
      operationId: get_company_data_using_csv
      responses:
        '200':
          description: Bulk company lookup via CSV
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/CompanyCSVExportData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyCSVRequest'
            example: &id036
              filename: companies.csv
              download_all: csv
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id036
      description: 'Bulk company upload via JSON, pipe-separated URLs, or multipart CSV (`company_csv`, `file`,

        `upload_file`, or `csv_file`).'
  /employee/getEmployeeInformation:
    post:
      tags:
      - Employee
      summary: Get employee information
      operationId: getEmployeeInformation
      responses:
        '200':
          description: Get employee information
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/EmployeeListData'
              example: &id038
                status: success
                message: success
                data:
                - employee_id: 12345
                  company_id: 1743
                  contact_status: unlocked
                  first_name: Alex
                  last_name: Smith
                  title: CEO
                  email: alex@example.com
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmployeeInfoRequest'
            example: &id037
              employee_id: 12345
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id037
      description: Find employees by `employee_id`, `email`, `linkedin_url`, or title + company.
      x-lead411-response-example: *id038
  /employee/unlock_employee_record:
    post:
      tags:
      - Employee
      summary: Unlock employee record
      operationId: unlockEmployeeRecord
      responses:
        '200':
          description: Unlock employee record
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/UnlockEmployeeData'
              example: &id040
                status: success
                message: success
                data:
                  status: unlocked
                  employee_id: 12345
                  quota:
                    remaining: 499
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UnlockEmployeeRequest'
            example: &id039
              employee_id: '12345'
              employee_ids_json: ''
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id039
      description: Unlock one or more employees. `employee_ids_json` must be a JSON array string.
      x-lead411-response-example: *id040
  /options/get_search_sortby_options:
    post:
      tags:
      - Options
      summary: Get search sort-by options
      operationId: getSearchSortByOptions
      responses:
        '200':
          description: Get search sort-by options
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/SearchSortByOptionsData'
              example: &id042
                display_name: Sort By
                input_type: dropdown
                default_value: yearlyRevDesc
                values:
                  yearlyRevDesc: Revenue (High to Low)
                  yearlyRevAsc: Revenue (Low to High)
                  empSizeDesc: Company Size (High to Low)
                  empSizeAsc: Company Size (Low to High)
                  companyNameDesc: Company Name (A-Z)
                  companyNameAsc: Company Name (Z-A)
                  leadScoring: Lead Scoring
                  bomboraRank: Bombora Rank
                  rules: none
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id041 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id041
      description: Return allowed search sort options. Empty body is OK.
      x-lead411-response-example: *id042
  /options/search_industry_linkedin_keywords:
    post:
      tags:
      - Options
      summary: Search industry LinkedIn keywords
      operationId: searchIndustryLinkedInKeywords
      responses:
        '200':
          description: Search industry LinkedIn keywords
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id043
              search_string: technology
              limit: 20
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id043
      description: Search LinkedIn industry keywords and return IDs for `industry_linkedin` (also usable as `Industry_Codes`
        / `industryCode` values over 999). Does not return classic Lead411 industry codes (IDs ≤ 999). An empty body is treated
        as `{}` and returns the default list.
  /options/search_title:
    post:
      tags:
      - Options
      summary: Search job titles
      operationId: searchTitle
      responses:
        '200':
          description: Search job titles
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id044
              title_keyword: ceo
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id044
      description: 'Job-title typeahead. PHP reads `q` then `title_keyword` (not `search_string` for the index lookup).

        Requires at least 3 characters. Prefix-matches titles (`@description (^term*)`), always returns at most

        8 suggestions, then sorts shortest titles first. Optional `selected_titles` excludes already-chosen tokens.

        If nothing matches, executive-level fallback options may be returned.'
  /options/searchAreaCode:
    post:
      tags:
      - Options
      summary: Search area codes
      operationId: searchAreaCode
      responses:
        '200':
          description: Search area codes
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id045
              search_string: '415'
              limit: 20
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id045
  /options/searchZipCode:
    post:
      tags:
      - Options
      summary: Search ZIP/postal codes
      operationId: searchZipCode
      responses:
        '200':
          description: Search ZIP/postal codes
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id046
              search_string: '94105'
              limit: 20
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id046
  /options/searchRegion:
    post:
      tags:
      - Options
      summary: Search regions
      operationId: searchRegion
      responses:
        '200':
          description: Search regions
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/OptionsListData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
            example: &id047
              search_string: California
              limit: 20
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id047
  /get_search_sortby_options:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/get_search_sortby_options`
      operationId: getSearchSortByOptionsAlias
      responses:
        '200':
          description: Legacy alias for `/options/get_search_sortby_options`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id048 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id048
  /search_industry_linkedin_keywords:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/search_industry_linkedin_keywords`
      operationId: searchIndustryLinkedInKeywordsAlias
      responses:
        '200':
          description: Legacy alias for `/options/search_industry_linkedin_keywords`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /search_title:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/search_title`
      operationId: searchTitleAliasRoot
      responses:
        '200':
          description: Legacy alias for `/options/search_title`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /search/search_title:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/search_title`
      operationId: searchTitleAliasNested
      responses:
        '200':
          description: Legacy alias for `/options/search_title`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /searchAreaCode:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/searchAreaCode`
      operationId: searchAreaCodeAlias
      responses:
        '200':
          description: Legacy alias for `/options/searchAreaCode`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /searchZipCode:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/searchZipCode`
      operationId: searchZipCodeAlias
      responses:
        '200':
          description: Legacy alias for `/options/searchZipCode`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /searchRegion:
    post:
      tags:
      - Options
      summary: Legacy alias for `/options/searchRegion`
      operationId: searchRegionAlias
      responses:
        '200':
          description: Legacy alias for `/options/searchRegion`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      description: Legacy path alias; same behavior as the canonical `/options/…` route.
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionsQueryRequest'
      x-lead411-auth-methods: *id008
  /crm/get_configured_crm:
    post:
      tags:
      - CRM
      summary: Get configured CRM
      operationId: getConfiguredCRM
      responses:
        '200':
          description: Get configured CRM
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id049 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id049
      description: Return the CRM currently configured for the account.
  /crm/get_all_supported_crms:
    post:
      tags:
      - CRM
      summary: List supported CRMs
      operationId: getAllSupportedCRMs
      responses:
        '200':
          description: List supported CRMs
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObject'
            example: &id050 {}
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id050
      description: List CRM integrations supported for the account/package.
  /crm/exportDataToDefaultCRM:
    post:
      tags:
      - CRM
      summary: Push employee data to default CRM
      operationId: exportDataToDefaultCRM
      responses:
        '200':
          description: Push employee data to default CRM
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExportDataToDefaultCRMRequest'
            example: &id051
              employee_id: 12345
              action: update
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id051
      description: 'Push employee and/or company data to the account''s default CRM.

        Contact path requires `employee_id` or `employee_ids_json`. Company path uses `type` + `company_info`.'
  /crm/getCRMFields:
    post:
      tags:
      - CRM
      summary: Get CRM field definitions
      operationId: getCRMFields
      responses:
        '200':
          description: Get CRM field definitions
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CRMFieldsRequest'
            example: &id052
              crm: salesforce
              type: contact
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id052
      description: Get CRM field definitions for mapping.
  /crm/saveCRMMapping:
    post:
      tags:
      - CRM
      summary: Save CRM field mapping
      operationId: saveCRMMapping
      responses:
        '200':
          description: Save CRM field mapping
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SaveCRMMappingRequest'
            example: &id053
              crm: salesforce
              lead_vals:
              - email
              - first_name
              crm_vals:
              - Email
              - FirstName
              type: contact
      x-lead411-auth-methods: *id008
      description: Save CRM field mappings. `lead_vals` and `crm_vals` are parallel arrays.
      x-lead411-example-body: *id053
  /getCRMFields:
    post:
      tags:
      - CRM
      summary: Get CRM fields (legacy alias)
      operationId: getCRMFieldsAlias
      responses:
        '200':
          description: Get CRM fields (legacy alias)
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CRMFieldsRequest'
      x-lead411-auth-methods: *id008
  /saveCRMMapping:
    post:
      tags:
      - CRM
      summary: Save CRM mapping (legacy alias)
      operationId: saveCRMMappingAlias
      responses:
        '200':
          description: Save CRM mapping (legacy alias)
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/GenericObjectData'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      deprecated: true
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SaveCRMMappingRequest'
      x-lead411-auth-methods: *id008
  /export:
    post:
      tags:
      - Export
      summary: Create export download
      operationId: exportDownload
      responses:
        '200':
          description: Create export download
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuccessEnvelope'
                - type: object
                  properties:
                    data:
                      $ref: '#/components/schemas/ExportDownloadData'
              example: &id055
                status: success
                message: success
                data:
                  download_link: https://api.lead411.com/v3/files/12345/export_20260720.csv
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExportDownloadRequest'
            example: &id054
              select_action_download: employee
              employee_id: 12345,67890
              download_all: csv
              filename: export.csv
      x-lead411-auth-methods: *id008
      x-lead411-example-body: *id054
      description: Create a file export. `select_action_download` is required.
      x-lead411-response-example: *id055
      x-lead411-usage-notes: 'For large exports the API may return `offline: true` with a `download_id` instead of an immediate
        link.'
  /files/{customerID}/{fileName}:
    get:
      tags:
      - Export
      summary: Download export file
      operationId: getExportFile
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      x-lead411-auth-methods: *id008
      parameters:
      - name: customerID
        in: path
        required: true
        schema:
          type: integer
          format: int64
      - name: fileName
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: File stream (CSV, XLSX, or ZIP)
        '401':
          description: Unauthorized
        '403':
          description: Forbidden — file must belong to authenticated customer
      description: Download a file from a prior export. Returns file bytes (CSV/XLSX/ZIP), not JSON. The path `customerID`
        must match the authenticated account.
      x-lead411-usage-notes: Use the URL from `download_link` in export responses. Same authentication as other protected
        endpoints.
  /claude-mcp/oauth/authorize:
    get:
      tags:
      - MCP OAuth
      summary: MCP OAuth authorize (browser redirect)
      operationId: mcpOAuthAuthorize
      security: []
      x-lead411-auth-methods: []
      parameters:
      - name: client_id
        in: query
        schema:
          type: string
      - name: redirect_uri
        in: query
        schema:
          type: string
      - name: response_type
        in: query
        schema:
          type: string
      - name: state
        in: query
        schema:
          type: string
      - name: scope
        in: query
        schema:
          type: string
      responses:
        '302':
          description: Redirect to login or client redirect_uri with code
  /claude-mcp/oauth/browser-session-login:
    post:
      tags:
      - MCP OAuth
      summary: MCP browser session login
      operationId: mcpBrowserSessionLogin
      security: []
      x-lead411-auth-methods: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
  /claude-mcp/oauth/token:
    post:
      tags:
      - MCP OAuth
      summary: MCP OAuth token
      operationId: mcpOAuthToken
      security: []
      x-lead411-auth-methods: *id056
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessEnvelope'
        '400':
          description: Validation or bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
  /claude-mcp/.well-known/openid-configuration:
    get:
      tags:
      - MCP OAuth
      summary: MCP openid-configuration
      operationId: mcpOpenIDConfiguration
      security: []
      x-lead411-auth-methods: []
      responses:
        '200':
          description: Discovery document
  /claude-mcp/.well-known/oauth-authorization-server:
    get:
      tags:
      - MCP OAuth
      summary: MCP oauth-authorization-server
      operationId: mcpOAuthAuthorizationServer
      security: []
      x-lead411-auth-methods: []
      responses:
        '200':
          description: Discovery document
  /claude-mcp/.well-known/jwks.json:
    get:
      tags:
      - MCP OAuth
      summary: MCP jwks.json
      operationId: mcpJWKS
      security: []
      x-lead411-auth-methods: []
      responses:
        '200':
          description: Discovery document
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: Lead411 API key issued to your account.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Access token from `POST /auth/login` or `POST /oauth/token`.
    OAuth2ClientCredentials:
      type: oauth2
      description: OAuth authorization code flow (`/oauth/authorize` + `/oauth/token`). Use the resulting access token as
        Bearer on protected routes.
      flows:
        authorizationCode:
          authorizationUrl: https://api.lead411.com/v3/oauth/authorize
          tokenUrl: https://api.lead411.com/v3/oauth/token
          scopes: {}
  schemas:
    SuccessEnvelope:
      type: object
      properties:
        status:
          type: string
          examples:
          - success
        message:
          type: string
        data:
          description: Endpoint-specific payload
      required:
      - status
      - message
    ErrorEnvelope:
      type: object
      properties:
        status:
          type: string
          examples:
          - error
        message:
          type: string
        code:
          type: string
        error:
          type: string
    EmptyObject:
      type: object
      description: No request fields. Authentication context is sufficient; empty body `{}` is OK.
      additionalProperties: false
    ExportDataToDefaultCRMRequest:
      type: object
      description: 'Push contact and/or company data to the account''s default CRM.

        Provide either a contact path (`employee_id` / `employee_ids_json`) or a company path (`type` + `company_info`).

        '
      properties:
        employee_id:
          type: string
          description: Employee ID to push (required for contact path unless `employee_ids_json` is set).
        employee_ids_json:
          type: string
          description: JSON array string of employee IDs, e.g. `"[12345,67890]"`.
        export_type:
          type: string
          description: Optional unlock/export type override.
        type:
          type: string
          description: Set to `company` for company push path (used with `company_info`).
        sub_account_email:
          type: string
          description: Optional sub-account email when acting on behalf of a sub-user.
        action:
          type: string
          description: CRM push action (default `update`).
        company_info:
          type: object
          description: Company fields for company push (e.g. `company_id`, `company_name`, `company_url`).
          additionalProperties: true
        employee_info:
          type: object
          description: Nested contact field overrides (aliases `employee_details`, `employee`, `contact` also accepted).
          additionalProperties: true
      additionalProperties: true
    LoginRequest:
      type: object
      properties:
        email:
          type: string
          format: email
        password:
          type: string
          format: password
        scopes:
          type: array
          items:
            type: string
        device_name:
          type: string
    RefreshRequest:
      type: object
      required:
      - refresh_token
      properties:
        refresh_token:
          type: string
        scopes:
          type: array
          items:
            type: string
    OAuthAuthorizeRequest:
      type: object
      properties:
        client_id:
          type: string
        redirect_uri:
          type: string
          format: uri
        response_type:
          type: string
          default: code
        scope:
          type: string
        state:
          type: string
        customer_id:
          type: integer
          format: int64
    OAuthTokenRequest:
      type: object
      properties:
        grant_type:
          type: string
          enum:
          - authorization_code
          - refresh_token
        code:
          type: string
        redirect_uri:
          type: string
        client_id:
          type: string
        client_secret:
          type: string
        refresh_token:
          type: string
        scope:
          type: string
    FlexibleCompanyId:
      description: Numeric company ID. Accepts a JSON number or a numeric string (PHP-compatible).
      oneOf:
      - type: integer
        format: int64
      - type: string
        pattern: ^[0-9]+$
    OptionsQueryRequest:
      type: object
      description: 'Extra request keys are ignored. For `search_technology`, the search term

        precedence is `search_keyword`, then `search_string`, then `q`.

        '
      additionalProperties: true
      properties:
        search_keyword:
          type: string
          description: Preferred search term for `search_technology`. Wins when both `search_keyword` and `search_string`
            are sent.
        search_string:
          type: string
          description: Alias used when `search_keyword` is omitted. Also used by other options endpoints.
        q:
          type: string
          description: 'For `search_technology`, final fallback search term after `search_keyword` / `search_string`.

            For `search_title`, primary term with `title_keyword` (PHP reads `q`, then `title_keyword`).

            '
        query:
          type: string
        title_keyword:
          type: string
          description: 'For `search_title`, free-text typeahead (same as `q`). Prefix-matches `title_suggestion`

            (`@description (^term*)`). Minimum 3 characters. Always returns at most 8 rows, shortest titles first.

            `search_string` is not used for that lookup; when `q`/`title_keyword` are omitted the API

            returns executive-level fallback options matching `search_string`.

            '
        selected_titles:
          type: string
          description: Optional comma-separated titles already selected. Those tokens are excluded from `search_title` suggestions.
        suggestionIdsString:
          type: string
        limit:
          type: integer
          description: Used by most options endpoints. Ignored for `search_title` (always 8).
        offset:
          type: integer
        country_code:
          type: string
    CompanyInfoRequest:
      type: object
      description: 'Provide at least one lookup field. Extra request keys (for example `token`) are ignored.

        `company_id` may be a number or a numeric string.

        '
      additionalProperties: true
      properties:
        company_id:
          $ref: '#/components/schemas/FlexibleCompanyId'
        company_url/website:
          type: string
          description: Company website URL
          x-lead411-wire-names:
          - company_url
          - website
        company_name:
          type: string
        linkedin_url:
          type: string
        start:
          type: integer
        offset:
          type: integer
        exclude_data_request:
          type: array
          description: 'Optional. Use only with `getCompanyInfo` to omit named datasets from the response.

            Allowed values: `company_suppression`, `company_outside_tech_data`,

            `company_inside_tech_data`, `indeed_data`, `hiring_zip_code`, `news_data`.

            Dedicated news, jobs, and tech endpoints do not use this field.

            '
          items:
            type: string
            enum:
            - company_suppression
            - company_outside_tech_data
            - company_inside_tech_data
            - indeed_data
            - hiring_zip_code
            - news_data
    CompanyEmployeesRequest:
      type: object
      description: Extra request keys (for example `website` or `token`) are ignored.
      additionalProperties: true
      required:
      - company_id
      properties:
        company_id:
          $ref: '#/components/schemas/FlexibleCompanyId'
        page:
          type: integer
        page_size:
          type: integer
        start:
          type: integer
          description: Legacy alias for offset/page start
        limit:
          type: integer
          description: Legacy alias for page size
    CompanyIDRequest:
      type: object
      description: Extra request keys are ignored. `company_id` may be a number or a numeric string.
      additionalProperties: true
      required:
      - company_id
      properties:
        company_id:
          $ref: '#/components/schemas/FlexibleCompanyId'
    CompanyTechRequest:
      type: object
      description: 'Extra request keys are ignored. `company_id` may be a number or a numeric string. Pagination applies only
        to getCompanyTech. `page` defaults to 1. `limit` is always 50 regardless of the value sent.

        '
      additionalProperties: true
      required:
      - company_id
      properties:
        company_id:
          $ref: '#/components/schemas/FlexibleCompanyId'
        page:
          type: integer
          default: 1
          minimum: 1
          description: 1-based page number. Values less than 1 are treated as 1.
        limit:
          type: integer
          default: 50
          description: Page size is always 50. Other values are ignored.
    SearchCompanyEmployeesRequest:
      type: object
      description: Provide company_id, company_linkedin_url, or linkedin_url.
      properties:
        company_id:
          type: integer
          format: int64
          description: Company to search employees in. Example 1743 (Cisco). Use this, company_linkedin_url, or linkedin_url.
        company_linkedin_url:
          type: string
          description: Company LinkedIn page URL (linkedin.com/company/...). Resolves the company, then returns the same employees
            as company_id. Example http://www.linkedin.com/company/cisco
        linkedin_url:
          type: string
          description: Employee LinkedIn profile URL (linkedin.com/in/...), not a company page. You can also send a JSON array
            of profile URLs. Combine with company_id or company_linkedin_url to limit to one company.
        search_name:
          type: string
          description: Filter by employee first or last name. Applies after the company is identified. Ignored when linkedin_url
            is set.
        search_dept:
          type: string
          description: Filter by department. Applies after the company is identified. Ignored when linkedin_url is set.
        search_title:
          type: string
          description: Filter by job title. When present, title search runs first and takes precedence over linkedin_url.
        sort_option:
          type: string
          description: Sort field for the company employee list. Typical values name, last_name, title.
        sort_order:
          type: string
          description: Sort direction. Use asc or desc.
        start:
          type: integer
          description: Result offset for pagination. Used when page is not sent.
        page:
          type: integer
          description: 1-based page number. When set, overrides start.
        per_page/limit:
          type: integer
          description: Page size. Default 20. Values over 100 are capped to 25.
          x-lead411-wire-names:
          - per_page
          - limit
    EmployeeInfoRequest:
      type: object
      properties:
        employee_id:
          type: integer
          format: int64
        email:
          type: string
          format: email
        title:
          type: string
        linkedin_url:
          type: string
        company_id:
          type: integer
          format: int64
        company_url:
          type: string
    UnlockEmployeeRequest:
      type: object
      properties:
        employee_id:
          type: string
        employee_ids_json:
          type: string
          description: JSON array of employee IDs as string
        export_type:
          type: string
        sub_account_email:
          type: string
    SuppressionEmailRequest:
      type: object
      properties:
        email_json:
          type: string
          description: 'JSON array encoded as a string, e.g. `"[\"user@example.com\"]"` in the request body.

            '
        employee_id_json:
          type: string
          description: JSON array of employee IDs as a string, e.g. `"[12345,67890]"`.
        sub_account_email:
          type: string
          description: Optional sub-account email when acting on behalf of a sub-user.
    SuppressionCompanyRequest:
      type: object
      description: Extra request keys are ignored. `company_id` may be a number or a numeric string.
      additionalProperties: true
      properties:
        company_id:
          $ref: '#/components/schemas/FlexibleCompanyId'
        company_url:
          type: string
        sub_account_email:
          type: string
    SimilarCompaniesRequest:
      type: object
      properties:
        company_id:
          type: integer
          format: int64
        website:
          type: string
        domain:
          type: string
        url:
          type: string
        limit:
          type: integer
        per_page:
          type: integer
        page:
          type: integer
        display_start:
          type: integer
        search_data:
          type: object
          additionalProperties: true
    SearchJSONRequest:
      type: object
      description: Flexible search filter document (employee/company modes).
      additionalProperties: true
    CompanyEmployeesDataRequest:
      type: object
      description: 'Advanced employee/company search request body. All fields are optional unless noted.

        Legacy PHP field names are preserved for compatibility.

        '
      properties:
        company_ids:
          type: string
          description: Company unique identifier(s). Comma-separated IDs.
        company_id:
          type: integer
          description: Single company ID, accepted as an alias for `company_ids`. When both are sent, `company_ids` wins.
        employee_company/company_url:
          type: string
          description: Company URL/domain filter.
          x-lead411-wire-names:
          - employee_company
          - company_url
        user_search_string/text_to_search:
          type: string
          description: Search companies by URL. Example `cisco.com,openai.com`.
          x-lead411-wire-names:
          - user_search_string
          - text_to_search
        Search_array:
          type: string
          description: Comma-separated company domains/URLs (bulk company search).
        title:
          type: string
          description: 'Comma-separated titles. Used for people MATCH only when `title_keyword` is omitted.

            Same wrappers as `title_keyword`.

            '
        title_keyword:
          type: string
          description: 'Job-title MATCH (comma-separated). Wrappers:

            `CEO` = keyword plus VP/CEO-style alias expansion;

            `''Chief Executive''` (or `"Chief Executive"`) = phrase `@(title)("Chief Executive")`;

            `[CEO]` = whole title equals CEO (`@(title)("^CEO$")`).

            Prefix a token with `!` or `-` to exclude it.

            Example: `[CEO],''Chief Executive'',cfo`.

            '
        Title_array:
          type: string
          description: Confirmed title list from the UI (comma-separated). People MATCH uses `title_keyword` (and `title`
            as fallback), not this field.
        country_code/country_select:
          type: string
          description: Two-character country code (e.g. `US`).
          x-lead411-wire-names:
          - country_code
          - country_select
        State_array/state/state_array/region_code/region_array:
          type: string
          description: State/province abbreviation codes for US/Canada. Example `CA,ON`.
          x-lead411-wire-names:
          - State_array
          - state
          - state_array
          - region_code
          - region_array
        cityPostal/US_zipcodes/zip:
          type: string
          description: City postal/zip codes. Example `98052,02142`.
          x-lead411-wire-names:
          - cityPostal
          - US_zipcodes
          - zip
        range:
          type: integer
          description: Mile radius around zip code.
        zip_location_for:
          type: string
          description: Zip scope (`zip_location_company` or `zip_location_employee`).
        include_branches:
          type: string
          description: Include branch locations (`yes` / `no`).
        Area_Codes/areaCode:
          type: string
          description: HQ area codes. Example `303,212,415`.
          x-lead411-wire-names:
          - Area_Codes
          - areaCode
        Industry_Codes/industryCode:
          type: string
          description: Classic Lead411 industry IDs (comma-separated). Values over 999 are treated as LinkedIn industry IDs
            (same routing as `industry_linkedin`). Example `48,500`.
          x-lead411-wire-names:
          - Industry_Codes
          - industryCode
        industry_linkedin:
          type: string
          description: LinkedIn industry IDs (comma-separated). Separate taxonomy from classic `Industry_Codes`. Resolve IDs
            with `POST /options/search_industry_linkedin_keywords`. Example `1430,1247`.
        industry_description_string/Industry:
          type: string
          description: Free-text industry description keywords (comma-separated). Not an ID filter (unlike `Industry_Codes`
            / `industry_linkedin`). Example `software,saas`.
          x-lead411-wire-names:
          - industry_description_string
          - Industry
        SIC_Codes/sic:
          type: string
          description: Four-digit SIC codes. Example `7372`.
          x-lead411-wire-names:
          - SIC_Codes
          - sic
        company_description_string:
          type: string
          description: Keywords in company description/bio.
        product_keyword:
          type: string
          description: Product keyword filter.
        keyword_match_text:
          type: string
          description: Keyword match mode (e.g. `anyMatch`).
        Technology_array/SoftwareHardware_array/SoftwareHardware/softwareHardware/technology:
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          description: Technology stack keywords as a comma-separated string or JSON string array. Example `netsuite` or `["netsuite","netsuite_predict"]`.
            Prefer tokens from `POST /search/search_technology` (`value`, e.g. `netsuite_predict`). Also send `technology_uses_text`
            with these keywords.
          x-lead411-wire-names:
          - Technology_array
          - SoftwareHardware_array
          - SoftwareHardware
          - softwareHardware
          - technology
        technology_uses_text:
          type: string
          description: 'Include vs exclude the technologies in `Technology_array` / `SoftwareHardware`. `technology_uses_yes`
            (default when omitted) keeps companies/people whose indexed stack includes those keywords. `technology_uses_no`
            keeps those whose stack does **not** include them. The keywords field names the tech; this flag is required to
            say whether you want users of it or non-users. Has no effect if no technology keywords are sent.

            '
        news_category_source:
          type: string
          description: News/press event category IDs (comma-separated), matching PHP API behavior. Use `-1` for all event
            categories. When dates are omitted, both dates default to today.
        news_date_from:
          type: string
          description: Press/news start date (`YYYY-MM-DD`).
        news_date_to:
          type: string
          description: Press/news end date (`YYYY-MM-DD`).
        currently_hiring_title:
          type: string
          description: Job opening title keyword.
        hiring_date:
          type: string
          description: Job posting date filter (`YYYY-MM-DD`).
        Employee_Skills/employeeSkills:
          type: string
          description: Employee skills keywords (comma-separated).
          x-lead411-wire-names:
          - Employee_Skills
          - employeeSkills
        FilterEmployee/employee_size:
          type: string
          description: Employee size range IDs.
          x-lead411-wire-names:
          - FilterEmployee
          - employee_size
        FilterRevenue/revenue_ids:
          type: string
          description: Revenue range IDs.
          x-lead411-wire-names:
          - FilterRevenue
          - revenue_ids
        FilterLevel/employee_level:
          type: string
          description: Seniority filter (`c_level`, `vp_level`, `director_level`, `manager_level`).
          x-lead411-wire-names:
          - FilterLevel
          - employee_level
        email_filter/peopleResults:
          type: string
          description: Email filter (e.g. `peopleResultsEmails`).
          x-lead411-wire-names:
          - email_filter
          - peopleResults
        suppression_filter/suppressedResult:
          type: string
          description: 'LEGACY - kept only for older clients. Combined switch that suppresses people AND companies at once,
            with no way to pick individual lists.

            Values: `suppressed_no` (default, nothing suppressed), `suppressed_yes` (exclude everything you suppressed), `suppressed_teamlists`
            (exclude everything suppressed by any member of your team).

            Use `EmployeeSuppression` and `CompanySuppression` instead - they cover the same behaviour and additionally support
            list-level targeting via `employee_suppression_lists_ids` / `company_suppression_lists_ids`.

            If sent together with those fields it is not ignored: all exclusions are added together, so a legacy `suppressed_yes`
            here can hide more records than the granular fields alone.'
          x-lead411-wire-names:
          - suppression_filter
          - suppressedResult
        EmployeeSuppression:
          type: string
          description: 'Excludes PEOPLE that sit on your saved employee suppression lists. Values:

            `suppressed_no` - default, no employee suppression.

            `suppressed_yes` - exclude people suppressed under your own account.

            `suppressed_teamlists` - exclude people suppressed by any member of your team.

            Which lists are used is controlled by `employee_suppression_lists_ids`, which is only read when this field is
            `suppressed_yes` or `suppressed_teamlists`.

            Example: `"EmployeeSuppression": "suppressed_yes"` with `"employee_suppression_lists_ids": "3106,3124"` hides
            only people on lists 3106 and 3124; with `"all"` or an empty value it hides people on every employee suppression
            list.

            '
          enum:
          - suppressed_no
          - suppressed_yes
          - suppressed_teamlists
          example: suppressed_no
        CompanySuppression:
          type: string
          description: 'Excludes COMPANIES (and therefore their people) that sit on your saved company suppression lists.
            Values:

            `suppressed_no` - default, no company suppression.

            `suppressed_yes` - exclude companies suppressed under your own account.

            `suppressed_teamlists` - exclude companies suppressed by any member of your team.

            Which lists are used is controlled by `company_suppression_lists_ids`, which is only read when this field is `suppressed_yes`
            or `suppressed_teamlists`.

            Example: `"CompanySuppression": "suppressed_teamlists"` with `"company_suppression_lists_ids": "412"` hides company
            list 412 for every team member; with `"all"` or an empty value it hides every company suppression list.

            '
          enum:
          - suppressed_no
          - suppressed_yes
          - suppressed_teamlists
          example: suppressed_no
        employee_suppression_lists_ids:
          type: string
          description: 'Comma-separated employee suppression list IDs that narrow `EmployeeSuppression`. Ignored unless `EmployeeSuppression`
            is `suppressed_yes` or `suppressed_teamlists`.

            Send numeric IDs (e.g. `3106,3124,3144`) to suppress only those lists, or `all` / omit the field to suppress every
            employee list. If the value starts with `all`, the remaining IDs are not needed.

            '
          example: 3106,3124
        company_suppression_lists_ids:
          type: string
          description: 'Comma-separated company suppression list IDs that narrow `CompanySuppression`. Ignored unless `CompanySuppression`
            is `suppressed_yes` or `suppressed_teamlists`.

            Send numeric IDs (e.g. `412,507`) to suppress only those lists, or `all` / omit the field to suppress every company
            list. If the value starts with `all`, the remaining IDs are not needed.

            '
          example: 412,507
        exportedResults:
          type: string
          description: Exported filter (e.g. `exported_yes`, `exported_no`).
        linkedinResult:
          type: string
          description: LinkedIn URL filter (e.g. `linkedin_yes`, `linkedin_no`).
        has_direct_dialResults:
          type: string
          description: Direct dial filter (`has_direct_dial_yes`, `has_direct_dial_no`, or shorthand `yes`/`no`).
        has_mobile_dialResults:
          type: string
          description: Mobile dial filter (`has_mobile_dial_yes`, `has_mobile_dial_no`).
        reachSuppression:
          type: string
          description: Reach suppression filter.
        default_sort_by:
          type: string
          description: '**Sort by person** (always applied when passed):

            `empDepartmentASC`, `empDepartmentDesc`, `empLastASC`, `empLastDesc`, `empFirstASC`, `empFirstDesc`


            **Sort by ranking** (always applied when passed):

            `leadScoring`, `yearlyRevDesc`, `yearlyRevAsc`, `empSizeDesc`, `empSizeAsc`, `companyNameDesc`, `companyNameAsc`,
            `bomboraRank`


            **Default when omitted/unknown:** `leadScoring`. If `company_ids` is set and sort is omitted/unknown → `empDepartmentASC`.

            '
          enum:
          - yearlyRevDesc
          - yearlyRevAsc
          - empSizeDesc
          - empSizeAsc
          - companyNameDesc
          - companyNameAsc
          - leadScoring
          - bomboraRank
          - empDepartmentASC
          - empDepartmentDesc
          - empLastASC
          - empLastDesc
          - empFirstASC
          - empFirstDesc
          example: yearlyRevDesc
        search_result_filter:
          type: string
          description: Result type (`company`, `employee`, `resultTypeCompany`, etc.).
        FilterType:
          type: string
          description: Legacy composite filter string (usually auto-built when omitted).
        since_date:
          type: string
          description: Records updated since date.
        date_verified:
          type: string
          description: Email verification date filter.
        start_date:
          type: string
          description: Employee start date filter.
        ddaddedsince_date:
          type: string
          description: Direct dial added since date.
        mobileaddedsince_date:
          type: string
          description: Mobile dial added since date.
        year_founded:
          type: string
          description: Year founded range (`min,max`, e.g. `1950,2025`).
        employee_growth:
          type: string
          description: Employee growth range (`min,max`, e.g. `-100,100`).
        company_number_of_branches_range:
          type: string
          description: Branch count range (`min,max`).
        per_company_match:
          type: string
          description: Per-company match mode (`all`, etc.).
        exact_widenet_value:
          type: string
          description: Exact/widenet match mode (`exact`, etc.).
        leadScore:
          type: boolean
          description: Enable lead scoring sort/filter.
        getOnlyCountOnResults:
          type: boolean
          description: Return counts only (no result rows).
        page:
          type: integer
          description: Page number (default 1).
        per_page/limit:
          type: integer
          description: Records per page (max 100).
          x-lead411-wire-names:
          - per_page
          - limit
        display_start/start:
          type: integer
          description: Legacy offset for pagination.
          x-lead411-wire-names:
          - display_start
          - start
        sub_account_email:
          type: string
          description: Optional sub-account email when acting on behalf of a sub-user.
      additionalProperties: true
    CompanyListRequest:
      type: object
      required:
      - companies
      properties:
        companies:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              company_name:
                type: string
              linkedin_url:
                type: string
        sub_account_email:
          type: string
    CompanyCSVRequest:
      type: object
      properties:
        companies:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              company_name:
                type: string
              linkedin_url:
                type: string
        user_search_string:
          type: string
          description: Pipe-separated company URLs
        company_urls:
          type: array
          items:
            type: string
        filename:
          type: string
        download_all:
          type: string
        sub_account_email:
          type: string
    ExportDownloadRequest:
      type: object
      required:
      - select_action_download
      properties:
        select_action_download:
          type: string
        company_id:
          type: string
        employee_id:
          type: string
        download_company_employee:
          type: string
        download_all:
          type: string
        filename:
          type: string
        sub_account_email:
          type: string
        export_type:
          type: string
      additionalProperties: true
    CRMFieldsRequest:
      type: object
      required:
      - crm
      properties:
        crm:
          type: string
        type:
          type: string
    SaveCRMMappingRequest:
      type: object
      required:
      - crm
      - lead_vals
      - crm_vals
      properties:
        crm:
          type: string
        lead_vals:
          type: array
          items:
            type: string
        crm_vals:
          type: array
          items:
            type: string
        type:
          type: string
        save_fields_type:
          type: string
        fields_type_name:
          type: string
        crm_action_values:
          type: object
          additionalProperties: true
    TokenData:
      type: object
      properties:
        token:
          type: string
        access_token:
          type: string
        refresh_token:
          type: string
        expires_in:
          type: integer
        token_type:
          type: string
    OAuthCodeData:
      type: object
      properties:
        code:
          type: string
        state:
          type: string
    CheckTokenData:
      type: object
      properties:
        valid:
          type: boolean
        customer_id:
          type: integer
          format: int64
    LoggedOutData:
      type: object
      properties:
        logged_out:
          type: boolean
    CustomerProfile:
      type: object
      properties:
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
        phone:
          type: string
        company:
          type: string
        company_url:
          type: string
        member_level:
          type: string
        newsletter:
          type: boolean
        unlock_quota:
          type: integer
        bonus_quota:
          type: integer
        package_id:
          type: integer
        seats:
          type: integer
        stripe_id:
          type: string
        payment_method:
          type: string
        customer_type:
          type: string
        no_of_prospect_month:
          type: integer
        no_of_users_loggin_in:
          type: integer
        date_signed_up:
          type: string
          format: date-time
          nullable: true
    CustomerProfileExtended:
      allOf:
      - $ref: '#/components/schemas/CustomerProfile'
      - type: object
        properties:
          customer_id:
            type: integer
            format: int64
    CustomerQuota:
      type: object
      properties:
        unlock_quota:
          type: integer
        bonus_quota:
          type: integer
        total_quota:
          type: integer
    CustomerUnlockStats:
      allOf:
      - $ref: '#/components/schemas/CustomerQuota'
      - type: object
        properties:
          total_unlocks:
            type: integer
          unlocks_this_month:
            type: integer
          credits_used_total:
            type: integer
          credits_used_monthly:
            type: integer
    PHPResultRow:
      type: object
      properties:
        employee_id:
          type: string
        company_id:
          type: string
        employee_count:
          type: integer
        json_meta:
          type: object
          additionalProperties: true
        customer_exported:
          type: boolean
        customer_company_suppression:
          type: boolean
        customer_employee_suppression:
          type: boolean
        lead411crm:
          nullable: true
        drip_bin:
          type: boolean
        in_cadence:
          type: boolean
        in_watchlist:
          type: boolean
        in_realtime:
          type: boolean
        employee_exists_in_cart:
          type: boolean
        contact_status:
          type: string
    PHPSearchResult:
      type: object
      properties:
        totalRows:
          oneOf:
          - type: string
          - type: integer
        showingRows:
          type: integer
        iDisplayLength:
          type: integer
        iFilteredTotal:
          oneOf:
          - type: string
          - type: integer
        countRecords:
          oneOf:
          - type: string
          - type: integer
        page:
          type: integer
        record_for:
          type: string
        AllResults:
          type: array
          items:
            $ref: '#/components/schemas/PHPResultRow'
        TotalPeople:
          nullable: true
        totalRecordsText:
          type: string
    SimilarCompaniesResult:
      type: object
      properties:
        source_company_id:
          type: integer
        totalRows:
          type: integer
        showingRows:
          type: integer
        iDisplayLength:
          type: integer
        AllResults:
          type: array
          items:
            type: object
            additionalProperties: true
        record_for:
          type: string
        iFilteredTotal:
          type: integer
        TotalPeople:
          nullable: true
        page:
          type: integer
        countRecords:
          type: integer
        is_approximate:
          type: boolean
    CompanyInfoData:
      type: object
      properties:
        company_id:
          type: integer
          format: int64
        json_meta:
          type: object
          additionalProperties: true
        lead_score: {}
        employee_count:
          type: integer
          format: int64
        offset:
          type: integer
        company_suppression:
          type: string
          description: Optional; omitted when excluded.
        indeed_data:
          type: array
          description: Optional; up to 10 job rows, omitted when excluded.
          items:
            type: object
            additionalProperties: true
        hiring_zip_code:
          description: Optional; hiring geography rows or an empty string, omitted when excluded.
        company_outside_tech_data:
          type: array
          description: Optional; first 50 associated technologies (not paginated), omitted when excluded.
          items:
            $ref: '#/components/schemas/CompanyTechItem'
        news_data:
          type: array
          description: Optional; up to 10 news rows, omitted when excluded.
          items:
            $ref: '#/components/schemas/CompanyNewsItem'
      additionalProperties: true
    EmployeeData:
      type: object
      properties:
        employee_id:
          type: integer
        company_id:
          type: integer
        contact_status:
          type: string
      additionalProperties: true
    EmployeeListData:
      type: array
      items:
        $ref: '#/components/schemas/EmployeeData'
    CompanyEmployeesData:
      type: object
      properties:
        employees:
          type: array
          items:
            $ref: '#/components/schemas/EmployeeData'
        total:
          type: integer
        page:
          type: integer
        page_size:
          type: integer
    CompanyNewsItem:
      type: object
      properties:
        company_id:
          type: integer
          format: int64
        date_created:
          type: string
          format: date
        URL:
          type: string
    CompanyNewsData:
      type: object
      required:
      - company_id
      - news_data
      properties:
        company_id:
          type: integer
          format: int64
        news_data:
          type: array
          items:
            $ref: '#/components/schemas/CompanyNewsItem'
    CompanyJobItem:
      type: object
      properties:
        company_id:
          type: integer
          format: int64
        job_title:
          type: string
        job_location:
          type: string
        job_state:
          type: string
        job_zipcode:
          type: string
        company_job_url:
          type: string
        created_date:
          type: string
        job_posting_date:
          type: string
          format: date
    CompanyJobsData:
      type: object
      required:
      - company_id
      - indeed_data
      - hiring_zip_code
      properties:
        company_id:
          type: integer
          format: int64
        indeed_data:
          type: array
          description: Up to 10 job rows.
          items:
            $ref: '#/components/schemas/CompanyJobItem'
        hiring_zip_code:
          description: Hiring geography rows, or an empty string when unavailable.
    CompanyTechItem:
      type: object
      properties:
        id:
          type: integer
        technology:
          type: string
        categories:
          type: string
    CompanyTechData:
      type: object
      required:
      - company_id
      - json_meta
      - company_outside_tech_data
      - page
      - limit
      - total
      - total_pages
      properties:
        company_id:
          type: integer
          format: int64
        json_meta:
          type: object
          description: Company-specific profile metadata.
          additionalProperties: true
        company_outside_tech_data:
          type: array
          description: One page of technologies associated with the requested company (always 50 per page).
          items:
            $ref: '#/components/schemas/CompanyTechItem'
        page:
          type: integer
          description: Current page (1-based). Defaults to 1 when omitted or less than 1.
        limit:
          type: integer
          description: Page size. Always 50.
        total:
          type: integer
          format: int64
          description: Total technologies associated with the company.
        total_pages:
          type: integer
          description: Number of pages at the fixed page size of 50.
    SearchCompanyEmployeesData:
      type: object
      properties:
        companyEmployees:
          type: array
          description: Matching employees for the company or LinkedIn person lookup.
          items:
            type: object
            additionalProperties: true
        researchEmails:
          description: Researched emails for returned employees, keyed by employee_id. Empty array when none.
        employees_limit:
          type: integer
          description: Page size used for this request (per_page or limit).
        limit_offset:
          description: Pagination offset used for this request.
          nullable: true
        more_employee_available:
          type: boolean
          description: Whether more employees exist after this page (company list path).
        search_name:
          type: string
          description: Echo of the name filter.
        search_dept:
          type: string
          description: Echo of the department filter.
        sort_order:
          type: string
          description: Effective sort direction.
        sort_option:
          type: string
          description: Effective sort field.
    CompanyListResultItem:
      type: object
      properties:
        status:
          type: string
        input:
          type: object
          properties:
            url:
              type: string
            company_name:
              type: string
            linkedin_url:
              type: string
        company_id:
          type: integer
          nullable: true
        company:
          allOf:
          - $ref: '#/components/schemas/CompanyInfoData'
          nullable: true
    CompanyListData:
      type: object
      properties:
        summary:
          type: object
          additionalProperties: true
        results:
          type: array
          items:
            $ref: '#/components/schemas/CompanyListResultItem'
    CompanyCSVExportData:
      type: object
      properties:
        download_link:
          type: string
        summary:
          type: object
          additionalProperties: true
        row_count:
          type: integer
    UnlockEmployeeData:
      type: object
      properties:
        status:
          type: string
        message:
          type: string
        downloaded_by:
          type: string
        quota:
          type: object
          additionalProperties: true
        employee_id:
          type: integer
        employee_details:
          type: object
          additionalProperties: true
        employees:
          type: array
          items:
            type: object
            additionalProperties: true
    SuppressionInsertData:
      type: object
      properties:
        employee_ids:
          type: array
          items:
            type: integer
    SuppressionListData:
      type: object
      properties:
        employees:
          type: array
          items:
            type: object
            properties:
              employee_id:
                type: integer
              date_created:
                type: string
                format: date-time
        companies:
          type: array
          items:
            type: object
            properties:
              company_id:
                type: integer
              date_created:
                type: string
                format: date-time
    DeletedFlagData:
      type: object
      properties:
        deleted:
          type: boolean
    SuppressionCompanyAddData:
      type: object
      properties:
        company_id:
          type: integer
    OptionsItem:
      type: object
      properties:
        label:
          type: string
        value:
          type: string
        id:
          nullable: true
        parent_id:
          nullable: true
      additionalProperties: true
    OptionsListData:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/OptionsItem'
        total:
          type: integer
    SearchSortByOptionsData:
      type: object
      description: 'Ranking sort labels for `default_sort_by` (`leadScoring`, revenue, size, company name, Bombora).

        Person sorts (`empDepartment*`, `empLast*`, `empFirst*`) are not in this dropdown — pass them directly on search requests.

        '
      properties:
        display_name:
          type: string
          example: Sort By
        input_type:
          type: string
          example: dropdown
        default_value:
          type: string
          example: yearlyRevDesc
        values:
          type: object
          additionalProperties:
            type: string
          example:
            yearlyRevDesc: Revenue (High to Low)
            yearlyRevAsc: Revenue (Low to High)
            empSizeDesc: Company Size (High to Low)
            empSizeAsc: Company Size (Low to High)
            companyNameDesc: Company Name (A-Z)
            companyNameAsc: Company Name (Z-A)
            leadScoring: Lead Scoring
            bomboraRank: Bombora Rank
            rules: none
      required:
      - display_name
      - input_type
      - default_value
      - values
    ExportDownloadData:
      type: object
      properties:
        offline:
          type: boolean
        show_dialog:
          type: boolean
        download_id:
          nullable: true
        unique_id:
          nullable: true
        already_queued:
          type: boolean
        message:
          type: string
        estimated_rows:
          type: integer
        download_link:
          type: string
      additionalProperties: true
    GenericObjectData:
      type: object
      additionalProperties: true
security:
- ApiKeyAuth: []
- BearerAuth: []
