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

# Create a Contact Profile Refresh Request

POST https://app.dealsignal.com/api/v1/contact_profile_refresh_requests
Content-Type: application/json

Creates a Contact Profile Refresh Request for the supplied `profiles`. Every profile is
returned right away with the contact matched so far. `contact_data.id`
is `null` until a contact is matched. A **fresh** matched contact is
usually `completed` right away; when `requested_attributes` includes
contact details such as `email`, it can stay in progress until they are
fetched. A **stale** one reads `refreshing`. Stale and unmatched contacts
are refreshed in the background; poll `request_status` until the
request's `status` is `completed` to get them. A `webhook` can
optionally notify you when that happens.

A contact is **stale** when its LinkedIn profile was last verified more
than `contact_refresh_time` days before the request was created (30 days
when the parameter is omitted).

### Authentication

`api_key` may be supplied **either** as a query-string parameter **or**
inside the JSON body. The account must be active with a subscription that
has not expired, and must hold enough credits for the request.

### What the response contains

By default (`synchronous: true`) the response carries the request
envelope **plus** `contact_profile_refreshes` — every profile, each as
`{ custom_columns, contact_data }` with the contact matched so far.
`status` is `running` while background refresh continues, or `completed`
straight away when every profile was resolved during the call. A
`completed` create response is the final result for every profile; any
webhook POSTs for such a request are duplicates. With
`synchronous: false` only the envelope is returned.

The call **never blocks** on the background refresh in either mode.

### Pricing (credits per profile)

Each completed profile with a matched contact is charged in credits.
`requested_attributes` sets the most a profile can cost:

| `requested_attributes` (all names within)                              | Tier                                   | Maximum credits per profile |
| ---------------------------------------------------------------------- | -------------------------------------- | --------------------------- |
| `contact_profile` only, or omitted                                     | Contact Profile                        | 0.25                        |
| … plus `email`                                                         | Lead Profile                           | 1.00                        |
| … plus `corporate_phone`                                               | Full Prospect Profile                  | 1.25                        |
| … plus any of `direct_phone`, `mobile_number`, `cma`, `personal_email` | Full Prospect Profile with Direct Dial | 1.50                        |

A profile is charged at the highest tier its data actually supports, up
to that maximum. For example, if you request `email` but no verified
work email is available, the profile is charged as a Contact Profile.

* **Balance check.** The call is rejected with `422` when your balance
  is too low for the submitted profiles. Keep a margin: a profile can
  cost up to the maximum for the attributes you request.
* **Every refresh is charged.** A contact you have refreshed before is
  charged again when you refresh it through this endpoint.
* **Not charged:** profiles that end without a matched contact
  (`contact_data.id` `null`) or `not_found`, profiles whose contact has
  no current position, and every profile of a `test` request.

Reference: https://docs.dealsignal.com/api-reference/contact-profile-refresh-requests/create-contact-profile-refresh-request

## Request

### Query parameters

- `api_key` (string, optional) — Your Dealsignal API key. On this endpoint it may be supplied here **or** as the `api_key` property of the JSON body — one of the two is required.

### Body (application/json)

This endpoint expects a ContactProfileRefreshRequestInput.

- `profiles` (list of ContactProfileInput, required) — One or more contact profiles to look up and refresh.
- `api_key` (string, optional) — Account API key. Alternative to the `api_key` query-string parameter — supply it in one of the two places.
- `contact_refresh_time` (integer, optional, nullable) — Freshness threshold in days. A matched contact whose LinkedIn profile was last verified more than this many days before the request was created is treated as **stale** and refreshed in the background. **Omit it for the 30-day default** — the request then stores and echoes `null`. `0` compares against the day the request was created: a contact verified on an earlier day is refreshed, one verified the same day is returned as fresh.
- `webhook` (string, optional, nullable) — Optional. URL to notify when the request completes — see the *Contact Profile Refresh Request completed* webhook. The POSTs can repeat and don't carry every profile, so treat them as a signal and read the results with `request_status`. Omit it (the default) or send `""` to rely on polling alone.
- `synchronous` (boolean, optional, default: true) — `true` (default): the response includes **every** profile inline in `contact_profile_refreshes`, with the contact matched so far. A fresh matched contact is usually `completed` right away — when `requested_attributes` includes contact details such as `email`, it can stay in progress until they are fetched; a stale one reads `refreshing`; an unmatched profile has `contact_data.id` `null` and is either still in progress or already closed. `false`: the response carries only the request envelope; poll `request_status` for the profiles. Background refresh of stale and unmatched contacts runs either way — the call **never blocks** on it.
- `find_match_and_refresh` (boolean, optional, default: true) — When `false`, profiles that do not match a Dealsignal contact with a valid LinkedIn profile are closed at creation instead of being searched for in the background: with `contact_data.id` `null` when no contact matched, as `completed` when the matched contact has no valid LinkedIn profile. Matched contacts are refreshed as usual.
- `requested_attributes` (list of RequestedAttribute, optional, default: [{"name":"contact_profile","priority_order":0}]) — Data to request for each profile. Sets the maximum credits a profile can cost — see **Pricing** in the operation description. Defaults to `contact_profile` only. `contact_data` in responses always carries the same fixed set of keys regardless of what you request here; contact details (email, phones) are not part of it.
- `test` (boolean, optional, default: false) — `true` forces `synchronous: true` and flags the request as test data: profiles are matched against test contacts only and closed `completed` immediately, no refresh runs, **no credits are consumed**, and the request is excluded from credit metrics. Your balance must still cover the request. A profile with no matching test contact is also closed `completed`, with `contact_data.id` `null`. In test mode, read the results from the create response.

