Enrich Phone Finder API

Finds phone and mobile numbers associated with a person from their email address or LinkedIn profile URL, with a bulk variant plus progress and results endpoints. Confirmed endpoint GET /reverse-lookup/phones at 500 credits per successful lookup (not charged when no numbers are found).

OpenAPI Specification

enrich-so-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Enrich API
  description: >-
    Enrich (enrich.so) is a person and company data enrichment API. From one REST
    interface it resolves professional profiles from an email address (reverse email
    lookup), finds and verifies professional email addresses, finds phone/mobile numbers,
    resolves a company and geolocation from an IP address, scrapes LinkedIn company
    followers, and searches a lead-finder database of people and organizations. All
    requests use the base URL https://dev.enrich.so/api/v3 and authenticate with an API
    key passed either in the `x-api-key` header or as `Authorization: Bearer`. Usage is
    metered against a prepaid credit balance; "not found" results are refunded.

    Grounding note: the single-lookup endpoints in this document
    (POST /reverse-lookup/lookup, POST /email-finder, POST /email-validation,
    GET /reverse-lookup/phones, POST /ip-to-company, POST /company-follower,
    POST /lead-finder/search, POST /lead-finder/reveal) and their credit costs are
    confirmed from the live Enrich documentation. The batch / progress / results sub-paths
    are modeled from the documented batch-and-poll pattern (submit -> check progress ->
    get results) and their exact URL segments should be confirmed against the current docs
    before code generation. Modeled operations are marked with `x-endpoint-modeled: true`.
  version: '3.0'
  contact:
    name: Enrich
    url: https://www.enrich.so
  termsOfService: https://www.enrich.so/terms
servers:
- url: https://dev.enrich.so/api/v3
  description: Enrich API v3
security:
- apiKeyHeader: []
- bearerAuth: []
tags:
- name: Person Enrichment
  description: Reverse email lookup returning a person's professional profile.
- name: Email Finder
  description: Find a professional email from a name and company domain.
- name: Email Verification
  description: Validate email addresses for deliverability.
- name: Phone Finder
  description: Find phone and mobile numbers for a person.
- name: Company Intelligence
  description: IP-to-company resolution and LinkedIn company-follower scraping.
- name: Lead Finder
  description: Search and reveal leads across people and organizations.
- name: Account
  description: Credit balance and transaction history.
