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

> ## Agent Instructions
> Forager is a REST API for B2B people, company and job post data: contact lookups (phone numbers, personal emails, work emails), person, company and job post search, and bulk data feeds.
> Server: https://api-v2.forager.ai. Send the API key in the X-API-KEY header. Most paths include {account_id}. Read FORAGER_API_KEY and FORAGER_ACCOUNT_ID from the environment; never put the key in client-side code, logs or prompts.
> To add Forager to a project, follow https://www.forager.ai/docs/guides/agent-quickstart.md. To pick an endpoint, read https://www.forager.ai/docs/guides/choose-an-endpoint.md. For end-to-end builds, see https://www.forager.ai/docs/recipes/overview.md.
> Most requests spend credits. Do not guess costs; use https://www.forager.ai/docs/api-overview/credit-pricing.md and ask the user before spending credits.
> Use only endpoints and fields defined in https://www.forager.ai/docs/openapi.yaml. Forager has no MCP server for the API yet; the /mcp endpoint on this site searches the documentation only.

# Single work email lookup result

> Get the status and result of a single work email lookup job.

## When to use this endpoint

You submitted a single work email lookup and want its result. Poll until `status` is `completed` or `failed`; polling is free and a `Retry-After` header says when to poll again while the job is still running.

## Example request

```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl "https://api-v2.forager.ai/api/v2/$FORAGER_ACCOUNT_ID/datastorage/person_contacts_lookup/work_emails/$JOB_ID/" \
  -H "X-API-KEY: $FORAGER_API_KEY"
```

