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

# Contact Enrich

> Enrich only the contact data for a person — business emails, personal emails, and phone numbers — using the Crustdata cached dataset.
Provide either a profile URL or a business email. Exactly one identifier type must be provided per request. Supports batch enrichment of up to 25 identifiers at once.

This endpoint mirrors `/person/enrich` but is scoped to contact fields: the only enrichable fields are `contact.business_emails`, `contact.personal_emails`, and `contact.phone_numbers`. Requesting any non-contact field returns a `400` error listing the available contact fields. When `fields` is omitted, all three contact tiers are enriched. Each submitted identifier returns one result entry; an identifier with no contact match returns an empty `matches` array.
<Note>
    Default `rate-limit` is 15 requests per minute. Send an email to [gtm@crustdata.co](mailto:gtm@crustdata.co) to discuss higher limits if needed for your use case.
</Note>




## OpenAPI

````yaml /openapi-specs/2025-11-01/person.yaml post /person/contact/enrich
openapi: 3.0.3
info:
  title: Person Dataset API
  version: '2025-11-01'
  description: >
    The Person Dataset API provides a comprehensive suite of endpoints for
    discovering, enriching, and managing person data at scale.


    - **Search**: Query the person database using flexible filters, sorting, and
    pagination to find people matching specific criteria such as job title,
    company, location, and more.

    - **Enrich**: Enrich person records from the cached dataset using profile
    URLs, returning detailed professional information.

    - **Live Enrich**: Fetch fresh profile data from the web when a profile is
    not yet in the cache or when the latest data is needed.

    - **Autocomplete**: Get type-ahead suggestions for person search fields,
    useful for building search UIs with field value previews.

    - **Realtime Search**: Search people in real time using live person search
    filters, supporting both synchronous and asynchronous (background job)
    modes.
servers:
  - url: https://api.crustdata.com
    description: Production API server
security:
  - bearerAuth: []
tags:
  - name: Person APIs
    description: Core person data operations
  - name: Search APIs
    description: Endpoints for searching and discovering people
  - name: Enrich APIs
    description: Endpoints for enriching person records
  - name: Autocomplete APIs
    description: Endpoints for field value autocomplete suggestions
