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

# CrustData V3: Person Enrich

> Enrich a person from a LinkedIn profile URL or business email with their current title, company, employment history, education, and skills.

Enrich a person from a LinkedIn profile URL or business email with their current title, company, employment history, education, and skills.

> [!NOTE]
>
> Tool ID: `crustdata_v3_person_enrich`

## Run this action

Use the TypeScript SDK for one call. Use `ctx.tools.execute(...)` inside a Play for durable calls, scheduled calls, or CSV processing.

```ts theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
import { Deepline } from 'deepline';

const deepline = await Deepline.connect();
const result = await deepline.tools.execute(
  'crustdata_v3_person_enrich',
  {
    "professional_network_profile_urls": [
      "https://www.linkedin.com/in/jane-doe"
    ],
    "business_emails": [
      "jane.doe@example.com"
    ],
    "fields": [
      "email"
    ]
  },
);

console.log(result.toolResponse.raw);
```

### CLI

```bash theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
deepline tools execute crustdata_v3_person_enrich --input '{
  "professional_network_profile_urls": [
    "https://www.linkedin.com/in/jane-doe"
  ],
  "business_emails": [
    "jane.doe@example.com"
  ],
  "fields": [
    "email"
  ]
}' --json
```

## Example response

The SDK returns this shape at `result.toolResponse.raw`. The example values illustrate the response.

```json theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
{
  "data": [
    {
      "matched_on": "jane.doe@example.com",
      "match_type": "professional_network_profile_url",
      "matches": [
        {
          "confidence_score": 123,
          "person_data": {}
        }
      ]
    }
  ]
}
```

Use `deepline describe crustdata_v3_person_enrich --json` for the latest machine-readable contract.

## Input reference

