> 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 a Contact Profile Refresh Request

GET https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status

Looks up a refresh request by the `unique_identifier` returned at create
time and returns the request envelope with every profile of the request,
in its current state.
This is the recommended way to get the results: it always returns every
profile of the request. A `webhook` is only an optional completion signal.

### Response formats

* **Full** (default) — the request envelope plus `contact_profile_refreshes`:
  a flat array of `{ custom_columns, contact_data }` for a synchronous
  request, or `{ total, page_no, page_size, profiles }` for an
  asynchronous one.
* **`response_format=summary`** — `{ request_id, status, unique_identifier }`
  only. The smallest response for checking whether the request is done.
* **`response_format=changes`** — the status fields plus a compact
  `profiles` collection carrying the `ds_*` change-detection fields
  (primary position, baseline, verdict booleans, change types and
  events) instead of the full `contact_data`. Use it for job-change
  monitoring.

Any other value of `response_format` returns the full format.

### Pagination

`page_no` and `page_size` apply **only to asynchronous requests**
(`synchronous: false` at creation); a synchronous request always returns
every profile as a flat array. Defaults are `1` and `50`; both must be
`1` or greater. The wrapper echoes the values you sent (a query-string
value comes back as a string).

### Change verdicts

`changed_company` / `changed_title` (full format, webhook) and the `ds_*`
fields (`changes` format) answer one question: *did the contact's
**primary** position change compared with your account's previous
refresh of this contact?* The verdict has no look-back window:
`contact_refresh_time` doesn't limit how far back the comparison reaches;
it controls which contacts get refreshed. The
**first refresh of a contact for your account** has no baseline and
reports `false` / `false`. If the contact already had positions,
`ds_change_status` is `undetermined` with reason `no prior snapshot`; if
this refresh delivered the contact's first positions, both change types
are `newly_added` (`no_change` when those positions have all already
ended). Either way it establishes the baseline, and the second
refresh is the first that can report a change. The verdict is computed
once, when the refresh concludes for that profile — the profile can
still be in progress while requested contact details are fetched — and
does not change afterwards.

### Repeated polling

Polling has no fee of its own. Once `status` is `completed`, stop
polling: if you set a `webhook`, further calls can trigger additional
deliveries to it, so make your webhook receiver idempotent. A valid
`unique_identifier` keeps working after the request has completed.

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

## Request

### Query parameters

- `api_key` (string, required) — Your Dealsignal API key. Obtain it from the Dealsignal dashboard.
- `unique_identifier` (string, required) — The `unique_identifier` returned when the request was created.
- `response_format` (enum, optional) — `summary` returns only `request_id`, `status` and `unique_identifier`; `changes` returns the compact change-detection view. Omit it (or send any other value) for the full envelope.
  - Allowed values: `summary`, `changes`
- `page_no` (integer, optional, default: 1) — Page number for the profile list. Asynchronous requests only. Must be `1` or greater.
- `page_size` (integer, optional, default: 50) — Profiles per page. Asynchronous requests only. Must be `1` or greater.

## Response

### 200

The request's status and every profile of the request, in its current state and in the shape selected by `response_format`.

