> ## 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.

# Find hashed emails

> Turn a LinkedIn profile URL or a work email into SHA-256 hashed emails for ad audiences. Rate limit: 60 requests per rolling second per workspace.

Send a LinkedIn profile URL, a work email, or both. The operation returns the person's emails as SHA-256 hashes, ready to upload to Meta, Google, LinkedIn or TikTok as a customer list or matched audience. Raw email addresses are never returned.

> [!NOTE]
>
> A lookup costs 5 credits when at least one hashed email is found. Not found, validation failures, and lookup failures are not charged. The limit is 60 requests per rolling second per workspace.

## Send a person

| Field | Format |
| - | - |
| `linkedin_url` | A LinkedIn profile URL such as `https://www.linkedin.com/in/jane-doe-example`. Country subdomains, a missing `https://`, query strings and a trailing slash are accepted. Company pages are rejected. |
| `work_email` | The person's work email. It is trimmed and lowercased. |

At least one field is required. When both are sent, both are used to find the person. Any other body field returns `400` with `code: "invalid_input"`.

## Read a successful result

| Field | Meaning |
| - | - |
| `status` | `success` when at least one hashed email was found. |
| `linkedin_url` / `work_email` | The normalized inputs that were looked up. |
| `hashed_email` | The best-matching hash. Use it when you need one value per person. |
| `hashed_emails` | Every hashed email found, best match first. Each entry has `normalized_hash` (use this for ad uploads) and `original_hash`. |
| `hash_algorithm` | Always `sha256`. |
| `credits_used` | Always `5`. |
| `credits_remaining` | Remaining workspace credit balance. |

`normalized_hash` is the SHA-256 of the trimmed, lowercased email, which is the format ad platforms expect for hashed customer lists.

## Errors and retries

| Status | Meaning | Charged |
| - | - | - |
| `400` | Invalid JSON, a body that is not an object, or an unsupported field. | No |
| `401` | Missing or invalid API key. | No |
| `403` | Insufficient credits. At least 5 credits are required before a lookup starts. | No |
| `404` | `status: "not_found"`: no hashed email was found for this person. | No |
| `413` | JSON body larger than 16 KiB. | No |
| `422` | `code: "invalid_input"`: no field sent, a LinkedIn URL that is not a profile URL, or an invalid email. | No |
| `429` | Workspace rate limit exceeded. | No |
| `502` | The lookup failed or returned an invalid result. | No |
| `503` | A service the lookup depends on is temporarily unavailable. | No result is returned |
| `504` | The lookup timed out. | No |

Correct the input before retrying a `400` or `422`. After `429`, retry in a later second. For temporary `502`, `503` or `504` responses, retry with increasing delays and a fixed retry limit.

## In the Airscale app

The same lookup is available as the **Find hashed emails** enrichment in your tables (Enrich & clean, under Enrich contact data). It costs 5 credits per row when a hash is found; the cell shows the best-matching hash and keeps every hash in its details.

## Next step