## Response

### 200

Request created. `contact_profile_refreshes` is present only for `synchronous: true` (the default).

- `id` (integer, optional) — Request ID.
- `unique_identifier` (string, optional) — Use this to poll `request_status`.
- `webhook` (string, optional, nullable) — The `webhook` URL you sent, if any; `null` when omitted (`""` when sent empty).
- `status` (enum, optional) — `running` while background processing continues; `completed` once every profile is resolved (possibly already in the create response).
  - Allowed values: `running`, `completed`
- `contact_refresh_time` (integer, optional, nullable) — The freshness threshold (days) sent at creation, echoed back; `null` when it was omitted (the 30-day default then applies).
- `user` (ContactProfileRefreshRequestUser, optional) — The authenticated account.
- `contact_profile_refreshes` (list of ContactProfileRefreshProfile, optional) — Present only when `synchronous` is `true` (the default): the profiles created inside the call, each with the contact matched so far. Contacts that still have to be refreshed arrive later via the webhook or `request_status`.

## 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 profiles supplied, or insufficient credits for the request.

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

## Types

### ContactProfileInput

One contact to look up and refresh. Supply at least one identifier — `ds_contact_id`, `linkedin_url`, `email`, or the complete `first_name` + `last_name` + `company_name` triple — so Dealsignal can match the contact. A profile with none of them is closed at creation, with `contact_data.id` `null` and the remark `Invalid input data!`. So is a profile that carries only a `linkedin_url` (plus `metadata`) that isn't a linkedin.com URL, such as a shortened link. **The whole object is echoed back.** Every profile in every response and webhook payload carries a `custom_columns` object that is this profile exactly as you submitted it. It is the only correlation key the webhook payload carries. Put your own fields in `metadata`; don't add other keys to the profile object.

- `ds_contact_id` (integer, optional) — Existing Dealsignal contact ID, if known — the most reliable identifier. Send it without other identifiers (adding `metadata` is fine). Profiles that carry it are counted as `requested_with_ds_contact_id` in credit metrics.
- `first_name` (string, optional)
- `last_name` (string, optional)
- `company_name` (string, optional)
- `email` (string, optional)
- `linkedin_url` (string, optional)
- `metadata` (map from string to any, optional) — Arbitrary metadata, echoed back verbatim inside `custom_columns`. Put your own record ID here to correlate webhook results.

### RequestedAttribute

- `name` (enum, required) — Data to request for each profile: `contact_profile`, `email`, `corporate_phone`, `direct_phone`, `mobile_number`, `cma`, `personal_email`. Send only these seven names — other names are not supported and can be charged at the highest tier.
  - Allowed values: `contact_profile`, `email`, `corporate_phone`, `direct_phone`, `mobile_number`, `cma`, `personal_email`
- `priority_order` (integer, optional) — Relative priority of the attribute.

### ContactProfileRefreshRequestUser

The authenticated account.

- `id` (integer, optional)
- `email` (string, optional)
- `name` (string, optional)

### ContactProfileRefreshProfile

One profile of a request — the profile you submitted, echoed back, plus the enriched contact.