paths:
  /person/contact/enrich:
    post:
      tags:
        - Person APIs
        - Enrich APIs
      summary: Enrich only person contact data from cached dataset
      description: >
        Enrich only the contact data for a person — business emails, personal
        emails, and phone numbers — using the Crustdata cached dataset.

        Provide either a profile URL or a business email. Exactly one identifier
        type must be provided per request. Supports batch enrichment of up to 25
        identifiers at once.


        This endpoint mirrors `/person/enrich` but is scoped to contact fields:
        the only enrichable fields are `contact.business_emails`,
        `contact.personal_emails`, and `contact.phone_numbers`. Requesting any
        non-contact field returns a `400` error listing the available contact
        fields. When `fields` is omitted, all three contact tiers are enriched.
        Each submitted identifier returns one result entry; an identifier with
        no contact match returns an empty `matches` array.

        <Note>
            Default `rate-limit` is 15 requests per minute. Send an email to [gtm@crustdata.co](mailto:gtm@crustdata.co) to discuss higher limits if needed for your use case.
        </Note>
      operationId: enrichPersonContactDataset
      parameters:
        - $ref: '#/components/parameters/ApiVersion'
      requestBody:
        required: true
        description: >-
          Person identifier (profile URL or business email) and optional
          contact-field selection.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PersonContactEnrichRequest'
            examples:
              enrich_by_profile_url:
                summary: Enrich contact data by profile URL
                value:
                  professional_network_profile_urls:
                    - https://www.linkedin.com/in/dvdhsu/
              enrich_by_email:
                summary: Enrich contact data by business email
                value:
                  business_emails:
                    - david@example.com
              enrich_specific_tiers:
                summary: Request only business emails and phone numbers
                value:
                  professional_network_profile_urls:
                    - https://www.linkedin.com/in/dvdhsu/
                  fields:
                    - contact.business_emails
                    - contact.phone_numbers
      responses:
        '200':
          description: >-
            Enriched person contact data. Returns a top-level array with one
            entry per submitted identifier; unmatched identifiers return an
            empty `matches` array.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonContactEnrichResponse'
              examples:
                enrich_by_profile_url_response:
                  summary: Contact enrichment result for a profile URL
                  value:
                    - matched_on: https://www.linkedin.com/in/dvdhsu/
                      match_type: professional_network_profile_url
                      matches:
                        - confidence_score: 1
                          person_data:
                            crustdata_person_id: 14540
                            contact:
                              business_emails:
                                - email: david@example.com
                                  status: deliverable
                                - email: d.hsu@example.com
                                  status: unknown
                              personal_emails:
                                - email: david.personal@example.com
                                  status: deliverable
                              phone_numbers:
                                - '+15555550123'
                enrich_by_email_response:
                  summary: Contact enrichment result for a business email
                  value:
                    - matched_on: david@example.com
                      match_type: business_email
                      matches:
                        - confidence_score: 1
                          person_data:
                            crustdata_person_id: 14540
                            contact:
                              business_emails:
                                - email: david@example.com
                                  status: deliverable
                              personal_emails: []
                              phone_numbers: []
                no_match_response:
                  summary: Identifier with no contact match
                  value:
                    - matched_on: https://www.linkedin.com/in/no-such-profile/
                      match_type: professional_network_profile_url
                      matches: []
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_identifier:
                  summary: Missing required identifier
                  value:
                    error:
                      type: invalid_request
                      message: >-
                        Exactly one identifier must be provided:
                        professional_network_profile_urls
                      metadata: []
                both_identifiers:
                  summary: Both identifier types supplied
                  value:
                    error:
                      type: invalid_request
                      message: >-
                        Only one identifier type can be provided. Found:
                        professional_network_profile_urls, business_emails
                      metadata: []
                invalid_field:
                  summary: Non-contact field requested
                  value:
                    error:
                      type: invalid_request
                      message: 'Invalid fields: basic_profile'
                      metadata:
                        - available_fields:
                            - contact
                            - contact.business_emails
                            - contact.business_emails.email
                            - contact.business_emails.status
                            - contact.personal_emails
                            - contact.personal_emails.email
                            - contact.personal_emails.status
                            - contact.phone_numbers
                            - crustdata_person_id
        '401':
          description: Unauthorized - invalid or missing API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: unauthorized
                  message: Invalid API key in request.
                  metadata: []
        '403':
          description: Permission denied or insufficient credits
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  parameters:
    ApiVersion:
      name: x-api-version
      in: header
      required: true
      schema:
        type: string
        enum:
          - '2025-11-01'
        default: '2025-11-01'
        example: '2025-11-01'
      description: API version to use. This endpoint currently requires `2025-11-01`.
  schemas:
    PersonContactEnrichRequest:
      type: object
      description: >-
        Request body for /person/contact/enrich. Submit exactly one identifier
        type per request — professional_network_profile_urls or business_emails
        — and optionally restrict which contact tiers are enriched.
      properties:
        professional_network_profile_urls:
          type: array
          items:
            type: string
          description: Array of professional-network profile URLs to enrich (max 25).
          example:
            - https://www.linkedin.com/in/dvdhsu/
        business_emails:
          type: array
          items:
            type: string
            format: email
          description: Array of business emails to look up (max 25).
          example:
            - david@example.com
        fields:
          type: array
          items:
            type: string
          description: >
            Contact tiers to enrich. Only contact fields are accepted:
            `contact.business_emails`, `contact.personal_emails`, and
            `contact.phone_numbers`. When omitted, all three tiers are enriched.
            Requesting any non-contact field returns a `400` error.
          example:
            - contact.business_emails
            - contact.phone_numbers
      oneOf:
        - required:
            - professional_network_profile_urls
        - required:
            - business_emails
      additionalProperties: false
      example:
        professional_network_profile_urls:
          - https://www.linkedin.com/in/dvdhsu/
    PersonContactEnrichResponse:
      type: array
      items:
        $ref: '#/components/schemas/PersonContactEnrichResult'
      description: >-
        Response from /person/contact/enrich. Returns a top-level array with one
        entry per submitted identifier.
      example:
        - matched_on: https://www.linkedin.com/in/dvdhsu/
          match_type: professional_network_profile_url
          matches:
            - confidence_score: 1
              person_data:
                crustdata_person_id: 14540
                contact:
                  business_emails:
                    - email: david@example.com
                      status: deliverable
                  personal_emails: []
                  phone_numbers: []
    ErrorResponse:
      type: object
      description: >-
        Standard error response returned by all Person API endpoints when a
        request fails.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - message
          properties:
            type:
              type: string
              enum:
                - invalid_request
                - authentication_error
                - unauthorized
                - insufficient_credits
                - permission_error
                - rate_limit_error
                - internal_error
              description: Category of the error
              example: invalid_request
            message:
              type: string
              description: Human-readable error message
              example: 'Unsupported filter field: ''current_title'''
            metadata:
              type: array
              items:
                type: object
                additionalProperties: true
              default: []
              description: >-
                Additional structured context (e.g., available_fields,
                sortable_fields)
    PersonContactEnrichResult:
      type: object
      description: >-
        One result entry in the contact-enrich response — one per submitted
        identifier.
      properties:
        matched_on:
          type: string
          description: >-
            The specific input value this entry corresponds to (a profile URL or
            a business email).
          example: https://www.linkedin.com/in/dvdhsu/
        match_type:
          type: string
          description: Which identifier type the input was matched on.
          enum:
            - professional_network_profile_url
            - business_email
        matches:
          type: array
          description: >-
            Matching contact records. Empty when no contact data was found for
            the identifier.
          items:
            $ref: '#/components/schemas/PersonContactEnrichMatch'
      example:
        matched_on: https://www.linkedin.com/in/dvdhsu/
        match_type: professional_network_profile_url
        matches:
          - confidence_score: 1
            person_data:
              crustdata_person_id: 14540
              contact:
                business_emails:
                  - email: david@example.com
                    status: deliverable
                personal_emails: []
                phone_numbers: []
    PersonContactEnrichMatch:
      type: object
      description: >-
        A single contact-enrichment match with a confidence score and the
        contact-only person record.
      properties:
        confidence_score:
          type: number
          format: float
          description: >-
            Confidence that this record matches the submitted identifier, from 0
            to 1.
          example: 1
        person_data:
          $ref: '#/components/schemas/PersonContactEnrichPerson'
      example:
        confidence_score: 1
        person_data:
          crustdata_person_id: 14540
          contact:
            business_emails:
              - email: david@example.com
                status: deliverable
            personal_emails: []
            phone_numbers: []
    PersonContactEnrichPerson:
      type: object
      description: Contact-only person record returned by /person/contact/enrich.
      properties:
        crustdata_person_id:
          type: integer
          description: Crustdata's stable internal identifier for the person.
          example: 14540
        contact:
          $ref: '#/components/schemas/PersonContactEnrichContact'
      example:
        crustdata_person_id: 14540
        contact:
          business_emails:
            - email: david@example.com
              status: deliverable
          personal_emails: []
          phone_numbers: []
    PersonContactEnrichContact:
      type: object
      description: >-
        Contact data returned by /person/contact/enrich — business emails,
        personal emails, and phone numbers.
      properties:
        business_emails:
          type: array
          description: Business email addresses with their deliverability status.
          items:
            type: object
            properties:
              email:
                type: string
                description: The business email address.
                example: david@example.com
              status:
                type: string
                description: >
                  Deliverability status of the email:

                  - `deliverable`: mailbox confirmed to exist and accept mail at
                  this exact address (lowest bounce risk).

                  - `catch_all`: the domain accepts mail for any address, so
                  this specific mailbox can't be confirmed.

                  - `invalid`: mailbox confirmed not to exist or otherwise
                  undeliverable (sending will bounce).

                  - `unknown`: deliverability couldn't be determined, or no
                  status info is available.
                enum:
                  - deliverable
                  - catch_all
                  - invalid
                  - unknown
                example: deliverable
          example:
            - email: david@example.com
              status: deliverable
        personal_emails:
          type: array
          description: Personal email addresses with their deliverability status.
          items:
            type: object
            properties:
              email:
                type: string
                description: The personal email address.
                example: david.personal@example.com
              status:
                type: string
                description: >
                  Deliverability status of the email:

                  - `deliverable`: mailbox confirmed to exist and accept mail at
                  this exact address (lowest bounce risk).

                  - `catch_all`: the domain accepts mail for any address, so
                  this specific mailbox can't be confirmed.

                  - `invalid`: mailbox confirmed not to exist or otherwise
                  undeliverable (sending will bounce).

                  - `unknown`: deliverability couldn't be determined, or no
                  status info is available.
                enum:
                  - deliverable
                  - catch_all
                  - invalid
                  - unknown
                example: deliverable
          example:
            - email: david.personal@example.com
              status: deliverable
        phone_numbers:
          type: array
          description: Phone numbers in E.164 format.
          items:
            type: string
          example:
            - '+15555550123'
      example:
        business_emails:
          - email: david@example.com
            status: deliverable
        personal_emails:
          - email: david.personal@example.com
            status: deliverable
        phone_numbers:
          - '+15555550123'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key passed as a Bearer token in the Authorization header.

````

## Related topics

- [Person Contact Enrich](/person-docs/contact/enrich.md)
- [Batch Contact Enrich](/person-docs/contact/batch.md)
- [Changelog](/openapi-specs/2025-11-01/changelog.md)
- [Identify (Reverse Email Lookup)](/person-docs/contact/identify.md)
