> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.dealsignal.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.dealsignal.com/_mcp/server.

# Get final results

GET https://app.dealsignal.com/api/v1/lead_enrichments/{id}/final_result

Returns paginated lead data for a **completed** LE job.

* Pages are zero-based (`page=0` is the first page); the default `page_size` is 100.
* `enriched_leads.total` is the number of leads in the job — use it to calculate the
  number of pages.
* Call it only once `is_completed` is `true`. Before that, the response is HTTP `200`
  with `{ message, info }` instead of results. If the job reads `is_completed: true`
  and you still get a `message`, stop retrying and check `page` / `page_size`.

Reference: https://docs.dealsignal.com/api-reference/lead-enrichment/get-lead-enrichment-final-result

## Request

### Path parameters

- `id` (integer, required) — ID of the completed Lead Enrichment job.

### Query parameters

- `api_key` (string, required) — Your Dealsignal API key. Obtain it from the Dealsignal dashboard.
- `page` (integer, optional, default: 0) — Zero-based page number.
- `page_size` (integer, optional, default: 100) — Number of leads per page.

## Response

### 200

A page of results — or, while the job is still running, a message.

- `Lead Enrichment_getLeadEnrichmentFinalResult_Response_200`

## Errors

### 401 Unauthorized Error

Invalid key, inactive account, or expired subscription.

- `message` (string, required)
- `authorization_failure` (boolean, optional)
- `inactive` (boolean, optional)

### 422 Unprocessable Entity Error

No Lead Enrichment job with this `id` exists on your account.

- `message` (string, required)
- `authorization_failure` (boolean, optional)
- `inactive` (boolean, optional)

## Types

### FinalResultResponse

- `lead_enrichment` (LeadEnrichmentJob, optional) — A Lead Enrichment job. Responses can include further keys that are not part of this contract; ignore them.
- `enriched_leads` (FinalResultResponseEnrichedLeads, optional)

### FinalResultNotReady

Returned with HTTP `200` instead of results when the job has not completed yet. Check `is_completed` before fetching results.

- `message` (string, optional)
- `info` (string, optional)

### LeadEnrichmentJob

A Lead Enrichment job. Responses can include further keys that are not part of this contract; ignore them.

- `id` (integer, optional)
- `name` (string, optional)
- `status` (enum, optional) — `Completion Running` means the results are being finalized — treat it as in progress. The job is finished when `is_completed` is `true`.
  - Allowed values: `Created`, `Launched`, `Running`, `Completion Running`, `Completed`
- `is_completed` (boolean, optional) — `true` once results are available (`completed_at` is set).
- `completed_at` (datetime, optional, nullable)
- `created_at` (datetime, optional)
- `updated_at` (datetime, optional)
- `type` (enum, optional) — The job's `match_field` (`name`, `email` or `linkedin_url`).
  - Allowed values: `name`, `email`, `linkedin_url`
- `source_type` (string, optional)
- `profile_type` (enum, optional) — Profile level the job enriches, derived from the request flags.
  - Allowed values: `Contact Profile`, `Lead Profile`, `Full Prospect Profile`, `Full Prospect Profile With Direct Dial`
- `is_full_prospect_profile` (boolean, optional, nullable)
- `total_leads_to_enrich` (integer, optional) — Number of leads submitted in the job.
- `total_enriched_leads` (integer, optional) — Number of leads matched to a Dealsignal contact.

### FinalResultResponseEnrichedLeads

- `total` (integer, optional) — Total number of leads in the job (matched or not). Use it to calculate the number of pages.
- `leads` (list of EnrichedLead, optional)

### EnrichedLead

One lead of the job. Responses can include further keys that are not part of this contract; ignore them. Every key below is always present; contact-derived fields are `null` when the lead was not matched to a contact or the value is not available.

- `custom_columns` (map from string to any, required) — The row you submitted in `lead_data`, keyed by your `keys` (including `unique_identifier`). Use it to correlate results with your records.
- `id` (integer, required, nullable) — The matched Dealsignal contact ID; `null` when not matched.
- `first_name` (string, required, nullable)
- `last_name` (string, required, nullable)
- `company_name` (string, required, nullable)
- `title` (string, required, nullable)
- `changed_company` (boolean, required) — `true` when the contact's primary employer changed within about the last month before the job (many position dates are only month-precise) — not a comparison with the row you submitted. `false` means no change was detected; it also covers leads that couldn't be assessed, so it isn't proof the contact stayed. Computed when `flag_if_lead_changed_company` is set; otherwise `false`.
- `changed_title` (boolean, required, nullable) — `true` when the contact's primary title changed within about the last month before the job — not a comparison with the row you submitted. `false` means no change was detected and also covers leads that couldn't be assessed. Computed when `flag_if_lead_changed_title` is set; `null` when the flag isn't set or the lead wasn't matched to a contact.
- `linkedin_url` (string, required, nullable)
- `company_website` (string, required, nullable)
- `seniorities` (string, required, nullable) — Seniority names, joined with ` || ` when there are several.
- `departments` (string, required, nullable) — Department names, joined with ` || ` when there are several.
- `contact_industry` (string, required, nullable)
- `contact_location` (string, required, nullable)
- `contact_country` (string, required, nullable)
- `contact_state` (string, required, nullable)
- `contact_city` (string, required, nullable)
- `skills` (string, required, nullable)
- `profile_completeness` (enum, required, nullable)
  - Allowed values: `complete`, `rich`, `basic`, `partial`, `poor`