- `custom_columns` (map from string to any, optional) — The profile object you submitted, echoed back verbatim.
- `contact_data` (ContactProfileRefreshContactData, optional) — The enriched contact. Always carries the same **fixed set of 33 keys**, whatever you sent in `requested_attributes`. Contact details — `email`, `phone`, `mobile_number`, `direct_phone`, `corporate_phone` — are **never** included here, even when requested. Every contact-derived field is `null` until a contact is matched, except `current_company_and_title` (`{}`) and `previous_companies_and_titles` (`[]`). `search_status`, `match_status`, `remark`, `enrichment_status`, `enriched_by` and the two booleans are always present.

### ContactProfileRefreshContactData

The enriched contact. Always carries the same **fixed set of 33 keys**, whatever you sent in `requested_attributes`. Contact details — `email`, `phone`, `mobile_number`, `direct_phone`, `corporate_phone` — are **never** included here, even when requested. Every contact-derived field is `null` until a contact is matched, except `current_company_and_title` (`{}`) and `previous_companies_and_titles` (`[]`). `search_status`, `match_status`, `remark`, `enrichment_status`, `enriched_by` and the two booleans are always present.

- `id` (integer, required, nullable) — The matched Dealsignal contact ID; `null` until a contact is matched. A finished profile (`completed` or `not_found`) with `id` `null` has no matched contact — use this field, not `search_status`, to tell matched from unmatched profiles.
- `first_name` (string, required, nullable)
- `last_name` (string, required, nullable)
- `logo_url` (string, required, nullable)
- `company_name` (string, required, nullable)
- `title` (string, required, nullable)
- `changed_company` (boolean, required) — Always `true` or `false`, never `null`. Whether the contact's **primary employer** differs from your account's previous refresh of this contact. Identical to `ds_company_change` in the `changes` format. A profile without a verdict yet (refresh not concluded, no contact matched) reads `false`. The first refresh of a contact for your account has no previous refresh to compare with and reads `false` — it establishes the baseline for the next one. `false` therefore does not distinguish "no change" from "no verdict"; use `response_format=changes` and `ds_change_status` when that matters.
- `changed_title` (boolean, required) — Always `true` or `false`, never `null`. Whether the contact's **primary title** differs from your account's previous refresh of this contact — same rules as `changed_company`. Identical to `ds_title_change` in the `changes` format.
- `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) — How complete the contact's profile is; `null` until a contact is matched.
  - Allowed values: `complete`, `rich`, `basic`, `partial`, `poor`
- `enriched_by` (string, required) — Always `dealsignal`.
- `contact_updated_at` (datetime, required, nullable)
- `primary_position` (ContactProfileRefreshContactDataPrimaryPosition, required, nullable) — The contact's primary position; `null` until a contact is matched. Selected independently of `ds_primary_company` / `ds_primary_title` in the `changes` format and can differ from it on some contacts — the change verdict is always about the `ds_primary_*` position.
- `contact_headline` (string, required, nullable)
- `contact_about_me` (string, required, nullable)
- `contact_education` (list of ContactProfileRefreshEducation, required, nullable) — The contact's education, one object per entry; keys without a value are omitted. `[]` when the contact has none, `null` until a contact is matched.
- `current_company_and_title` (ContactProfileRefreshCompanyAndTitle, required) — A snapshot of the contact's current position that may predate the refresh. Read `primary_position` / `current_position_details` for the refreshed state. `{}` when there was no current position or no contact is matched; never `null`.
- `previous_companies_and_titles` (list of ContactProfileRefreshCompanyAndTitle, required) — The contact's ended positions, in no guaranteed order. A snapshot taken together with `current_company_and_title`. `[]` when there were none or no contact is matched; never `null`.
- `search_status` (string, required, nullable) — Processing state of this profile. `completed` and `not_found` are final; `refreshing` means the profile is being refreshed. Any other value means the profile is still in progress — rely on the request's `status` rather than on specific in-progress values. `null` for a profile that was closed without a final status when the request completed. Whether a contact was matched is told by `contact_data.id` (see that field), not by `search_status`.
- `match_status` (string, required) — `found_and_verified` (matched and `search_status: completed`), `found_and_unverified` (matched, not verified by this refresh), `invalid_li_profile` (matched, but the LinkedIn profile is flagged invalid), `not_found`, or a verification note (`Verified`, `Contact Not Found`, `Invalid Source Data - Contact`, `Invalid Source Data - Linkedin Url`, `Invalid Source Data - Email`). Don't use `match_status` to decide whether a profile is finished — use `search_status` and the request's `status`.
- `remark` (string, required, nullable)
- `enrichment_status` (string, required, nullable) — Display label of `search_status`: `Finding A Match`, `Found And Refreshing`, `Found And Enriching`, `Completed`, `Not Found`; `null` for states without a label. A profile that finished (`completed` or `not_found`) without a match reports `Not Found`.
- `current_position_details` (list of ContactProfileRefreshPositionDetail, required, nullable) — The contact's current positions; `null` until a contact is matched.
- `old_position_details` (list of ContactProfileRefreshPositionDetail, required, nullable) — The contact's ended positions; `null` until a contact is matched.

### ContactProfileRefreshContactDataPrimaryPosition

The contact's primary position; `null` until a contact is matched. Selected independently of `ds_primary_company` / `ds_primary_title` in the `changes` format and can differ from it on some contacts — the change verdict is always about the `ds_primary_*` position.

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

### ContactProfileRefreshEducation

One education entry. Keys without a value are omitted.

- `university` (string, optional)
- `major` (string, optional)
- `degree` (string, optional)
- `start_date` (date, optional)
- `end_date` (date, optional)
- `logo_url` (string, optional)

### ContactProfileRefreshCompanyAndTitle

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

### ContactProfileRefreshPositionDetail

- `title` (string, optional, nullable)
- `company_name` (string, optional, nullable)
- `company_linkedin_url` (string, optional, nullable)
- `start_date` (date, optional, nullable)
- `end_date` (date, optional, nullable)
- `country` (string, optional, nullable)
- `company_logo_url` (string, optional, nullable)

## Examples

### Default — inline results, then poll

**Request**

```json
{
  "profiles": [
    {
      "ds_contact_id": 9207460
    },
    {
      "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
      "metadata": {
        "crm_record": "003Dn00000AbCdE"
      }
    }
  ]
}
```

**Response**

```json
{
  "id": 301,
  "unique_identifier": "d4d8e35d-932e-42e9-a9c2-0dabbef16f46",
  "webhook": null,
  "status": "running",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": [
    {
      "custom_columns": {
        "ds_contact_id": 9207460
      },
      "contact_data": {
        "id": 9207460,
        "first_name": "Jane",
        "last_name": "Smith",
        "logo_url": "https://...",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
        "company_website": "https://acme.example",
        "seniorities": "VP",
        "departments": "Sales",
        "contact_industry": "Information Technology & Services",
        "contact_location": "San Francisco, CA, USA",
        "contact_country": "USA",
        "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",
        "primary_position": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "contact_headline": "VP of Sales at Acme Corp",
        "contact_about_me": "...",
        "contact_education": [
          {
            "university": "Example University",
            "degree": "BS"
          }
        ],
        "current_company_and_title": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "previous_companies_and_titles": [],
        "search_status": "completed",
        "match_status": "found_and_verified",
        "remark": null,
        "enrichment_status": "Completed",
        "current_position_details": [
          {
            "title": "VP of Sales",
            "company_name": "Acme Corp",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "start_date": "2015-01-01",
            "end_date": null,
            "country": "USA",
            "company_logo_url": "https://..."
          }
        ],
        "old_position_details": []
      }
    },
    {
      "custom_columns": {
        "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
        "metadata": {
          "crm_record": "003Dn00000AbCdE"
        }
      },
      "contact_data": {
        "id": null,
        "first_name": null,
        "last_name": null,
        "logo_url": null,
        "company_name": null,
        "title": null,
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": null,
        "company_website": null,
        "seniorities": null,
        "departments": null,
        "contact_industry": null,
        "contact_location": null,
        "contact_country": null,
        "contact_state": null,
        "contact_city": null,
        "skills": null,
        "profile_completeness": null,
        "enriched_by": "dealsignal",
        "contact_updated_at": null,
        "primary_position": null,
        "contact_headline": null,
        "contact_about_me": null,
        "contact_education": null,
        "current_company_and_title": {},
        "previous_companies_and_titles": [],
        "search_status": "refreshing",
        "match_status": "not_found",
        "remark": null,
        "enrichment_status": "Found And Refreshing",
        "current_position_details": null,
        "old_position_details": null
      }
    }
  ]
}
```

**SDK Code**

```python Default — inline results, then poll
import requests

