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

# Enrich a person from a LinkedIn URL or name

> Looks up a LinkedIn profile by URL, or resolves a name (+ optional company hint) to a profile first. Pass include_email:true to also attempt a verified business email (raises vendor cost; see credits_charged). Costs 2 credit(s) per call.



## OpenAPI

````yaml /horizon/openapi.json post /v1/person/enrich
openapi: 3.1.0
info:
  title: Horizon API
  version: '1.0'
  description: >-
    Horizon is a prepaid-credits REST API for LinkedIn/company enrichment, email
    finding and verification, job search, and web search. Every request
    authenticates with an `Authorization: Bearer <key>` header and, on a billed
    endpoint, debits a fixed number of credits from your prepaid balance (see
    each endpoint's description for its exact cost). Check your balance any time
    with GET /v1/usage.
servers:
  - url: https://horizon.gravitygtm.com/api
security:
  - bearerAuth: []
paths:
  /v1/person/enrich:
    post:
      tags:
        - person
      summary: Enrich a person from a LinkedIn URL or name
      description: >-
        Looks up a LinkedIn profile by URL, or resolves a name (+ optional
        company hint) to a profile first. Pass include_email:true to also
        attempt a verified business email (raises vendor cost; see
        credits_charged). Costs 2 credit(s) per call.
      requestBody:
        required: true
        description: Provide either linkedin_url or name.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PersonEnrichRequest'
      responses:
        '200':
          description: 200 — success. Charges 2 credit(s) on this endpoint.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      linkedinUrl:
                        type: string
                      firstName:
                        type: string
                      lastName:
                        type: string
                      headline:
                        type: string
                      location:
                        type: object
                        additionalProperties: true
                      currentPosition:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                      emails:
                        type: array
                        items:
                          type: object
                          properties:
                            email:
                              type: string
                            deliverable:
                              type: boolean
                            qualityScore:
                              type: number
                            free:
                              type: boolean
                            catchAllDomain:
                              type: boolean
                          additionalProperties: true
                    additionalProperties: true
                    description: HarvestAPI LinkedIn profile.
                  credits_charged:
                    type: number
                    description: Normally 2; see per-endpoint miss/skip policy notes.
                  credits_remaining:
                    type: number
                  cached:
                    type: boolean
                    description: >-
                      True when this result was served from cache without
                      calling the vendor.
                  request_id:
                    type: string
                    format: uuid
                required:
                  - data
                  - credits_charged
                  - credits_remaining
                  - cached
                  - request_id
        '401':
          description: >-
            401 unauthorized — missing or invalid `Authorization: Bearer <key>`
            header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: >-
            402 insufficient_credits — not enough credit balance to cover this
            endpoint's price. The vendor is never called.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: >-
            422 not_found — the vendor was called successfully but returned no
            result.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorResponse'
                  - type: object
                    properties:
                      credits_charged:
                        type: number
                        description: >-
                          0 for person.email (charged on success only); full
                          listed price for every other endpoint.
        '429':
          description: 429 rate_limited — per-key fixed-window rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '502':
          description: >-
            502 vendor_error — the upstream vendor call failed or threw. Any
            reserved credits are refunded in full.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: >-
            503 vendor_capacity — this endpoint's vendor has hit its global
            daily spend cap. No credits are reserved; try again later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PersonEnrichRequest:
      type: object
      properties:
        linkedin_url:
          type: string
          format: uri
        name:
          type: string
          minLength: 1
        company:
          type: string
          minLength: 1
        include_email:
          type: boolean
          default: false
    ErrorResponse:
      type: object
      description: >-
        Standard error body. Every response (success or error) carries a
        request_id for support reference.
      properties:
        error:
          type: string
          description: Machine-readable error code.
          enum:
            - unauthorized
            - insufficient_credits
            - not_found
            - rate_limited
            - vendor_error
            - vendor_capacity
        message:
          type: string
          description: Human-readable error detail.
        request_id:
          type: string
          format: uuid
        credits_remaining:
          type: number
          description: >-
            Present whenever a post-reservation/refund balance is known for this
            request.
        refund_issue:
          type: boolean
          description: >-
            Set only when a compensating credit refund itself failed (e.g. a
            transient store error) — the customer may have been charged without
            the refund landing yet.
      required:
        - error
        - message
        - request_id
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````