- `enriched_by` (string, required) — Always `dealsignal`.
- `contact_updated_at` (datetime, required, nullable)
- `email` (string, required, nullable) — Work email for the lead's position.
- `email_status` (string, required, nullable) — Verification status of `email`, e.g. `Verified` or `Guaranteed`.
- `phone` (string, required, nullable)
- `mobile_number` (string, required, nullable)
- `direct_phone` (string, required, nullable)
- `direct_phone_verified` (boolean, required, nullable)
- `corporate_phone` (string, required, nullable)
- `corporate_phone_verified` (boolean, required, nullable)
- `corporate_phone_directory` (boolean, required, nullable)
- `current_company_and_title` (LeadCompanyAndTitle, required) — Company and title of the lead's current position; `{}` when none.
- `previous_companies_and_titles` (list of LeadCompanyAndTitle, required) — The contact's ended positions (no guaranteed order); `[]` when none.
- `company_data` (map from string to any, required, nullable) — Company attributes, present only when the job was created with `append_company_data: true` and the lead has a company; otherwise `null`. Keys: `company_id`, `company_name`, `company_social_name`, `company_homepage_url`, `company_domains`, `company_linkedin_url`, `company_employee_low`, `company_employee_high`, `company_employee_range`, `employee_count`, `company_industry`, `company_location`, `company_street_address`, `company_city`, `company_state`, `country_abbr`, `company_country`, `company_zip_code`, `company_date_founded`, `company_updated_at`, `company_linkedin_followers`, `company_type`, `company_specialties`.

### LeadCompanyAndTitle

- `company` (string, optional, nullable)
- `title` (string, optional, nullable)

## Examples

### Completed job

**Response**

```json
{
  "lead_enrichment": {
    "id": 640,
    "name": "Q1 2024 Prospect List",
    "status": "Completed",
    "is_completed": true,
    "completed_at": "2024-06-01T11:30:00Z",
    "created_at": "2024-06-01T10:00:00Z",
    "updated_at": "2024-06-01T11:30:00Z",
    "type": "linkedin_url",
    "source_type": "from_json",
    "profile_type": "Contact Profile",
    "is_full_prospect_profile": false,
    "total_leads_to_enrich": 500,
    "total_enriched_leads": 487
  },
  "enriched_leads": {
    "total": 500,
    "leads": [
      {
        "custom_columns": {
          "first_name": "Jane",
          "last_name": "Smith",
          "company_name": "Acme Corp",
          "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
          "unique_identifier": "1"
        },
        "id": 9207460,
        "first_name": "Jane",
        "last_name": "Smith",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": true,
        "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
        "company_website": "acme.example",
        "seniorities": "VP",
        "departments": "Sales",
        "contact_industry": "Software",
        "contact_location": "San Francisco, California, United States",
        "contact_country": "United States",
        "contact_state": "California",
        "contact_city": "San Francisco",
        "skills": "B2B, SaaS, Sales",
        "profile_completeness": "complete",
        "enriched_by": "dealsignal",
        "contact_updated_at": "2026-06-23T10:30:00Z",
        "email": null,
        "email_status": null,
        "phone": null,
        "mobile_number": null,
        "direct_phone": null,
        "direct_phone_verified": null,
        "corporate_phone": null,
        "corporate_phone_verified": null,
        "corporate_phone_directory": null,
        "current_company_and_title": {
          "company": "Acme Corp",
          "title": "VP of Sales"
        },
        "previous_companies_and_titles": [
          {
            "company": "Globex",
            "title": "Sales Manager"
          }
        ],
        "company_data": null
      }
    ]
  }
}
```

**SDK Code**

```python Completed job
import requests

url = "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result"

querystring = {"api_key":"YOUR_API_KEY","page":"0","page_size":"100"}

response = requests.get(url, params=querystring)

print(response.json())
```

```javascript Completed job
const url = 'https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Completed job
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Completed job
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
```

```java Completed job
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")
  .asString();
```

```php Completed job
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100');

echo $response->getBody();
```

```csharp Completed job
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift Completed job
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Job still running

**Response**

```json
{
  "message": "Your Lead enrichment job is still running, Please wait until it is completed.",
  "info": "Lead Enrichment Job is still running"
}
```

**SDK Code**

```python Job still running
import requests

url = "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result"

querystring = {"api_key":"YOUR_API_KEY","page":"0","page_size":"100"}

response = requests.get(url, params=querystring)

print(response.json())
```

```javascript Job still running
const url = 'https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Job still running
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Job still running
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
```

```java Job still running
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")
  .asString();
```

```php Job still running
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100');

echo $response->getBody();
```

```csharp Job still running
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift Job still running
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/lead_enrichments/640/final_result?api_key=YOUR_API_KEY&page=0&page_size=100")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```