url = "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests"

querystring = {"api_key":"YOUR_API_KEY"}

payload = { "profiles": [
        { "ds_contact_id": 9207460 },
        {
            "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
            "metadata": { "crm_record": "003Dn00000AbCdE" }
        }
    ] }
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers, params=querystring)

print(response.json())
```

```javascript Default — inline results, then poll
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"profiles":[{"ds_contact_id":9207460},{"linkedin_url":"https://www.linkedin.com/in/jane-doe-example","metadata":{"crm_record":"003Dn00000AbCdE"}}]}'
};

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

```go Default — inline results, then poll
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY"

	payload := strings.NewReader("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"linkedin_url\": \"https://www.linkedin.com/in/jane-doe-example\",\n      \"metadata\": {\n        \"crm_record\": \"003Dn00000AbCdE\"\n      }\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Default — inline results, then poll
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"linkedin_url\": \"https://www.linkedin.com/in/jane-doe-example\",\n      \"metadata\": {\n        \"crm_record\": \"003Dn00000AbCdE\"\n      }\n    }\n  ]\n}"

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

```java Default — inline results, then poll
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"linkedin_url\": \"https://www.linkedin.com/in/jane-doe-example\",\n      \"metadata\": {\n        \"crm_record\": \"003Dn00000AbCdE\"\n      }\n    }\n  ]\n}")
  .asString();