Request body for /person/enrich and /person/professional\_network/enrich/live. Submit exactly one identifier type per request — professional\_network\_profile\_urls or business\_emails.

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `payload.professional_network_profile_urls` | `array` | No | — | Array of professional-network profile URLs (max 25). |
| `payload.business_emails` | `array` | No | — | Business email of the person to lookup Format: `email`. |
| `payload.fields` | `array` | No | — | Fields to include in the response. Valid field groups for enrich: basic\_profile, professional\_network, skills, social\_handles, experience, education, certifications, honors, dev\_platform\_profiles, assessment, social\_posts, research\_profiles. Use dot-notation for nested fields (e.g., "basic\_profile.name", "experience.employment\_details"). If omitted, a default set (basic\_profile, social\_handles) is returned. Request additional groups explicitly. Some groups (for example certifications, honors, See the live schema for the complete constraint. |
| `payload.min_similarity_score` | `number` | No | — | Minimum similarity score for email matching Minimum: 0. Maximum: 1. |
| `payload.preview` | `boolean` | No | `false` | Preview mode returns only basic profile fields and charges 0 credits. Cannot be combined with enrich\_realtime. |

<details>
  <summary>Show raw input schema</summary>

  ### Input JSON Schema

  ```json theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
  {
    "type": "object",
    "description": "Request body for /person/enrich and /person/professional_network/enrich/live. Submit exactly one identifier type per request — professional_network_profile_urls or business_emails.",
    "properties": {
      "professional_network_profile_urls": {
        "type": "array",
        "description": "Array of professional-network profile URLs (max 25).",
        "items": {
          "type": "string"
        }
      },
      "business_emails": {
        "type": "array",
        "description": "Business email of the person to lookup",
        "items": {
          "type": "string"
        },
        "format": "email"
      },
      "fields": {
        "type": "array",
        "description": "Fields to include in the response. Valid field groups for enrich: basic_profile, professional_network, skills, social_handles, experience, education, certifications, honors, dev_platform_profiles, assessment, social_posts, research_profiles. Use dot-notation for nested fields (e.g., \"basic_profile.name\", \"experience.employment_details\"). If omitted, a default set (basic_profile, social_handles) is returned. Request additional groups explicitly. Some groups (for example certifications, honors, and research_profiles) require field-level permission on your API key; research_profiles is enabled per account on request and returns `403 Access denied to fields: research_profiles` without the grant.",
        "items": {
          "type": "string"
        }
      },
      "min_similarity_score": {
        "type": [
          "number",
          "null"
        ],
        "description": "Minimum similarity score for email matching",
        "minimum": 0,
        "maximum": 1
      },
      "preview": {
        "type": "boolean",
        "description": "Preview mode returns only basic profile fields and charges 0 credits. Cannot be combined with enrich_realtime.",
        "default": false
      }
    },
    "required": [],
    "additionalProperties": false
  }
  ```
</details>

## Output reference

Standard tool result payload.

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `result.data` | `array` | Yes | — | Response from /person/enrich. Returns a top-level array with one entry per submitted identifier. |
| `result.data[].matched_on` | `string` | No | — | The specific input value (e.g., '[someone@company.com](mailto:someone@company.com)') |
| `result.data[].match_type` | `"professional_network_profile_url" \| "business_email"` | No | — | Allowed: `professional_network_profile_url`, `business_email`. |
| `result.data[].matches` | `array` | No | — | — |
| `result.data[].matches[].confidence_score` | `number` | No | — | Format: `float`. |
| `result.data[].matches[].person_data` | `object` | No | — | Fully-enriched person profile with basic profile, skills, social handles, experience, education, certifications, and contact. |
| `result.data[].matches[].person_data.crustdata_person_id` | `integer` | No | — | — |
| `result.data[].matches[].person_data.basic_profile` | `object` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.name` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.headline` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.first_name` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.last_name` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.current_title` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.professional_network_name` | `string \| null` | No | — | Display name on the person's professional-network profile. |
| `result.data[].matches[].person_data.basic_profile.normalized_title` | `object \| null` | No | — | Job Title Normalization (JTN, beta) — structured representation of the person's current title mapped to Crustdata's proprietary taxonomy (20 departments, 226 sub-departments). See [https://docs.crustdata.com/guides/job-title-normalization](https://docs.crustdata.com/guides/job-title-normalization). |
| `result.data[].matches[].person_data.basic_profile.normalized_title.matched_title` | `string \| null` | No | — | Canonical normalized title matched to the person's current title. |
| `result.data[].matches[].person_data.basic_profile.normalized_title.department` | `string \| null` | No | — | High-level department the normalized title maps to. |
| `result.data[].matches[].person_data.basic_profile.normalized_title.sub_department` | `string \| null` | No | — | More granular classification within the department. |
| `result.data[].matches[].person_data.basic_profile.normalized_title.similarity` | `number \| null` | No | — | Similarity score between the raw title and the matched normalized title, from 0 to 1. |
| `result.data[].matches[].person_data.basic_profile.normalized_title.confident` | `boolean \| null` | No | — | Whether the normalized-title match is considered confident. |
| `result.data[].matches[].person_data.basic_profile.summary` | `string` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.languages` | `array` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.last_updated` | `string \| null` | No | — | Format: `date-time`. |
| `result.data[].matches[].person_data.basic_profile.profile_picture_permalink` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location` | `object \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location.city` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location.state` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location.country` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location.continent` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.basic_profile.location.raw` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network` | `object` | No | — | — |
| `result.data[].matches[].person_data.professional_network.profile_picture_url` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.profile_picture_permalink` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.name` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.pronoun` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.headline` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.current_title` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.summary` | `string` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location` | `object` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location.city` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location.state` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location.country` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location.continent` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.location.raw` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.connections` | `integer \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.followers` | `integer \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.joined_date` | `string \| null` | No | — | — |
| `result.data[].matches[].person_data.professional_network.verifications` | `array` | No | — | — |
| `result.data[].matches[].person_data.professional_network.open_to_cards` | `array` | No | — | Open-to signal codes declared on the profile. Filter with the `in` operator using one or more of the closed enum values below. Human-readable strings like `"open_to_work"` are not indexed and return zero results. \| Code \| Meaning \| \| ------------------ \| ------------------------------------------------ \| \| `CAREER_INTEREST` \| Profile is open to new career opportunities \| \| `HIRING_MANAGER` \| Profile is actively hiring \| \| `VOLUNTEERING` \| Profile is open to volunteer work \| |
| `result.data[].matches[].person_data.professional_network.metadata` | `object` | No | — | — |

The table shows the first 50 fields. Use the live contract below for every field.

> [!NOTE]
>
> This output schema is too large for an inline display. Read the complete live contract with `deepline describe crustdata_v3_person_enrich --json`.

## Deepline cost

* Pricing model: `per_result` (per result).
* Estimated Deepline credits: `0.4` per pricing unit.

## Related documentation

* [CrustData V3 provider guide](https://deepline.com/docs/providers/crustdata-v3/guide.md)
* [SDK V2 quickstart](https://deepline.com/docs/sdk-v2/quickstart.md)
* [SDK reference](https://deepline.com/docs/sdk-v2/sdk-reference.md)
* [Run tools across a CSV](https://deepline.com/docs/sdk-v2/batch-csv.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.