Set `JOB_ID` to the `job_id` from the submit response, and `FORAGER_API_KEY` and `FORAGER_ACCOUNT_ID` as in the [quickstart](https://www.forager.ai/docs/api-overview/send-your-first-request.md).

## Example response

```json 200 (illustrative values) theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "job_id": "2b7e1a40-3c5d-4f6e-8a9b-0c1d2e3f4a5b",
  "status": "completed",
  "emails": [
    "jane.doe@acme.com"
  ],
  "error_code": null,
  "person_id": 48213,
  "submitted_lookup": {
    "first_name": "Jane",
    "last_name": "Doe",
    "domain": "acme.com",
    "linkedin_public_identifier": ""
  },
  "date_created": "2026-10-20T08:15:00Z",
  "date_completed": "2026-10-20T08:16:04Z",
  "result": "found"
}
```

A `completed` job has `result` set to `found` or `not_found`; a `failed` job has an `error_code`.

## Credits

This endpoint is free: it does not use credits. See [API credits and pricing](https://www.forager.ai/docs/api-overview/credit-pricing.md).


## OpenAPI

````yaml GET /api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/{job_id}/
openapi: 3.0.3
info:
  title: Forager public API
  version: 1.0.0
  description: Forager public API endpoints documentation
servers:
  - url: https://api-v2.forager.ai
security: []
tags:
  - name: Job Posts
    description: >-
      Search the Forager job-post index. Use these endpoints to find job
      postings by attributes such as title, location, posted date, or hiring
      organization, and to retrieve aggregate totals for a given query before
      paginating through full results.
  - name: Organizations
    description: >-
      Search the Forager organization index. Filter companies by attributes such
      as industry, headcount, location, keywords, and web technologies, and
      retrieve total match counts alongside the result set.
  - name: People
    description: >-
      Look up people and their records. Use the search endpoints to find people
      by role, employer, location, or skills, and the detail-lookup endpoints to
      fetch a full person record by ID, email, or phone number. Contact data has
      its own sections: Phones, Personal Emails, and Work Emails.
  - name: Phones
    description: >-
      Retrieve phone numbers for a known person. Provide identifying information
      (such as a LinkedIn handle or Forager ID) and get back the available phone
      numbers.
  - name: Personal Emails
    description: >-
      Retrieve personal email addresses for a known person. Returns addresses on
      free webmail / consumer providers (Gmail, Outlook, Yahoo, iCloud, Proton,
      and similar); corporate, educational, and other custom domains are
      excluded to keep deliverability high.
  - name: Work Emails
    description: >-
      Find and verify a person's work email address. Submit a lookup (single or
      bulk), poll the job for its result, and optionally receive the result by
      webhook when the job completes.
  - name: Websites
    description: >-
      Look up information about a website, including the organization that owns
      it and the technologies detected on the domain.
  - name: Users
    description: >-
      Manage your Forager account. Retrieve the current authenticated user,
      create and revoke API keys used to authenticate requests to the rest of
      the API, and review the credit balance-change log that records every
      lookup charge or adjustment against your account.
  - name: Autocomplete
    description: >-
      Resolve free-text input into the canonical IDs used elsewhere in the API.
      Each endpoint returns matching options for a search term (industries,
      organizations, organization keywords, locations, person skills, web
      technologies) so they can be passed as filters to the search endpoints.
  - name: Feedback
    description: >-
      Report verification feedback for contact data (phone numbers, personal
      emails, work emails) returned by Forager person lookups. Use these
      endpoints to submit whether a contact value is valid/invalid and whether
      it belongs to the matched person — every submission is stored as a new row
      and is used to improve the accuracy of future lookups.
paths:
  /api/v2/{account_id}/datastorage/person_contacts_lookup/work_emails/{job_id}/:
    get:
      tags:
        - Work Emails
      summary: Single work email lookup result
      description: >-
        Return the current state of a work email lookup. `status` describes the
        job (`queued`, `running`, `awaiting_provider`, `completed`, `failed`)
        and `result` describes the outcome once it is terminal (`found` or
        `not_found`). While the job is not terminal a `Retry-After` header
        suggests when to poll again. Polling never consumes credits.
      operationId: v2_datastorage_person_contacts_lookup_work_emails_retrieve
      parameters:
        - in: path
          name: account_id
          schema:
            type: integer
          required: true
        - in: path
          name: job_id
          schema:
            type: string
            format: uuid
          required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkEmailLookupJob'
          description: ''
        '403':
          $ref: '#/components/responses/AuthenticationFailed'
      security:
        - Api-Key: []
components:
  schemas:
    WorkEmailLookupJob:
      type: object
      description: >-
        The envelope every lookup result is returned in, single or bulk.


        Narrower than the model: the vendor, the verification count and the miss

        reason are recorded but never returned, since they expose how the
        waterfall

        is built and would make swapping a provider a breaking change.


        `status` is how far a lookup got; `result` is what it concluded, and is

        `null` on a row that never ran.


        `emails` is not a column on the job - it comes from the
        `PersonWorkEmail` rows

        sharing its `lookup_key`, read from a map in the serializer context so a
        batch

        costs one cross-database query rather than one per row. Each entry
        carries its

        own `validation_status`, since a person's addresses can be verified

        separately.
      properties:
        job_id:
          type: string
          format: uuid
          readOnly: true
        status:
          allOf:
            - $ref: '#/components/schemas/Status564Enum'
          readOnly: true
        emails:
          type: array
          items:
            type: string
          minLength: 2
          maxLength: 2
          description: >-
            Every confirmed address for this person, shortest first, each with
            its verdict.
          readOnly: true
        error_code:
          readOnly: true
          nullable: true
          oneOf:
            - $ref: '#/components/schemas/ErrorCodeEnum'
            - $ref: '#/components/schemas/NullEnum'
        person_id:
          type: integer
          readOnly: true
          nullable: true
        submitted_lookup:
          type: object
          description: >-
            Echo the row exactly as it was sent.


            Nested rather than four top-level fields, so "what you sent" is
            never

            confused with "what we searched", and so the top level keeps its
            rule

            that an absent value is `null` - here a blank string is the honest
            echo.


            Spelled out key by key rather than dumped from the stored model, so
            a

            new column on `SubmittedFields` becomes a deliberate addition here

            instead of appearing in the response unasked.
          properties:
            first_name:
              type: string
            last_name:
              type: string
            domain:
              type: string
            linkedin_public_identifier:
              type: string
          required:
            - domain
            - first_name
            - last_name
            - linkedin_public_identifier
          readOnly: true
        date_created:
          type: string
          format: date-time
          readOnly: true
        date_completed:
          type: string
          format: date-time
          readOnly: true
          nullable: true
        result:
          type: string
          readOnly: true
      required:
        - date_completed
        - date_created
        - emails
        - error_code
        - job_id
        - person_id
        - result
        - status
        - submitted_lookup
    Status564Enum:
      enum:
        - queued
        - running
        - awaiting_provider
        - completed
        - failed
      type: string
      description: |-
        * `queued` - Queued
        * `running` - Running
        * `awaiting_provider` - Awaiting provider
        * `completed` - Completed
        * `failed` - Failed
    ErrorCodeEnum:
      enum:
        - person_not_found
        - no_current_employer
        - input_unresolved
        - provider_error
        - expired
        - internal_error
      type: string
      description: |-
        * `person_not_found` - No person matched the LinkedIn identifier
        * `no_current_employer` - The person has no current employer on record
        * `input_unresolved` - Submitted input could not be resolved
        * `provider_error` - Provider error
        * `expired` - Expired before completion
        * `internal_error` - Internal error
    NullEnum:
      enum:
        - null
  responses:
    AuthenticationFailed:
      description: >-
        The X-API-KEY header is missing, the key is not valid, or the key does
        not have permission for this resource.
      content:
        application/json:
          schema:
            type: object
            properties:
              detail:
                type: string
          example:
            detail: Authentication credentials were not provided.
  securitySchemes:
    Api-Key:
      type: apiKey
      in: header
      name: X-API-KEY

````

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