```

```php Default — inline results, then poll
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY', [
  'body' => '{
  "profiles": [
    {
      "ds_contact_id": 9207460
    },
    {
      "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
      "metadata": {
        "crm_record": "003Dn00000AbCdE"
      }
    }
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Default — inline results, then poll
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"linkedin_url\": \"https://www.linkedin.com/in/jane-doe-example\",\n      \"metadata\": {\n        \"crm_record\": \"003Dn00000AbCdE\"\n      }\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Default — inline results, then poll
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = ["profiles": [
    ["ds_contact_id": 9207460],
    [
      "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
      "metadata": ["crm_record": "003Dn00000AbCdE"]
    ]
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Create profiles in the background

**Request**

```json
{
  "profiles": [
    {
      "ds_contact_id": 9207460
    },
    {
      "ds_contact_id": 9207461
    }
  ],
  "synchronous": false
}
```

**Response**

```json
{
  "id": 302,
  "unique_identifier": "7f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c",
  "webhook": null,
  "status": "running",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  }
}
```

**SDK Code**

```python Create profiles in the background
import requests

url = "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests"

querystring = {"api_key":"YOUR_API_KEY"}

payload = {
    "profiles": [{ "ds_contact_id": 9207460 }, { "ds_contact_id": 9207461 }],
    "synchronous": False
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers, params=querystring)

print(response.json())
```

```javascript Create profiles in the background
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"profiles":[{"ds_contact_id":9207460},{"ds_contact_id":9207461}],"synchronous":false}'
};

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

```go Create profiles in the background
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY"

	payload := strings.NewReader("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"ds_contact_id\": 9207461\n    }\n  ],\n  \"synchronous\": false\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Create profiles in the background
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"ds_contact_id\": 9207461\n    }\n  ],\n  \"synchronous\": false\n}"

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

```java Create profiles in the background
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"ds_contact_id\": 9207461\n    }\n  ],\n  \"synchronous\": false\n}")
  .asString();
```

```php Create profiles in the background
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY', [
  'body' => '{
  "profiles": [
    {
      "ds_contact_id": 9207460
    },
    {
      "ds_contact_id": 9207461
    }
  ],
  "synchronous": false
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Create profiles in the background
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    },\n    {\n      \"ds_contact_id\": 9207461\n    }\n  ],\n  \"synchronous\": false\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Create profiles in the background
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "profiles": [["ds_contact_id": 9207460], ["ds_contact_id": 9207461]],
  "synchronous": false
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Optional webhook notification

**Request**

```json
{
  "profiles": [
    {
      "ds_contact_id": 9207460
    }
  ],
  "webhook": "https://your-server.com/webhooks/dealsignal"
}
```

**Response**

```json
{
  "id": 301,
  "unique_identifier": "d4d8e35d-932e-42e9-a9c2-0dabbef16f46",
  "webhook": null,
  "status": "running",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": [
    {
      "custom_columns": {
        "ds_contact_id": 9207460
      },
      "contact_data": {
        "id": 9207460,
        "first_name": "Jane",
        "last_name": "Smith",
        "logo_url": "https://...",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
        "company_website": "https://acme.example",
        "seniorities": "VP",
        "departments": "Sales",
        "contact_industry": "Information Technology & Services",
        "contact_location": "San Francisco, CA, USA",
        "contact_country": "USA",
        "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",
        "primary_position": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "contact_headline": "VP of Sales at Acme Corp",
        "contact_about_me": "...",
        "contact_education": [
          {
            "university": "Example University",
            "degree": "BS"
          }
        ],
        "current_company_and_title": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "previous_companies_and_titles": [],
        "search_status": "completed",
        "match_status": "found_and_verified",
        "remark": null,
        "enrichment_status": "Completed",
        "current_position_details": [
          {
            "title": "VP of Sales",
            "company_name": "Acme Corp",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "start_date": "2015-01-01",
            "end_date": null,
            "country": "USA",
            "company_logo_url": "https://..."
          }
        ],
        "old_position_details": []
      }
    },
    {
      "custom_columns": {
        "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
        "metadata": {
          "crm_record": "003Dn00000AbCdE"
        }
      },
      "contact_data": {
        "id": null,
        "first_name": null,
        "last_name": null,
        "logo_url": null,
        "company_name": null,
        "title": null,
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": null,
        "company_website": null,
        "seniorities": null,
        "departments": null,
        "contact_industry": null,
        "contact_location": null,
        "contact_country": null,
        "contact_state": null,
        "contact_city": null,
        "skills": null,
        "profile_completeness": null,
        "enriched_by": "dealsignal",
        "contact_updated_at": null,
        "primary_position": null,
        "contact_headline": null,
        "contact_about_me": null,
        "contact_education": null,
        "current_company_and_title": {},
        "previous_companies_and_titles": [],
        "search_status": "refreshing",
        "match_status": "not_found",
        "remark": null,
        "enrichment_status": "Found And Refreshing",
        "current_position_details": null,
        "old_position_details": null
      }
    }
  ]
}
```

**SDK Code**

```python Optional webhook notification
import requests

url = "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests"

querystring = {"api_key":"YOUR_API_KEY"}

payload = {
    "profiles": [{ "ds_contact_id": 9207460 }],
    "webhook": "https://your-server.com/webhooks/dealsignal"
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers, params=querystring)

print(response.json())
```

```javascript Optional webhook notification
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"profiles":[{"ds_contact_id":9207460}],"webhook":"https://your-server.com/webhooks/dealsignal"}'
};

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

```go Optional webhook notification
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY"

	payload := strings.NewReader("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    }\n  ],\n  \"webhook\": \"https://your-server.com/webhooks/dealsignal\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Optional webhook notification
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    }\n  ],\n  \"webhook\": \"https://your-server.com/webhooks/dealsignal\"\n}"

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

```java Optional webhook notification
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    }\n  ],\n  \"webhook\": \"https://your-server.com/webhooks/dealsignal\"\n}")
  .asString();