- `Contact Profile Refresh Requests_getContactProfileRefreshRequest_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 request matches the supplied `unique_identifier`.

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

## Types

### ContactProfileRefreshRequestFull

Returned when `response_format` is omitted (or any other value) — the request envelope plus every profile of the request.

- `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` (ContactProfileRefreshRequestFullContactProfileRefreshes, optional) — Every profile of the request, in its current state. The shape depends on how the request was created: a flat **array** of profile objects for a synchronous request (all profiles, never paginated) or a paginated **object** for an asynchronous request.

### ContactProfileRefreshRequestSummary

Returned when `response_format=summary` — status fields only, no profile data.

- `request_id` (integer, optional) — Request ID.
- `status` (enum, optional)
  - Allowed values: `running`, `completed`
- `unique_identifier` (string, optional)

### ContactProfileRefreshRequestChanges

Returned when `response_format=changes` — the status fields plus a compact `profiles` collection carrying the `ds_*` change-detection fields instead of the full `contact_data` payload.

- `request_id` (integer, optional)
- `status` (enum, optional)
  - Allowed values: `running`, `completed`
- `unique_identifier` (string, optional)
- `profiles` (ContactProfileRefreshRequestChangesProfiles, optional) — A flat **array** for a synchronous request (always returned in full), or the paginated wrapper for an asynchronous request.

### ContactProfileRefreshRequestUser

The authenticated account.

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

### ContactProfileRefreshRequestFullContactProfileRefreshes

Every profile of the request, in its current state. The shape depends on how the request was created: a flat **array** of profile objects for a synchronous request (all profiles, never paginated) or a paginated **object** for an asynchronous request.

### ContactProfileRefreshRequestChangesProfiles

A flat **array** for a synchronous request (always returned in full), or the paginated wrapper for an asynchronous request.

### ContactProfileRefreshPaginatedProfiles

Paginated wrapper around the profile list, used for **asynchronous** requests (`synchronous: false`).

- `total` (integer, optional) — Total number of profiles in the request.
- `page_no` (ContactProfileRefreshPaginatedProfilesPageNo, optional) — The value you sent, echoed **verbatim** — a query-string value comes back as a string (`"2"`), an omitted one as the integer default `1`. Typed clients must accept both.
- `page_size` (ContactProfileRefreshPaginatedProfilesPageSize, optional) — Echoed verbatim like `page_no`: a string when you supplied it, the integer `50` when defaulted.
- `profiles` (list of ContactProfileRefreshProfile, optional) — Profile objects for the current page.

### ContactProfileRefreshPaginatedChangeProfiles

Paginated wrapper used for **asynchronous** requests in the `changes` format. Same paging rules as the full format.

- `total` (integer, optional)
- `page_no` (ContactProfileRefreshPaginatedChangeProfilesPageNo, optional)
- `page_size` (ContactProfileRefreshPaginatedChangeProfilesPageSize, optional)
- `profiles` (list of ContactProfileRefreshChangeProfile, optional)

### ContactProfileRefreshPaginatedProfilesPageNo

The value you sent, echoed **verbatim** — a query-string value comes back as a string (`"2"`), an omitted one as the integer default `1`. Typed clients must accept both.

### ContactProfileRefreshPaginatedProfilesPageSize

Echoed verbatim like `page_no`: a string when you supplied it, the integer `50` when defaulted.

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

### ContactProfileRefreshPaginatedChangeProfilesPageNo

### ContactProfileRefreshPaginatedChangeProfilesPageSize

### ContactProfileRefreshChangeProfile

Compact per-profile view returned by `response_format=changes`: the profile's identity, its processing status and — **only once its change verdict is available** — the `ds_*` family of change-detection fields. The `ds_*` keys are **omitted** (not `null`) while no verdict is available: the refresh hasn't concluded for the profile yet, no contact was matched, or the profile was processed before change detection became available. Treat the employer as "assessed, nothing changed" only when the `ds_*` keys are present, `ds_change_status.company` is `determined`, `ds_company_change` is `false` and `ds_baseline_primary_company` is not `null` (likewise `ds_change_status.title`, `ds_title_change` and `ds_baseline_primary_title` for the title). A `null` baseline means there was no previous primary position to compare against; on a first refresh the verdict only establishes the baseline. Never infer "no change" from absent keys or from an `undetermined` verdict — its booleans also read `false`.

- `custom_columns` (map from string to any, optional) — The profile object you submitted, echoed back verbatim.
- `id` (integer, optional, nullable) — The matched Dealsignal contact's ID; `null` until a contact has been matched. Same rule as `contact_data.id` in the full format: a finished profile with `id` `null` has no matched contact.
- `first_name` (string, optional, nullable) — The matched contact's identity **at the time the verdict was computed** — not the value you submitted. `null` while no verdict exists.
- `last_name` (string, optional, nullable) — Identity at verdict time, like `first_name`.
- `linkedin_url` (string, optional, nullable) — Identity at verdict time, like `first_name`.
- `search_status` (string, optional, nullable) — Processing state of the profile (same values as in the full format). `null` for a profile that was closed without a final status when the request completed. Whether a contact was matched is told by `id`, not by `search_status`.
- `match_status` (string, optional) — Same values as in the full format. Reflects the contact's current state and can change after completion (for example when the LinkedIn profile is later flagged invalid).
- `ds_position_state` (enum, optional) — How the contact's current positions look after the refresh. `undetermined`: the contact has current positions but none with a start date, so no primary can be selected.
  - Allowed values: `single_current`, `multiple_current`, `no_current`, `undetermined`
- `ds_current_position_count` (integer, optional) — Number of dated current positions; `0` when `ds_position_state` is `no_current` or `undetermined`.
- `ds_primary_company` (string, optional) — The primary position selected after the refresh — the one the verdict is about. Can differ from `primary_position` in the full format. **Omitted** when `ds_position_state` is `no_current` or `undetermined`.
- `ds_primary_title` (string, optional) — Omitted together with `ds_primary_company`.
- `ds_primary_start_date` (date, optional) — Start date of the selected primary position. Omitted together with `ds_primary_company`.
- `ds_position_primacy_confidence` (enum, optional) — How confident Dealsignal is that the selected position is the contact's primary one. Omitted together with `ds_primary_company`.
  - Allowed values: `high`, `medium`, `low`
- `ds_baseline_primary_company` (string, optional, nullable) — The primary company captured at your account's **previous** refresh of this contact — what the verdict was compared against. Unlike the `ds_primary_*` keys it is never omitted: whenever the `ds_*` fields are present this key is too, `null` on the first refresh and when the previous refresh found no current position.
- `ds_baseline_primary_title` (string, optional, nullable) — The primary title captured at the previous refresh. Never omitted, like `ds_baseline_primary_company`; `null` on the first refresh and when the previous refresh found no current position.
- `ds_first_seen` (boolean, optional) — `true` when Dealsignal had no record of this contact before this request.
- `ds_company_change` (boolean, optional) — The primary employer differs from the baseline. Equal to `changed_company` in the full format.
- `ds_title_change` (boolean, optional) — The primary title differs from the baseline. Equal to `changed_title` in the full format.
- `ds_job_changes` (boolean, optional) — The contact's **set** of current employers changed (a role was added or dropped), independently of whether the primary moved.
- `ds_company_change_type` (enum, optional) — The highest-precedence company event. `newly_added` = first positions ever captured for this contact; `consolidated` = a role dropped, one employer left; `moved_within_corporate_family` = parent/subsidiary or post-acquisition rename (`ds_company_change` stays `false`).
  - Allowed values: `job_change`, `left_employer`, `returned_to_work`, `newly_added`, `dropped_role`, `consolidated`, `added_role`, `moved_within_corporate_family`, `no_change`, `undetermined`
- `ds_title_change_type` (enum, optional)
  - Allowed values: `title_change_promotion`, `title_change_lateral`, `title_change_demotion`, `title_gained`, `title_lost`, `newly_added`, `no_change`, `undetermined`
- `ds_change_events` (list of ContactProfileRefreshChangeEvent, optional) — Every detected event.
- `ds_change_description` (string, optional) — One human-readable sentence summarising the verdict, e.g. `Moved from Engineer of Acme to Senior Engineer of Globex`, `Promoted from Engineer to Senior Engineer at Globex`, `Left Acme`.
- `ds_change_status` (ContactProfileRefreshChangeStatus, optional) — Whether the company and title verdicts could be determined, and why not. `undetermined` means **no verdict**, not "no change": the matching boolean (`ds_company_change` / `ds_title_change`) reads `false` but must not be treated as "nothing changed".

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

### ContactProfileRefreshChangeEvent

One detected change event. `name` and `confidence` are always present; the remaining keys are the event's payload and are **omitted** when they do not apply: - `job_change` — `previous_company`, `current_company`, `after_employment_gap`, `previous_role_continues`, `remaining_title`, `previous_primary_title`, `transient` - `left_employer` — `previous_company`, `previous_title`, `remaining_title`, `remaining_company`, `previous_primary_title`, `interim`, `new_seat` - `returned_to_work` — `company`, `current_title`, `last_held_title` - `added_role` — `title`, `company`, `start_date` - `dropped_role` — `company` - `title_change` — `previous_title`, `current_title` - `newly_added` — `company`, `current_title`, `recent_start` - `moved_within_corporate_family` — `previous_company`, `current_company`, `relation`

- `name` (enum, required)
  - Allowed values: `job_change`, `left_employer`, `returned_to_work`, `added_role`, `dropped_role`, `title_change`, `newly_added`, `moved_within_corporate_family`
- `confidence` (enum, required) — Confidence in the event — `100`, `85` or `75`.
  - Allowed values: `100`, `85`, `75`
- `previous_company` (string, optional, nullable)
- `current_company` (string, optional, nullable)
- `previous_title` (string, optional, nullable)
- `current_title` (string, optional, nullable)
- `company` (string, optional, nullable)
- `title` (string, optional, nullable)
- `remaining_title` (string, optional, nullable)
- `remaining_company` (string, optional, nullable)
- `previous_primary_title` (string, optional, nullable)
- `last_held_title` (string, optional, nullable)
- `relation` (string, optional) — Corporate-family relation, on `moved_within_corporate_family` only.
- `start_date` (date, optional) — On `added_role` only — start date of the added role.
- `new_seat` (boolean, optional) — On `left_employer` only — the remaining role is a new advisory or board seat.
- `after_employment_gap` (boolean, optional) — On `job_change` only — the move followed a period with no role.
- `previous_role_continues` (boolean, optional)
- `transient` (boolean, optional)
- `interim` (boolean, optional)
- `recent_start` (boolean, optional)

### ContactProfileRefreshChangeStatus

Whether the company and title verdicts could be determined, and why not. `undetermined` means **no verdict**, not "no change": the matching boolean (`ds_company_change` / `ds_title_change`) reads `false` but must not be treated as "nothing changed".

- `company` (enum, optional)
  - Allowed values: `determined`, `undetermined`
- `title` (enum, optional)
  - Allowed values: `determined`, `undetermined`
- `reasons` (list of enum, optional)
  - Allowed values: `no prior snapshot`, `current employer could not be matched`, `profile not captured`, `position state undetermined`

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

### Full format — synchronous request

**Response**

```json
{
  "id": 303,
  "unique_identifier": "3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53",
  "webhook": null,
  "status": "completed",
  "contact_refresh_time": null,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": [
    {
      "custom_columns": {
        "first_name": "Sam",
        "last_name": "Lee",
        "company_name": "Acme Corp",
        "linkedin_url": "https://www.linkedin.com/in/sam-lee-example"
      },
      "contact_data": {
        "id": 456,
        "first_name": "Sam",
        "last_name": "Lee",
        "logo_url": "https://...",
        "company_name": "Acme Corp",
        "title": "VP of Sales",
        "changed_company": false,
        "changed_title": false,
        "linkedin_url": "https://www.linkedin.com/in/sam-lee-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": []
      }
    }
  ]
}
```

**SDK Code**

```python Full format — synchronous request
import requests

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