paths:
  /reverse-lookup/lookup:
    post:
      operationId: lookupProfileByEmail
      tags:
      - Person Enrichment
      summary: Look up a professional profile by email
      description: >-
        Returns a person's professional profile - name, headline, current company,
        position history, education, and skills - from an email address. 10 credits per
        successful lookup; not charged when no profile is found.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LookupRequest'
      responses:
        '200':
          description: Professional profile resolved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReverseLookupResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
  /reverse-lookup/batch:
    post:
      operationId: lookupProfilesBatch
      tags:
      - Person Enrichment
      summary: Look up professional profiles in batch
      description: >-
        Submits up to many email addresses for asynchronous reverse-email-lookup
        enrichment, returning a batch id to poll. 10 credits per successful profile.
      x-endpoint-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchLookupRequest'
      responses:
        '202':
          description: Batch accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchSubmitResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
  /reverse-lookup/batch/{batchId}:
    get:
      operationId: getBulkLookupResults
      tags:
      - Person Enrichment
      summary: Check progress and get bulk lookup results
      description: Returns the status and, when complete, the enriched profiles for a batch.
      x-endpoint-modeled: true
      parameters:
      - name: batchId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Batch status or results.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchStatusResponse'
        '404':
          $ref: '#/components/responses/NotFound'
  /email-finder:
    post:
      operationId: findProfessionalEmail
      tags:
      - Email Finder
      summary: Find a professional email
      description: >-
        Finds a person's professional email address from first name, last name, and
        company domain. 10 credits per successful find; not charged when found is false.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailFinderRequest'
      responses:
        '200':
          description: Email found (or found=false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailFinderResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '429':
          $ref: '#/components/responses/RateLimited'
  /email-finder/batch:
    post:
      operationId: findEmailsBatch
      tags:
      - Email Finder
      summary: Find emails in batch
      description: Submits multiple name+domain rows for asynchronous email finding.
      x-endpoint-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchEmailFinderRequest'
      responses:
        '202':
          description: Batch accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchSubmitResponse'
  /email-validation:
    post:
      operationId: validateEmail
      tags:
      - Email Verification
      summary: Validate a single email
      description: >-
        Checks whether an email is deliverable, returning valid, invalid, or risky along
        with confidence, mail provider, and catch-all status. 1 credit per request; not
        charged when the result is risky.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailValidationRequest'
      responses:
        '200':
          description: Validation result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailValidationResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '429':
          $ref: '#/components/responses/RateLimited'
  /email-validation/batch:
    post:
      operationId: validateEmailsBatch
      tags:
      - Email Verification
      summary: Validate emails in batch
      description: Submits up to 500,000 emails for asynchronous validation.
      x-endpoint-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchEmailValidationRequest'
      responses:
        '202':
          description: Batch accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchSubmitResponse'
  /reverse-lookup/phones:
    get:
      operationId: findPhoneNumbers
      tags:
      - Phone Finder
      summary: Find phone numbers
      description: >-
        Returns phone and mobile numbers for a person, keyed on their email address or
        LinkedIn profile URL (at least one is required). 500 credits per successful
        lookup; not charged when no numbers are found.
      parameters:
      - name: email
        in: query
        required: false
        schema:
          type: string
          format: email
        description: The person's email address.
      - name: linkedin
        in: query
        required: false
        schema:
          type: string
        description: The person's LinkedIn profile URL.
      responses:
        '200':
          description: Phone numbers found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneLookupResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '429':
          $ref: '#/components/responses/RateLimited'
  /reverse-lookup/phones/batch:
    post:
      operationId: findPhoneNumbersBatch
      tags:
      - Phone Finder
      summary: Find phone numbers in batch
      description: Submits multiple people for asynchronous phone lookup.
      x-endpoint-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneBatchRequest'
      responses:
        '202':
          description: Batch accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchSubmitResponse'
  /ip-to-company:
    post:
      operationId: resolveCompanyFromIp
      tags:
      - Company Intelligence
      summary: Resolve company from IP
      description: >-
        Resolves company, organization, and geolocation information from an IPv4 or IPv6
        address. Results are cached for 7 days. 100 credits per request; not charged when
        no domain is found.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IpToCompanyRequest'
      responses:
        '200':
          description: Company and geolocation resolved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IpToCompanyResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '429':
          $ref: '#/components/responses/RateLimited'
  /company-follower:
    post:
      operationId: startCompanyFollowerScrape
      tags:
      - Company Intelligence
      summary: Start company follower scrape
      description: >-
        Starts an asynchronous scrape of a LinkedIn company's followers, with optional
        filters for country, state, job title, department, and seniority level. Credits
        are reserved upfront from max_limit and settled (excess refunded) when results are
        fetched. Returns a batchId.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyFollowerRequest'
      responses:
        '202':
          description: Scrape started.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StartCompanyFollowerResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
  /company-follower/{batchId}:
    get:
      operationId: getCompanyFollowerResults
      tags:
      - Company Intelligence
      summary: Check scrape progress and get follower results
      description: Returns scrape progress and, when complete, the follower profiles.
      x-endpoint-modeled: true
      parameters:
      - name: batchId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Scrape status or follower results.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyFollowerResultsResponse'
        '404':
          $ref: '#/components/responses/NotFound'
  /lead-finder/search:
    post:
      operationId: searchLeads
      tags:
      - Lead Finder
      summary: Search leads
      description: >-
        Searches across people, companies, and insights with roughly 135 filter fields
        spanning person attributes, firmographics, and technology stack. The first 3 pages
        (or 75 results) per search are free; pages beyond that cost 1 credit per result.
        Max 40 pages per search.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LeadSearchRequest'
      responses:
        '200':
          description: Matching leads.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LeadSearchResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /lead-finder/count:
    post:
      operationId: countMatchingLeads
      tags:
      - Lead Finder
      summary: Count matching leads
      description: Returns the number of leads matching a set of filters without returning records.
      x-endpoint-modeled: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LeadCountRequest'
      responses:
        '200':
          description: Match count.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LeadCountResponse'
  /lead-finder/reveal:
    post:
      operationId: revealContactInfo
      tags:
      - Lead Finder
      summary: Reveal contact info
      description: >-
        Asynchronously reveals contact information (email and/or phone) for up to 25 leads,
        returning a job id to poll. 50 credits per lead for email, 525 for phone, 575 for
        both (the default). Previously revealed contacts return from cache at no cost.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LeadRevealRequest'
      responses:
        '202':
          description: Reveal job accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LeadRevealResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
  /wallet/balance:
    get:
      operationId: getCreditBalance
      tags:
      - Account
      summary: Get your credit balance
      description: Returns the current prepaid credit balance for your account.
      x-endpoint-modeled: true
      responses:
        '200':
          description: Wallet balance.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WalletBalanceResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /wallet/transactions:
    get:
      operationId: getTransactionHistory
      tags:
      - Account
      summary: Get transaction history
      description: Returns the credit debit/refund transaction history for your account.
      x-endpoint-modeled: true
      responses:
        '200':
          description: Transaction history.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WalletTransactionsResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    apiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: API key (prefixed sk_) passed in the x-api-key header.
    bearerAuth:
      type: http
      scheme: bearer
      description: API key passed as Authorization Bearer token.
  responses:
    Unauthorized:
      description: Missing, invalid, or disabled API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    InsufficientCredits:
      description: Not enough credits to complete the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    NotFound:
      description: No matching record was found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    RateLimited:
      description: Rate limit exceeded. Includes a Retry-After header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  schemas:
    EnrichmentMeta:
      type: object
      description: Metadata returned with every response, including remaining credit balance.
      properties:
        creditsCharged:
          type: integer
        creditsRemaining:
          type: integer
        cached:
          type: boolean
    ErrorEnvelope:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
    LookupRequest:
      type: object
      required:
      - email
      properties:
        email:
          type: string
          format: email
          description: The email address to look up.
    ReverseLookupResponse:
      type: object
      properties:
        success:
          type: boolean
        meta:
          $ref: '#/components/schemas/EnrichmentMeta'
        data:
          type: object
          properties:
            fullName:
              type: string
            headline:
              type: string
            company:
              type: string
            location:
              type: string
            linkedinUrl:
              type: string
            positions:
              type: array
              items:
                type: object
            education:
              type: array
              items:
                type: object
            skills:
              type: array
              items:
                type: string
    EmailFinderRequest:
      type: object
      required:
      - firstName
      - lastName
      - domain
      properties:
        firstName:
          type: string
        lastName:
          type: string
        domain:
          type: string
          description: Company domain, e.g. figma.com.
    EmailFinderResponse:
      type: object
      properties:
        success:
          type: boolean
        meta:
          $ref: '#/components/schemas/EnrichmentMeta'
        data:
          type: object
          properties:
            found:
              type: boolean
            email:
              type: string
              format: email
            confidence:
              type: number
    EmailValidationRequest:
      type: object
      required:
      - email
      properties:
        email:
          type: string
          format: email
          minLength: 1
          maxLength: 254
    EmailValidationResponse:
      type: object
      properties:
        success:
          type: boolean
        meta:
          $ref: '#/components/schemas/EnrichmentMeta'
        data:
          type: object
          properties:
            status:
              type: string
              enum:
              - valid
              - invalid
              - risky
            confidence:
              type: number
            mailProvider:
              type: string
            catchAll:
              type: boolean
    PhoneLookupResponse:
      type: object
      properties:
        success:
          type: boolean
        meta:
          $ref: '#/components/schemas/EnrichmentMeta'
        data:
          type: object
          properties:
            phones:
              type: array
              items:
                type: object
                properties:
                  number:
                    type: string
                  type:
                    type: string
    IpToCompanyRequest:
      type: object
      required:
      - ip
      properties:
        ip:
          type: string
          description: IPv4 or IPv6 address to resolve.
    IpToCompanyResponse:
      type: object
      properties:
        success:
          type: boolean
        meta:
          $ref: '#/components/schemas/EnrichmentMeta'
        data:
          type: object
          properties:
            domain:
              type: string
            organization:
              type: string
            country:
              type: string
            region:
              type: string
            city:
              type: string
            latitude:
              type: number
            longitude:
              type: number
            timezone:
              type: string
            isp:
              type: string
            usageType:
              type: string
    CompanyFollowerRequest:
      type: object
      required:
      - companyUrl
      - max_limit
      properties:
        companyUrl:
          type: string
          description: LinkedIn company URL to scrape.
        max_limit:
          type: integer
          minimum: 1
          maximum: 50000
        countries:
          type: array
          items:
            type: string
        states:
          type: array
          items:
            type: string
        jobTitles:
          type: array
          items:
            type: string
        departments:
          type: array
          items:
            type: string
        levels:
          type: array
          items:
            type: string
        webhookUrl:
          type: string
        skipCache:
          type: boolean
    StartCompanyFollowerResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            batchId:
              type: string
            creditsReserved:
              type: integer
            perItemCost:
              type: integer
    CompanyFollowerResultsResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            status:
              type: string
            followers:
              type: array
              items:
                type: object
    LeadSearchRequest:
      type: object
      required:
      - filters
      properties:
        filters:
          type: object
          description: LeadFinderSearchFilters - person, organization, and technology filters.
        page:
          type: integer
          default: 1
        pageSize:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
        excludeFilters:
          type: object
    LeadSearchResponse:
      type: object
      properties:
        success:
          type: boolean
        pagination:
          type: object
          properties:
            page:
              type: integer
            pageSize:
              type: integer
            total:
              type: integer
        data:
          type: array
          items:
            type: object
    LeadCountRequest:
      type: object
      required:
      - filters
      properties:
        filters:
          type: object
    LeadCountResponse:
      type: object
      properties:
        success:
          type: boolean
        count:
          type: integer
    LeadRevealRequest:
      type: object
      required:
      - leads
      properties:
        leads:
          type: array
          maxItems: 25
          items:
            type: object
            properties:
              id:
                type: string
        fields:
          type: array
          items:
            type: string
            enum:
            - email
            - phone
    LeadRevealResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            jobId:
              type: string
    BatchLookupRequest:
      type: object
      required:
      - emails
      properties:
        emails:
          type: array
          items:
            type: string
            format: email
    BatchEmailFinderRequest:
      type: object
      required:
      - rows
      properties:
        rows:
          type: array
          items:
            $ref: '#/components/schemas/EmailFinderRequest'
    BatchEmailValidationRequest:
      type: object
      required:
      - emails
      properties:
        emails:
          type: array
          items:
            type: string
            format: email
    PhoneBatchRequest:
      type: object
      required:
      - rows
      properties:
        rows:
          type: array
          items:
            type: object
            properties:
              email:
                type: string
              linkedin:
                type: string
    BatchSubmitResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            batchId:
              type: string
            status:
              type: string
    BatchStatusResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            batchId:
              type: string
            status:
              type: string
            results:
              type: array
              items:
                type: object
    WalletBalanceResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: object
          properties:
            balance:
              type: integer
    WalletTransactionsResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              amount:
                type: integer
              type:
                type: string
              createdAt:
                type: string
                format: date-time