Review [Authentication](https://docs.airscale.io/api-reference/authentication.md) and [rate limits](https://docs.airscale.io/api-reference/rate-limits.md) before sending lookups in bulk.


## OpenAPI

````yaml openapi.json POST /v1/hashed-emails
openapi: 3.1.0
info:
  title: Airscale Public API
  version: '2026-09-11'
  description: >-
    Search, enrich, resolve public business data, and monitor job changes 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: Job change monitoring
    description: Track LinkedIn profiles and receive job-change events.
  - name: New hire monitoring
    description: Watch companies or the market for people who start a matching role.
  - name: Post engagement monitoring
    description: >-
      Follow LinkedIn company pages and profiles and receive the people who
      engage with their posts.
  - name: Account
    description: Inspect workspace account state.
  - name: Miscellaneous
    description: >-
      Find website technologies and check WhatsApp availability, Meta ads, and
      email deliverability.
paths:
  /v1/hashed-emails:
    post:
      tags:
        - Contact data
      summary: Find hashed emails for ad audiences
      description: >-
        Turns a LinkedIn profile URL or a work email into SHA-256 hashed emails
        you can upload to ad platforms (Meta, Google, LinkedIn, TikTok) as a
        customer list or matched audience. Send either field, or both. Costs 5
        credits when at least one hashed email is found; not found is free.
      operationId: findHashedEmails
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                linkedin_url:
                  type:
                    - string
                    - 'null'
                  description: >-
                    LinkedIn profile URL (linkedin.com/in/...). Company pages
                    are rejected.
                  maxLength: 512
                work_email:
                  type:
                    - string
                    - 'null'
                  description: Work email address of the person.
                  maxLength: 254
              description: >-
                Send linkedin_url, work_email, or both; at least one is
                required. Any other field returns 400.
            examples:
              linkedin:
                value:
                  linkedin_url: https://www.linkedin.com/in/jane-doe-example
              workEmail:
                value:
                  work_email: jane.doe@example.com
              both:
                value:
                  linkedin_url: https://www.linkedin.com/in/jane-doe-example
                  work_email: jane.doe@example.com
      responses:
        '200':
          description: At least one hashed email was found. Costs 5 credits.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    const: success
                  linkedin_url:
                    type: string
                    description: >-
                      The normalized LinkedIn profile URL that was looked up,
                      when one was sent.
                  work_email:
                    type: string
                    description: >-
                      The normalized (lowercased) work email that was looked up,
                      when one was sent.
                  hashed_email:
                    type: string
                    pattern: ^[a-f0-9]{64}$
                    description: >-
                      Best-ranked normalized hash. Same as
                      hashed_emails[0].normalized_hash.
                  hashed_emails:
                    type: array
                    minItems: 1
                    items:
                      type: object
                      properties:
                        normalized_hash:
                          type: string
                          pattern: ^[a-f0-9]{64}$
                          description: >-
                            SHA-256 of the normalized (trimmed, lowercased)
                            email. Use this one for ad audience uploads.
                        original_hash:
                          type:
                            - string
                            - 'null'
                          pattern: ^[a-f0-9]{64}$
                          description: >-
                            SHA-256 of the email as originally found, when
                            available.
                      required:
                        - normalized_hash
                        - original_hash
                      additionalProperties: false
                    description: Every hashed email found for the person, best match first.
                  hash_algorithm:
                    type: string
                    const: sha256
                  credits_used:
                    type: number
                    const: 5
                  credits_remaining:
                    type:
                      - number
                      - 'null'
                    description: Remaining workspace credit balance after the charge.
                required:
                  - status
                  - hashed_email
                  - hashed_emails
                  - hash_algorithm
                  - credits_used
                  - credits_remaining
                additionalProperties: false
              examples:
                found:
                  value:
                    status: success
                    linkedin_url: https://www.linkedin.com/in/jane-doe-example
                    hashed_email: >-
                      86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d
                    hashed_emails:
                      - normalized_hash: >-
                          86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d
                        original_hash: >-
                          86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d
                      - normalized_hash: >-
                          b8cadecdc8dec603ab820de2f80614db594e5ba9a6d19908c35e3e17f67faac3
                        original_hash: >-
                          b8cadecdc8dec603ab820de2f80614db594e5ba9a6d19908c35e3e17f67faac3
                    hash_algorithm: sha256
                    credits_used: 5
                    credits_remaining: 995
        '400':
          description: >-
            Invalid JSON, a body that is not a JSON object, or a field other
            than linkedin_url and work_email. Not charged.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
                    enum:
                      - invalid_input
                required:
                  - error
                  - code
                additionalProperties: true
              examples: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            Insufficient credits. At least 5 credits are required before a
            lookup starts.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
        '404':
          description: >-
            No hashed email was found for this person (status not_found), or the
            path or method is unknown. Not charged.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    const: not_found
                  linkedin_url:
                    type: string
                    description: >-
                      The normalized LinkedIn profile URL that was looked up,
                      when one was sent.
                  work_email:
                    type: string
                    description: >-
                      The normalized (lowercased) work email that was looked up,
                      when one was sent.
                  hashed_email:
                    type: 'null'
                  hashed_emails:
                    type: array
                    maxItems: 0
                    items:
                      type: object
                      properties:
                        normalized_hash:
                          type: string
                          pattern: ^[a-f0-9]{64}$
                          description: >-
                            SHA-256 of the normalized (trimmed, lowercased)
                            email. Use this one for ad audience uploads.
                        original_hash:
                          type:
                            - string
                            - 'null'
                          pattern: ^[a-f0-9]{64}$
                          description: >-
                            SHA-256 of the email as originally found, when
                            available.
                      required:
                        - normalized_hash
                        - original_hash
                      additionalProperties: false
                  credits_used:
                    type: number
                    const: 0
                required:
                  - status
                  - hashed_email
                  - hashed_emails
                  - credits_used
                additionalProperties: false
              examples:
                notFound:
                  value:
                    status: not_found
                    work_email: jane.doe@example.com
                    hashed_email: null
                    hashed_emails: []
                    credits_used: 0
        '413':
          description: JSON body exceeds 16 KiB.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
        '422':
          description: >-
            Neither field was sent, the LinkedIn URL is not a profile URL, or
            the work email is invalid. Not charged; correct the input before
            retrying.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
                    enum:
                      - invalid_input
                required:
                  - error
                  - code
                additionalProperties: true
              examples: {}
        '429':
          description: >-
            Workspace rate limit exceeded (60 requests per rolling second). Not
            charged.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
        '502':
          description: The lookup failed or returned an invalid result. Not charged.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
        '503':
          description: >-
            Authentication, rate limiting, the lookup, or credit settlement is
            temporarily unavailable. No result is returned.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
        '504':
          description: The lookup timed out after 30 seconds. Not charged.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  code:
                    type: string
                required:
                  - error
                additionalProperties: true
              examples: {}
components:
  responses:
    Unauthorized:
      description: The Bearer token is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      additionalProperties: true
      properties:
        error:
          type: string
        message:
          type: string
  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.