```

```php Optional webhook notification
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY', [
  'body' => '{
  "profiles": [
    {
      "ds_contact_id": 9207460
    }
  ],
  "webhook": "https://your-server.com/webhooks/dealsignal"
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Optional webhook notification
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 9207460\n    }\n  ],\n  \"webhook\": \"https://your-server.com/webhooks/dealsignal\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Optional webhook notification
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "profiles": [["ds_contact_id": 9207460]],
  "webhook": "https://your-server.com/webhooks/dealsignal"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Refresh anything not verified today

**Request**

```json
{
  "profiles": [
    {
      "ds_contact_id": 12312312
    }
  ],
  "contact_refresh_time": 0
}
```

**Response**

```json
{
  "id": 301,
  "unique_identifier": "d4d8e35d-932e-42e9-a9c2-0dabbef16f46",
  "webhook": null,
  "status": "running",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": [
    {
      "custom_columns": {
        "ds_contact_id": 9207460
      },
      "contact_data": {
        "id": 9207460,
        "first_name": "Jane",
        "last_name": "Smith",
        "logo_url": "https://...",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
        "company_website": "https://acme.example",
        "seniorities": "VP",
        "departments": "Sales",
        "contact_industry": "Information Technology & Services",
        "contact_location": "San Francisco, CA, USA",
        "contact_country": "USA",
        "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",
        "primary_position": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "contact_headline": "VP of Sales at Acme Corp",
        "contact_about_me": "...",
        "contact_education": [
          {
            "university": "Example University",
            "degree": "BS"
          }
        ],
        "current_company_and_title": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "previous_companies_and_titles": [],
        "search_status": "completed",
        "match_status": "found_and_verified",
        "remark": null,
        "enrichment_status": "Completed",
        "current_position_details": [
          {
            "title": "VP of Sales",
            "company_name": "Acme Corp",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "start_date": "2015-01-01",
            "end_date": null,
            "country": "USA",
            "company_logo_url": "https://..."
          }
        ],
        "old_position_details": []
      }
    },
    {
      "custom_columns": {
        "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
        "metadata": {
          "crm_record": "003Dn00000AbCdE"
        }
      },
      "contact_data": {
        "id": null,
        "first_name": null,
        "last_name": null,
        "logo_url": null,
        "company_name": null,
        "title": null,
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": null,
        "company_website": null,
        "seniorities": null,
        "departments": null,
        "contact_industry": null,
        "contact_location": null,
        "contact_country": null,
        "contact_state": null,
        "contact_city": null,
        "skills": null,
        "profile_completeness": null,
        "enriched_by": "dealsignal",
        "contact_updated_at": null,
        "primary_position": null,
        "contact_headline": null,
        "contact_about_me": null,
        "contact_education": null,
        "current_company_and_title": {},
        "previous_companies_and_titles": [],
        "search_status": "refreshing",
        "match_status": "not_found",
        "remark": null,
        "enrichment_status": "Found And Refreshing",
        "current_position_details": null,
        "old_position_details": null
      }
    }
  ]
}
```

