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

# GET /v1/contacts/{contact_id} — Get Contact by ID

> GET /v1/contacts/{contact_id} retrieves a single contact's full profile including enrichment data, ICP score, CRM fields, and visit history.

The Get Contact endpoint retrieves the complete profile for a single identified contact. Pass the contact's Knock2 ID to receive their full enrichment payload — personal and professional details, company firmographics, ICP scoring data, CRM field mappings, and visit activity on your website.

***

## Endpoint

```text theme={null}
GET https://api.knock2.ai/v1/contacts/{contact_id}
```

***

## Required Scope

Your API key must have the `contacts:read` scope (or the broader `all:read` scope) to call this endpoint.

***

## Path Parameters

<ParamField path="contact_id" type="string" required>
  The unique Knock2 identifier of the contact to retrieve (e.g. `cnt_01HX...`). You can obtain this ID from the List Contacts endpoint or from a webhook payload. Email addresses are not accepted as a path parameter — use the `email` query parameter on the List Contacts endpoint for email-based lookups.
</ParamField>

## Request Parameters

<ParamField query="product_slug" type="string">
  Read a direct child tenant's contact instead of your own (multi-tenant partners only). The `X-Knock-Tenant` header takes precedence if both are supplied. See [Reading a Child Tenant's Data](/tenants/managing-tenants#reading-a-child-tenants-data).
</ParamField>

<ParamField header="X-Knock-Tenant" type="string">
  Same as `product_slug` above, as a header instead of a query param. Naming a slug that isn't a direct child of your key returns `404`, never `403`.
</ParamField>

***

## Example Request

```bash theme={null}
curl https://api.knock2.ai/v1/contacts/cnt_01HX... \
  -H "Authorization: Bearer YOUR_API_KEY"
```

***

## Response

Returns `200 OK` with a `data` object containing the full contact record.

```json Example response theme={null}
{
  "data": {
    "id": "cnt_01HX...",
    "first_name": "Jane",
    "last_name": "Smith",
    "name": "Jane Smith",
    "title": "Head of Engineering",
    "email": "jane@acme.com",
    "business_email": "jane@acme.com",
    "personal_email": null,
    "linkedin_url": "https://www.linkedin.com/in/janesmith",
    "seniority": "Director",
    "departments": ["Engineering"],
    "phone_numbers": ["+14155550100"],
    "address_city": "San Francisco",
    "address_state": "CA",
    "address_zip_code": "94105",
    "address_country": "US",
    "location": "San Francisco, CA, US",
    "match_type": "email",
    "is_qualified": true,
    "is_business_email_valid": true,
    "business_email_last_validated_at": "2024-05-01T00:00:00Z",
    "last_enriched_at": "2024-05-20T11:00:00Z",
    "company_id": "acc_01HX...",
    "company_name": "Acme Corp",
    "company_domain": "acme.com",
    "company_linkedin_url": "https://www.linkedin.com/company/acme-corp",
    "company_industry": "Software",
    "company_sector": "Technology",
    "company_description": "Acme Corp builds enterprise workflow automation tools.",
    "company_estimated_employee_count": "51-200",
    "company_employees_min": 51,
    "company_employees_max": 200,
    "company_estimated_annual_revenue": "10M-50M",
    "company_annual_revenue_min": 10000000,
    "company_annual_revenue_max": 50000000,
    "company_phone_numbers": [],
    "company_tags": ["enterprise"],
    "company_technology_tags": ["Salesforce", "HubSpot"],
    "company_address_city": "San Francisco",
    "company_address_state": "CA",
    "company_address_zip_code": "94105",
    "company_address_country": "US",
    "company_location": "San Francisco, CA, US",
    "company_last_funding_date": "2023-09-01",
    "company_last_funding_round_type": "Series B",
    "company_last_funding_amount": "25M",
    "crm_deal_source": "Inbound",
    "crm_deal_name": "Acme Corp — Enterprise",
    "crm_deal_stage": "Proposal",
    "crm_deal_value_usd": 48000,
    "crm_deal_close_datetime": "2024-09-30T00:00:00Z",
    "crm_deal_owner_email": "alice@yourcompany.com",
    "crm_deal_owner_first_name": "Alice",
    "crm_deal_owner_last_name": "Johnson",
    "crm_company_owner_email": "alice@yourcompany.com",
    "crm_company_owner_first_name": "Alice",
    "crm_company_owner_last_name": "Johnson",
    "hubspot_company_id": "1234567890",
    "salesforce_account_id": "0015g00000AbCdEf",
    "latest_visit_datetime": "2024-06-01T14:23:00Z",
    "latest_visit_page": "/docs/api",
    "page_visits": [
      {
        "page": "/docs/api",
        "start_time": "2024-06-01T14:20:00Z",
        "end_time": "2024-06-01T14:23:45Z"
      },
      {
        "page": "/pricing",
        "start_time": "2024-06-01T14:15:00Z",
        "end_time": "2024-06-01T14:19:50Z"
      }
    ],
    "total_browsing_time_seconds": 940,
    "utms": {},
    "document_referrer": "https://www.google.com",
    "utm_source": "google",
    "utm_medium": "organic",
    "utm_campaign": null,
    "utm_term": null,
    "utm_content": null,
    "icp_scoring_icp_id": "icp_01HX...",
    "icp_scoring_icp_title": "Enterprise Engineering Leader",
    "icp_scoring_score": 87,
    "icp_scoring_reason": "Matches target industry, seniority, and department.",
    "created_at": "2024-05-20T11:00:00Z"
  }
}
```

### Response Fields

<ResponseField name="data" type="object" required>
  The full contact record.

  <Expandable title="Contact object fields">
    <ResponseField name="id" type="string">
      The unique Knock2 identifier for this contact.
    </ResponseField>

    <ResponseField name="first_name" type="string">
      The contact's first name.
    </ResponseField>

    <ResponseField name="last_name" type="string">
      The contact's last name.
    </ResponseField>

    <ResponseField name="name" type="string">
      The contact's full display name.
    </ResponseField>

    <ResponseField name="title" type="string">
      The contact's job title (e.g. `"Head of Engineering"`).
    </ResponseField>

    <ResponseField name="email" type="string">
      The contact's primary email address, if identified.
    </ResponseField>

    <ResponseField name="business_email" type="string">
      The contact's work email address.
    </ResponseField>

    <ResponseField name="personal_email" type="string">
      The contact's personal email address, if available.
    </ResponseField>

    <ResponseField name="linkedin_url" type="string">
      URL to the contact's LinkedIn profile.
    </ResponseField>

    <ResponseField name="seniority" type="string">
      The seniority level of the contact's role (e.g. `"Director"`, `"VP"`, `"C-Suite"`, `"Manager"`).
    </ResponseField>

    <ResponseField name="departments" type="array">
      A list of functional departments the contact is associated with (e.g. `["Engineering"]`).
    </ResponseField>

    <ResponseField name="phone_numbers" type="array">
      A list of phone numbers associated with the contact.
    </ResponseField>

    <ResponseField name="address_city" type="string">
      The city the contact is based in.
    </ResponseField>

    <ResponseField name="address_state" type="string">
      The state or province the contact is based in.
    </ResponseField>

    <ResponseField name="address_zip_code" type="string">
      The postal or ZIP code for the contact's address.
    </ResponseField>

    <ResponseField name="address_country" type="string">
      The country the contact is based in (ISO 3166-1 alpha-2 code, e.g. `"US"`).
    </ResponseField>

    <ResponseField name="location" type="string">
      A human-readable location string combining city, state, and country.
    </ResponseField>

    <ResponseField name="match_type" type="string">
      How this contact was matched to a website visit (e.g. `"email"`, `"ip"`).
    </ResponseField>

    <ResponseField name="is_qualified" type="boolean">
      `true` if this contact has been marked as qualified based on your configured criteria.
    </ResponseField>

    <ResponseField name="is_business_email_valid" type="boolean">
      `true` if the contact's business email address has been validated as deliverable.
    </ResponseField>

    <ResponseField name="business_email_last_validated_at" type="string">
      ISO 8601 timestamp of when the business email was last validated.
    </ResponseField>

    <ResponseField name="last_enriched_at" type="string">
      ISO 8601 timestamp of when this contact's profile was last enriched.
    </ResponseField>

    <ResponseField name="company_id" type="string">
      The Knock2 account ID of the company this contact is associated with.
    </ResponseField>

    <ResponseField name="company_name" type="string">
      The display name of the company this contact is associated with.
    </ResponseField>

    <ResponseField name="company_domain" type="string">
      The primary web domain of the company this contact is associated with.
    </ResponseField>

    <ResponseField name="company_linkedin_url" type="string">
      URL to the company's LinkedIn profile page.
    </ResponseField>

    <ResponseField name="company_industry" type="string">
      The industry classification of the contact's company.
    </ResponseField>

    <ResponseField name="company_sector" type="string">
      The broader sector of the contact's company.
    </ResponseField>

    <ResponseField name="company_description" type="string">
      A short description of the contact's company.
    </ResponseField>

    <ResponseField name="company_estimated_employee_count" type="string">
      A bucketed headcount range for the contact's company.
    </ResponseField>

    <ResponseField name="company_employees_min" type="integer">
      The lower bound of the company's headcount range.
    </ResponseField>

    <ResponseField name="company_employees_max" type="integer">
      The upper bound of the company's headcount range.
    </ResponseField>

    <ResponseField name="company_estimated_annual_revenue" type="string">
      A bucketed annual revenue range for the contact's company.
    </ResponseField>

    <ResponseField name="company_annual_revenue_min" type="number">
      The lower bound of the company's annual revenue range in USD.
    </ResponseField>

    <ResponseField name="company_annual_revenue_max" type="number">
      The upper bound of the company's annual revenue range in USD.
    </ResponseField>

    <ResponseField name="company_phone_numbers" type="array">
      A list of phone numbers associated with the contact's company.
    </ResponseField>

    <ResponseField name="company_tags" type="array">
      A list of tags applied to the contact's company account in Knock2.
    </ResponseField>

    <ResponseField name="company_technology_tags" type="array">
      A list of technologies detected in use at the contact's company.
    </ResponseField>

    <ResponseField name="company_address_city" type="string">
      The city where the contact's company is located.
    </ResponseField>

    <ResponseField name="company_address_state" type="string">
      The state or province where the contact's company is located.
    </ResponseField>

    <ResponseField name="company_address_zip_code" type="string">
      The postal or ZIP code for the contact's company address.
    </ResponseField>

    <ResponseField name="company_address_country" type="string">
      The country where the contact's company is located (ISO 3166-1 alpha-2 code).
    </ResponseField>

    <ResponseField name="company_location" type="string">
      A human-readable location string for the contact's company.
    </ResponseField>

    <ResponseField name="company_last_funding_date" type="string">
      ISO 8601 date of the company's most recent funding event.
    </ResponseField>

    <ResponseField name="company_last_funding_round_type" type="string">
      The type of the company's most recent funding round.
    </ResponseField>

    <ResponseField name="company_last_funding_amount" type="string">
      The amount raised in the company's most recent funding round.
    </ResponseField>

    <ResponseField name="crm_deal_source" type="string">
      The lead source of the associated CRM deal, if synced.
    </ResponseField>

    <ResponseField name="crm_deal_name" type="string">
      The name of the associated CRM deal, if synced.
    </ResponseField>

    <ResponseField name="crm_deal_stage" type="string">
      The pipeline stage of the associated CRM deal.
    </ResponseField>

    <ResponseField name="crm_deal_value_usd" type="number">
      The monetary value of the associated CRM deal in USD.
    </ResponseField>

    <ResponseField name="crm_deal_close_datetime" type="string">
      ISO 8601 timestamp of the expected or actual close date for the associated CRM deal.
    </ResponseField>

    <ResponseField name="crm_deal_owner_email" type="string">
      Email address of the deal owner in your CRM.
    </ResponseField>

    <ResponseField name="crm_deal_owner_first_name" type="string">
      First name of the deal owner in your CRM.
    </ResponseField>

    <ResponseField name="crm_deal_owner_last_name" type="string">
      Last name of the deal owner in your CRM.
    </ResponseField>

    <ResponseField name="crm_company_owner_email" type="string">
      Email address of the company owner in your CRM.
    </ResponseField>

    <ResponseField name="crm_company_owner_first_name" type="string">
      First name of the company owner in your CRM.
    </ResponseField>

    <ResponseField name="crm_company_owner_last_name" type="string">
      Last name of the company owner in your CRM.
    </ResponseField>

    <ResponseField name="hubspot_company_id" type="string">
      The corresponding HubSpot Company record ID, if synced.
    </ResponseField>

    <ResponseField name="salesforce_account_id" type="string">
      The corresponding Salesforce Account record ID, if synced.
    </ResponseField>

    <ResponseField name="latest_visit_datetime" type="string">
      ISO 8601 timestamp of the contact's most recent visit.
    </ResponseField>

    <ResponseField name="latest_visit_page" type="string">
      The URL path of the most recently visited page on your website.
    </ResponseField>

    <ResponseField name="page_visits" type="array">
      The contact's most recent page visits (up to 100), newest first. Each entry has `page` (string), `start_time` (ISO 8601), and `end_time` (ISO 8601, `null` if the visit is still open).
    </ResponseField>

    <ResponseField name="total_browsing_time_seconds" type="integer">
      The total cumulative time in seconds this contact has spent on your website.
    </ResponseField>

    <ResponseField name="utms" type="object">
      A map of all UTM parameters captured from this contact's visits.
    </ResponseField>

    <ResponseField name="document_referrer" type="string">
      The referrer URL from the contact's most recent visit.
    </ResponseField>

    <ResponseField name="utm_source" type="string">
      The `utm_source` value from the most recent tracked visit.
    </ResponseField>

    <ResponseField name="utm_medium" type="string">
      The `utm_medium` value from the most recent tracked visit.
    </ResponseField>

    <ResponseField name="utm_campaign" type="string">
      The `utm_campaign` value from the most recent tracked visit.
    </ResponseField>

    <ResponseField name="utm_term" type="string">
      The `utm_term` value from the most recent tracked visit.
    </ResponseField>

    <ResponseField name="utm_content" type="string">
      The `utm_content` value from the most recent tracked visit.
    </ResponseField>

    <ResponseField name="icp_scoring_icp_id" type="string">
      The ID of the ICP definition used to score this contact.
    </ResponseField>

    <ResponseField name="icp_scoring_icp_title" type="string">
      The display name of the ICP definition used to score this contact.
    </ResponseField>

    <ResponseField name="icp_scoring_score" type="integer">
      A numeric ICP fit score between `0` and `100`. Higher scores indicate a closer match to your configured Ideal Customer Profile.
    </ResponseField>

    <ResponseField name="icp_scoring_reason" type="string">
      A human-readable explanation of why this contact received their ICP score.
    </ResponseField>

    <ResponseField name="created_at" type="string">
      ISO 8601 timestamp of when this contact was first identified by Knock2.
    </ResponseField>
  </Expandable>
</ResponseField>

***

## Error Responses

| HTTP Status | `code`                | Description                                                                                                                                                    |
| ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `401`       | `unauthorized`        | Your API key is missing or invalid.                                                                                                                            |
| `403`       | `forbidden`           | Your API key does not have the `contacts:read` scope.                                                                                                          |
| `404`       | `not_found`           | No contact was found for the given ID — including a malformed (non-UUID) `contact_id`, which is rejected as not-found rather than triggering a database error. |
| `422`       | `validation_error`    | The request parameters failed validation.                                                                                                                      |
| `429`       | `rate_limit_exceeded` | You have exceeded the rate limit. Apply exponential backoff and retry.                                                                                         |

```json 401 Unauthorized theme={null}
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key.",
    "details": null
  }
}
```

```json 404 Not Found theme={null}
{
  "error": {
    "code": "not_found",
    "message": "No contact found for the provided ID.",
    "details": null
  }
}
```

```json 422 Validation Error theme={null}
{
  "error": {
    "code": "validation_error",
    "message": "Invalid contact_id format.",
    "details": null
  }
}
```

```json 429 Rate limit exceeded theme={null}
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Please slow down and retry with exponential backoff.",
    "details": null
  }
}
```
