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

# Retrieve a single search

> Get the result of a single reverse lookup

## Authentication

<ParamField header="x-api-key" type="string" required>
  Your API key
</ParamField>

## Query Parameters

<ParamField query="id" type="string" required>
  The search identifier returned by `POST /reverse-contact/single`.

  **Example:** `550e8400-e29b-41d4-a716-446655440000`
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.reverselooker.com/reverse-contact/single?id=550e8400-e29b-41d4-a716-446655440000" \
    -H "x-api-key: your_api_key"
  ```

  ```javascript Node.js theme={null}
  const searchId = '550e8400-e29b-41d4-a716-446655440000';

  const response = await fetch(
    `https://api.reverselooker.com/reverse-contact/single?id=${searchId}`,
    {
      headers: {
        'x-api-key': 'your_api_key'
      }
    }
  );

  const data = await response.json();

  if (data.qualification === 'found') {
    console.log(data.result);
  }
  ```

  ```python Python theme={null}
  import requests

  search_id = '550e8400-e29b-41d4-a716-446655440000'

  response = requests.get(
      f'https://api.reverselooker.com/reverse-contact/single?id={search_id}',
      headers={
          'x-api-key': 'your_api_key'
      }
  )

  data = response.json()

  if data['qualification'] == 'found':
      print(data['result'])
  ```
</RequestExample>

<ResponseExample>
  ```json 200 - Profile found theme={null}
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "email": "john.doe@company.com",
    "created_at": "2024-01-15T10:30:00Z",
    "qualification": "found",
    "result": {
      "first_name": "John",
      "last_name": "Doe",
      "full_name": "John Doe",
      "headline": "Senior Software Engineer at Company",
      "company_name": "Company Inc.",
      "location": "San Francisco, California",
      "linkedin_url": "https://linkedin.com/in/johndoe",
      "locale": "en_US",
      "summary": "Experienced software engineer with 10+ years...",
      "skills": ["JavaScript", "Python", "AWS", "React"],
      "experience": {
        "experience_count": 4,
        "experience_history": [
          {
            "title": "Senior Software Engineer",
            "company": "Company Inc.",
            "start_date": "2020-01",
            "end_date": null,
            "duration": "4 years"
          },
          {
            "title": "Software Engineer",
            "company": "Previous Corp",
            "start_date": "2016-06",
            "end_date": "2019-12",
            "duration": "3 years 6 months"
          }
        ]
      },
      "education": {
        "education_history": [
          {
            "school_name": "Stanford University",
            "degree_name": "Bachelor's Degree",
            "field_of_study": "Computer Science"
          }
        ]
      }
    }
  }
  ```

  ```json 200 - Search in progress theme={null}
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "email": "john.doe@company.com",
    "created_at": "2024-01-15T10:30:00Z",
    "qualification": "ongoing",
    "result": null
  }
  ```

  ```json 200 - Profile not found theme={null}
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "email": "john.doe@company.com",
    "created_at": "2024-01-15T10:30:00Z",
    "qualification": "not_found",
    "result": null
  }
  ```

  ```json 401 - Unauthorized theme={null}
  {
    "error": "Invalid API key"
  }
  ```

  ```json 404 - Search not found theme={null}
  {
    "error": "Search not found"
  }
  ```
</ResponseExample>

## Response

<ResponseField name="id" type="string" required>
  Unique search identifier.
</ResponseField>

<ResponseField name="email" type="string" required>
  The searched email.
</ResponseField>

<ResponseField name="created_at" type="string" required>
  Search creation date (ISO 8601 format).
</ResponseField>

<ResponseField name="qualification" type="string" required>
  Search status: `ongoing`, `found`, or `not_found`.
</ResponseField>

<ResponseField name="result" type="object">
  The LinkedIn profile found. `null` if `qualification` is not `found`.

  <Expandable title="Profile properties">
    <ResponseField name="result.first_name" type="string">
      First name
    </ResponseField>

    <ResponseField name="result.last_name" type="string">
      Last name
    </ResponseField>

    <ResponseField name="result.full_name" type="string">
      Full name
    </ResponseField>

    <ResponseField name="result.headline" type="string">
      LinkedIn headline/title
    </ResponseField>

    <ResponseField name="result.company_name" type="string">
      Current company
    </ResponseField>

    <ResponseField name="result.location" type="string">
      Location
    </ResponseField>

    <ResponseField name="result.linkedin_url" type="string">
      LinkedIn profile URL
    </ResponseField>

    <ResponseField name="result.locale" type="string">
      Profile language (e.g., `en_US`, `fr_FR`)
    </ResponseField>

    <ResponseField name="result.summary" type="string">
      Profile summary/bio
    </ResponseField>

    <ResponseField name="result.skills" type="string[]">
      List of skills
    </ResponseField>

    <ResponseField name="result.experience" type="object">
      Work history

      <Expandable title="Details">
        <ResponseField name="result.experience.experience_count" type="number">
          Total number of experiences
        </ResponseField>

        <ResponseField name="result.experience.experience_history" type="array">
          List of experiences with `title`, `company`, `start_date`, `end_date`, `duration`
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="result.education" type="object">
      Education history

      <Expandable title="Details">
        <ResponseField name="result.education.education_history" type="array">
          List of education with `school_name`, `degree_name`, `field_of_study`
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Polling

The search may take a few seconds. Implement polling to check the status:

```javascript theme={null}
async function waitForResult(searchId, apiKey, maxAttempts = 10) {
  for (let i = 0; i < maxAttempts; i++) {
    const response = await fetch(
      `https://api.reverselooker.com/reverse-contact/single?id=${searchId}`,
      { headers: { 'x-api-key': apiKey } }
    );

    const data = await response.json();

    if (data.qualification !== 'ongoing') {
      return data;
    }

    // Wait 2 seconds before retrying
    await new Promise(resolve => setTimeout(resolve, 2000));
  }

  throw new Error('Timeout: search still ongoing');
}
```

<Tip>
  To avoid polling, configure a **webhook** when creating the search. You will be automatically notified when the search is complete.
</Tip>