**SDK Code**

```python Refresh anything not verified today
import requests

url = "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests"

querystring = {"api_key":"YOUR_API_KEY"}

payload = {
    "profiles": [{ "ds_contact_id": 12312312 }],
    "contact_refresh_time": 0
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers, params=querystring)

print(response.json())
```

```javascript Refresh anything not verified today
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"profiles":[{"ds_contact_id":12312312}],"contact_refresh_time":0}'
};

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

```go Refresh anything not verified today
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY"

	payload := strings.NewReader("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 12312312\n    }\n  ],\n  \"contact_refresh_time\": 0\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Refresh anything not verified today
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 12312312\n    }\n  ],\n  \"contact_refresh_time\": 0\n}"

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

```java Refresh anything not verified today
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 12312312\n    }\n  ],\n  \"contact_refresh_time\": 0\n}")
  .asString();
```

```php Refresh anything not verified today
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY', [
  'body' => '{
  "profiles": [
    {
      "ds_contact_id": 12312312
    }
  ],
  "contact_refresh_time": 0
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Refresh anything not verified today
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"profiles\": [\n    {\n      \"ds_contact_id\": 12312312\n    }\n  ],\n  \"contact_refresh_time\": 0\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Refresh anything not verified today
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "profiles": [["ds_contact_id": 12312312]],
  "contact_refresh_time": 0
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Request a work email (API key in the body)

**Request**

```json
{
  "profiles": [
    {
      "email": "jane@acme.example"
    }
  ],
  "api_key": "YOUR_API_KEY",
  "requested_attributes": [
    {
      "name": "contact_profile",
      "priority_order": 0
    },
    {
      "name": "email",
      "priority_order": 1
    }
  ]
}
```

**Response**

```json
{
  "id": 301,
  "unique_identifier": "d4d8e35d-932e-42e9-a9c2-0dabbef16f46",
  "webhook": null,
  "status": "running",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": [
    {
      "custom_columns": {
        "ds_contact_id": 9207460
      },
      "contact_data": {
        "id": 9207460,
        "first_name": "Jane",
        "last_name": "Smith",
        "logo_url": "https://...",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
        "company_website": "https://acme.example",
        "seniorities": "VP",
        "departments": "Sales",
        "contact_industry": "Information Technology & Services",
        "contact_location": "San Francisco, CA, USA",
        "contact_country": "USA",
        "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",
        "primary_position": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "contact_headline": "VP of Sales at Acme Corp",
        "contact_about_me": "...",
        "contact_education": [
          {
            "university": "Example University",
            "degree": "BS"
          }
        ],
        "current_company_and_title": {
          "company": "Acme Corp",
          "title": "VP of Sales",
          "company_linkedin_url": "https://www.linkedin.com/company/acme",
          "company_domain": "acme.example"
        },
        "previous_companies_and_titles": [],
        "search_status": "completed",
        "match_status": "found_and_verified",
        "remark": null,
        "enrichment_status": "Completed",
        "current_position_details": [
          {
            "title": "VP of Sales",
            "company_name": "Acme Corp",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "start_date": "2015-01-01",
            "end_date": null,
            "country": "USA",
            "company_logo_url": "https://..."
          }
        ],
        "old_position_details": []
      }
    },
    {
      "custom_columns": {
        "linkedin_url": "https://www.linkedin.com/in/jane-doe-example",
        "metadata": {
          "crm_record": "003Dn00000AbCdE"
        }
      },
      "contact_data": {
        "id": null,
        "first_name": null,
        "last_name": null,
        "logo_url": null,
        "company_name": null,
        "title": null,
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": null,
        "company_website": null,
        "seniorities": null,
        "departments": null,
        "contact_industry": null,
        "contact_location": null,
        "contact_country": null,
        "contact_state": null,
        "contact_city": null,
        "skills": null,
        "profile_completeness": null,
        "enriched_by": "dealsignal",
        "contact_updated_at": null,
        "primary_position": null,
        "contact_headline": null,
        "contact_about_me": null,
        "contact_education": null,
        "current_company_and_title": {},
        "previous_companies_and_titles": [],
        "search_status": "refreshing",
        "match_status": "not_found",
        "remark": null,
        "enrichment_status": "Found And Refreshing",
        "current_position_details": null,
        "old_position_details": null
      }
    }
  ]
}
```

**SDK Code**

```python Request a work email (API key in the body)
import requests