querystring = {"api_key":"YOUR_API_KEY","unique_identifier":"3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"}

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

print(response.json())
```

```javascript Full format — synchronous request
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53';
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 Full format — synchronous request
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"

	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 Full format — synchronous request
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")

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 Full format — synchronous request
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")
  .asString();
```

```php Full format — synchronous request
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53');

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

```csharp Full format — synchronous request
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift Full format — synchronous request
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")! 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()
```

### Full format — asynchronous request (paginated)

**Response**

```json
{
  "id": 305,
  "unique_identifier": "b2d6e8f0-7a1c-4e3b-8d5f-6c9a0e2b4d17",
  "webhook": "",
  "status": "running",
  "contact_refresh_time": 30,
  "user": {
    "id": 10,
    "email": "user@example.com",
    "name": "User Name"
  },
  "contact_profile_refreshes": {
    "total": 120,
    "page_no": "2",
    "page_size": "50",
    "profiles": [
      {
        "custom_columns": {
          "ds_contact_id": 9207460
        },
        "contact_data": {
          "id": 9207460,
          "first_name": "Jane",
          "last_name": "Smith",
          "logo_url": null,
          "company_name": "Acme Corp",
          "title": "VP Marketing",
          "changed_company": false,
          "changed_title": false,
          "linkedin_url": "https://www.linkedin.com/in/jane-smith-example",
          "company_website": "https://acme.example",
          "seniorities": "VP",
          "departments": "Marketing",
          "contact_industry": "Software",
          "contact_location": "Austin, Texas, USA",
          "contact_country": "USA",
          "contact_state": "Texas",
          "contact_city": "Austin",
          "skills": null,
          "profile_completeness": "rich",
          "enriched_by": "dealsignal",
          "contact_updated_at": "2026-09-30T08:12:45Z",
          "primary_position": {
            "company": "Acme Corp",
            "title": "VP Marketing",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "company_domain": "acme.example"
          },
          "contact_headline": null,
          "contact_about_me": null,
          "contact_education": [],
          "current_company_and_title": {
            "company": "Acme Corp",
            "title": "VP Marketing",
            "company_linkedin_url": "https://www.linkedin.com/company/acme",
            "company_domain": "acme.example"
          },
          "previous_companies_and_titles": [],
          "search_status": "refreshing",
          "match_status": "found_and_unverified",
          "remark": null,
          "enrichment_status": "Found And Refreshing",
          "current_position_details": [
            {
              "title": "VP Marketing",
              "company_name": "Acme Corp",
              "company_linkedin_url": "https://www.linkedin.com/company/acme",
              "start_date": "2024-03-01",
              "end_date": null,
              "country": "USA",
              "company_logo_url": null
            }
          ],
          "old_position_details": []
        }
      }
    ]
  }
}
```

