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

# Bulk email finder

> Find professional email addresses for a batch of people. Rate limit: 3,000 input items per minute per workspace.

Submit up to 100 people and receive one asynchronous professional-email result per item at your webhook.

<Note>
  The limit is 3,000 input items per minute per workspace. Each item with `status: "success"` costs 2 credits; misses and timeouts are not charged.
</Note>

The acceptance response only confirms that the batch was queued. Processing continues after that response, and each item is delivered separately to `webhook_url`.

## Webhook callbacks

Every callback echoes `custom_id`. When the submitted value is omitted or `null`, Airscale uses that item's zero-based input index.

* A found email has `status: "success"`, the resolved `email`, `email_status: "valid"`, and the public `provider` and `verifier` labels.
* An item skipped after the remaining batch balance drops below 2 credits has `status: "error"`, `error: "insufficient_credits"`, and `email: null`.
* A miss or exhausted lookup has `status: "not_found"` or `status: "timeout"`, respectively, with `email: null`.

<Warning>
  Return a `2xx` response promptly for every callback. Automatic webhook retries are not part of this operation's contract, so persist callbacks and use `custom_id` to reconcile expected and received results.
</Warning>

Add credits before submitting skipped items again.

## Next step

Use [Email finder](/api-reference/email-finder) for a synchronous single-person lookup, or review [Rate limits](/api-reference/rate-limits) before batching requests.


## OpenAPI

````yaml openapi.json POST /v1/email-bulk
openapi: 3.1.0
info:
  title: Airscale Public API
  version: '2026-09-11'
  description: Search, enrich, and resolve public business data with Airscale.
  x-airscale-source-repository: ViceScale/airscale-code
  x-airscale-source-sha: 1de19e1b70a052a4b8d9c2075021a7e5e7a94d51
servers:
  - url: https://api.airscale.io
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Search and discovery
    description: Search people, companies, and the web.
  - name: Contact data
    description: Find professional and personal contact data.
  - name: Profiles and reverse lookup
    description: Extract profiles or resolve a person from known contact data.
  - name: Post engagement
    description: Retrieve and enrich people who liked or commented on LinkedIn posts.
  - name: LinkedIn content
    description: >-
      Search LinkedIn posts, read profile and company feeds, and retrieve
      profile comments and comment reactions.
  - name: Account
    description: Inspect workspace account state.
  - name: Miscellaneous
    description: Check WhatsApp availability, Meta ads, and email deliverability.
paths:
  /v1/email-bulk:
    post:
      tags:
        - Contact data
      summary: Submit a professional email batch
      description: >-
        Accepts up to 100 professional-email inputs and sends results to the
        supplied HTTP webhook URL after processing.
      operationId: findProfessionalEmailsBulk
      requestBody:
        required: true
        description: >-
          Provide a webhook URL and between 1 and 100 inputs. Each input may
          include an optional custom_id and must identify a person by profile or
          by complete name and company information.
        content:
          application/json:
            schema:
              type: object
              required:
                - webhook_url
                - inputs
              additionalProperties: false
              properties:
                webhook_url:
                  type: string
                  minLength: 1
                  pattern: ^http
                inputs:
                  type: array
                  minItems: 1
                  maxItems: 100
                  items:
                    type: object
                    additionalProperties: false
                    properties:
                      custom_id:
                        description: >-
                          If omitted or null, the item's zero-based array index
                          is used; any other JSON value is echoed unchanged.
                      linkedin_profile_url:
                        $ref: '#/components/schemas/LinkedInPersonUrl'
                      first_name:
                        type: string
                        minLength: 1
                      last_name:
                        type: string
                        minLength: 1
                      domain:
                        type: string
                        minLength: 1
                      company_name:
                        type: string
                        minLength: 1
                    if:
                      not:
                        required:
                          - linkedin_profile_url
                    then:
                      required:
                        - first_name
                        - last_name
                      anyOf:
                        - required:
                            - domain
                        - required:
                            - company_name
            examples:
              batch:
                summary: Two synthetic contacts
                value:
                  webhook_url: https://webhook.example.org/email-results
                  inputs:
                    - custom_id: contact-001
                      linkedin_profile_url: https://www.linkedin.com/in/example-person-000000
                    - custom_id: 2002
                      first_name: Sample
                      last_name: Contact
                      company_name: Example Company
      responses:
        '202':
          description: The batch was accepted for asynchronous processing.
          content:
            application/json:
              schema:
                type: object
                required:
                  - status
                  - count
                additionalProperties: false
                properties:
                  status:
                    type: string
                    const: accepted
                  count:
                    type: integer
                    minimum: 1
                    maximum: 100
              examples:
                accepted:
                  summary: Batch accepted
                  value:
                    status: accepted
                    count: 2
        '400':
          description: >-
            The JSON body is invalid or required identification fields are
            missing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            The workspace cannot complete this request because access or
            available credits are insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: The JSON request body exceeds the 256 KiB limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            The workspace rate limit has been exceeded. Try again after the
            current window resets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: >-
            The request could not be completed because of an unexpected server
            error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: >-
            The request could not be completed because a required service
            returned an unsuccessful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    LinkedInPersonUrl:
      type: string
      minLength: 1
      description: >-
        A recognized LinkedIn person-profile URL or identifier. Airscale
        normalizes supported profile inputs.
      example: https://www.linkedin.com/in/example-person-000000
    Error:
      type: object
      additionalProperties: true
      properties:
        error:
          type: string
        message:
          type: string
  responses:
    Unauthorized:
      description: The Bearer token is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Use an Airscale workspace API key. Never expose the key in client-side
        code.

````

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