url = "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests"

querystring = {"api_key":"YOUR_API_KEY"}

payload = {
    "profiles": [{ "email": "jane@acme.example" }],
    "api_key": "YOUR_API_KEY",
    "requested_attributes": [
        {
            "name": "contact_profile",
            "priority_order": 0
        },
        {
            "name": "email",
            "priority_order": 1
        }
    ]
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers, params=querystring)

print(response.json())
```

```javascript Request a work email (API key in the body)
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"profiles":[{"email":"jane@acme.example"}],"api_key":"YOUR_API_KEY","requested_attributes":[{"name":"contact_profile","priority_order":0},{"name":"email","priority_order":1}]}'
};

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

```go Request a work email (API key in the body)
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY"

	payload := strings.NewReader("{\n  \"profiles\": [\n    {\n      \"email\": \"jane@acme.example\"\n    }\n  ],\n  \"api_key\": \"YOUR_API_KEY\",\n  \"requested_attributes\": [\n    {\n      \"name\": \"contact_profile\",\n      \"priority_order\": 0\n    },\n    {\n      \"name\": \"email\",\n      \"priority_order\": 1\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Request a work email (API key in the body)
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"profiles\": [\n    {\n      \"email\": \"jane@acme.example\"\n    }\n  ],\n  \"api_key\": \"YOUR_API_KEY\",\n  \"requested_attributes\": [\n    {\n      \"name\": \"contact_profile\",\n      \"priority_order\": 0\n    },\n    {\n      \"name\": \"email\",\n      \"priority_order\": 1\n    }\n  ]\n}"

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

```java Request a work email (API key in the body)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("{\n  \"profiles\": [\n    {\n      \"email\": \"jane@acme.example\"\n    }\n  ],\n  \"api_key\": \"YOUR_API_KEY\",\n  \"requested_attributes\": [\n    {\n      \"name\": \"contact_profile\",\n      \"priority_order\": 0\n    },\n    {\n      \"name\": \"email\",\n      \"priority_order\": 1\n    }\n  ]\n}")
  .asString();
```

```php Request a work email (API key in the body)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY', [
  'body' => '{
  "profiles": [
    {
      "email": "jane@acme.example"
    }
  ],
  "api_key": "YOUR_API_KEY",
  "requested_attributes": [
    {
      "name": "contact_profile",
      "priority_order": 0
    },
    {
      "name": "email",
      "priority_order": 1
    }
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Request a work email (API key in the body)
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"profiles\": [\n    {\n      \"email\": \"jane@acme.example\"\n    }\n  ],\n  \"api_key\": \"YOUR_API_KEY\",\n  \"requested_attributes\": [\n    {\n      \"name\": \"contact_profile\",\n      \"priority_order\": 0\n    },\n    {\n      \"name\": \"email\",\n      \"priority_order\": 1\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Request a work email (API key in the body)
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "profiles": [["email": "jane@acme.example"]],
  "api_key": "YOUR_API_KEY",
  "requested_attributes": [
    [
      "name": "contact_profile",
      "priority_order": 0
    ],
    [
      "name": "email",
      "priority_order": 1
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests?api_key=YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```