**SDK Code**

```python Full format — asynchronous request (paginated)
import requests

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

querystring = {"api_key":"YOUR_API_KEY","unique_identifier":"3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"}

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

print(response.json())
```

```javascript Full format — asynchronous request (paginated)
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53';
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 Full format — asynchronous request (paginated)
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"

	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 Full format — asynchronous request (paginated)
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")

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 Full format — asynchronous request (paginated)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")
  .asString();
```

```php Full format — asynchronous request (paginated)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53');

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

```csharp Full format — asynchronous request (paginated)
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift Full format — asynchronous request (paginated)
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")! 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()
```

### response_format=summary

**Response**

```json
{
  "unique_identifier": "3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53",
  "status": "running",
  "request_id": 303
}
```

**SDK Code**

```python response_format=summary
import requests

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

querystring = {"api_key":"YOUR_API_KEY","unique_identifier":"3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"}

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

print(response.json())
```

```javascript response_format=summary
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53';
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 response_format=summary
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"

	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 response_format=summary
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")

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 response_format=summary
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")
  .asString();
```

```php response_format=summary
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53');

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

```csharp response_format=summary
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift response_format=summary
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")! 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()
```

### response_format=changes — synchronous request

**Response**

```json
{
  "unique_identifier": "8e4f1a6b-2c7d-4b9e-93f0-5a1d6c8b2e74",
  "status": "completed",
  "request_id": 304,
  "profiles": [
    {
      "custom_columns": {
        "first_name": "Sam",
        "last_name": "Lee",
        "company_name": "Acme",
        "linkedin_url": "https://www.linkedin.com/in/sam-lee-example"
      },
      "id": 456,
      "first_name": "Sam",
      "last_name": "Lee",
      "linkedin_url": "https://www.linkedin.com/in/sam-lee-example",
      "search_status": "completed",
      "match_status": "found_and_verified",
      "ds_position_state": "single_current",
      "ds_current_position_count": 1,
      "ds_primary_company": "Globex",
      "ds_primary_title": "Senior Engineer",
      "ds_primary_start_date": "2026-09-01",
      "ds_position_primacy_confidence": "high",
      "ds_baseline_primary_company": "Acme",
      "ds_baseline_primary_title": "Engineer",
      "ds_first_seen": false,
      "ds_company_change": true,
      "ds_job_changes": true,
      "ds_title_change": true,
      "ds_company_change_type": "job_change",
      "ds_title_change_type": "title_change_promotion",
      "ds_change_events": [
        {
          "name": "job_change",
          "confidence": 100,
          "previous_company": "Acme",
          "current_company": "Globex"
        },
        {
          "name": "title_change",
          "confidence": 100,
          "previous_title": "Engineer",
          "current_title": "Senior Engineer"
        }
      ],
      "ds_change_description": "Moved from Engineer of Acme to Senior Engineer of Globex",
      "ds_change_status": {
        "company": "determined",
        "title": "determined",
        "reasons": []
      }
    },
    {
      "custom_columns": {
        "email": "john@globex.example"
      },
      "id": null,
      "first_name": null,
      "last_name": null,
      "linkedin_url": null,
      "search_status": "not_found",
      "match_status": "not_found"
    }
  ]
}
```

**SDK Code**

```python response_format=changes — synchronous request
import requests

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

querystring = {"api_key":"YOUR_API_KEY","unique_identifier":"3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"}

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

print(response.json())
```

```javascript response_format=changes — synchronous request
const url = 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53';
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 response_format=changes — synchronous request
package main

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

func main() {

	url := "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53"

	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 response_format=changes — synchronous request
require 'uri'
require 'net/http'

url = URI("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")

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 response_format=changes — synchronous request
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")
  .asString();
```

```php response_format=changes — synchronous request
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53');

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

```csharp response_format=changes — synchronous request
using RestSharp;

var client = new RestClient("https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
```

```swift response_format=changes — synchronous request
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://app.dealsignal.com/api/v1/contact_profile_refresh_requests/request_status?api_key=YOUR_API_KEY&unique_identifier=3c9a7e21-5b4d-4f8e-a1c6-0e2d9b7f4a53")! 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()
```