---
title: "Enrich Company (Bulk)"
method: POST
path: "/v2/companies/enrich/bulk"
tags: ["Companies"]
---

# Enrich Company (Bulk)

`POST /v2/companies/enrich/bulk`

## Request

- Base URL: `https://api.village.ai`
- URL: `https://api.village.ai/v2/companies/enrich/bulk`
- Auth: HTTP bearer

Get detailed information for multiple companies in a single request. Use this for batch enrichment of account lists or CRM records. Provide up to 10 domains, LinkedIn URLs, or URLs. Returns the same company data as enrich_company for each. Partial results are returned if some lookups fail - check each result for company data or error status. Companies not already in Village are fetched live from HarvestAPI (LinkedIn data), or, for a domain Village does not know, read from the company's public website via ScrapingBee, and saved to Village. People can have their data removed by emailing privacy@village.ai or support@village.ai.

## Request body

- CompanyEnrichBulkRequest: Bulk company enrichment request (max 10 companies)
  - `identifiers` CompanyEnrichIdentifier[], required: Array of company identifiers to enrich
    - union: Company identifier - provide one of: domain, linkedin_url, or url
      - object: Company by domain
        - `domain` string, required: Company domain (normalized, without www prefix)
      - object: Company by LinkedIn URL
        - `linkedin_url` string, required: LinkedIn company page URL
      - object: Company by generic URL (auto-detected)
        - `url` string, required
  - `mode` 'cached_first' | 'cached_only' | 'realtime_only': How to source the data. `cached_first` (default): return Village's cached profile if it is recent, otherwise fetch live — credited only when it fetches. `cached_only`: never fetch live, and report a miss when the profile is not already cached (404 on the single endpoints, a per-item not-found on the bulk ones) — never credited. `realtime_only`: always fetch live, and credited whenever that fetch returns data; a fetch that finds nothing is still free.

## Response `200`

Bulk enrichment completed (check individual results for errors)

- object
  - `data` CompanyEnrichmentItem[], required: Bulk company enrichment response array
    - `company` BasicCompanyProfile: Basic company profile with enriched data
      - `name` string, required
      - `linkedin_url` string, nullable, required
      - `website` string, nullable, required
      - `domain` string, nullable, required
      - `employee_count` number, nullable, required
      - `industry` string, nullable, required
      - `crunchbase_url` string, nullable
      - `founded` number, nullable
      - `description` string, nullable
      - `type` string, nullable: Ownership type (e.g. Public, Private, Nonprofit)
      - `funding` union: Funding data, passed through from storage as-is. Two shapes are possible and callers must handle both: an OBJECT summarising the most-recent round (keys `last_round_stage`, `price`, `investors`, `last_round_date`, `number_of_rounds`), or an ARRAY of per-round objects (keys `date`, `type`, `amount`, `currency`, `investors`) written by the refresh pipeline. An empty array means no funding data, which is the large majority of companies. All money, date and count fields are display strings, not numbers or ISO dates — don't parse or range-filter them.
        - object
          - `price` string, nullable
          - `investors` object[], nullable
          - `last_round_date` string, nullable
          - `last_round_stage` string, nullable
          - `number_of_rounds` union
            - string
            - number
            - unknown
        - object[]
          - `date` string, nullable
          - `type` string, nullable
          - `amount` union
            - string
            - number
            - unknown
          - `currency` string, nullable
          - `investors` string, nullable
        - unknown
      - `last_enrichment_at` string, nullable, required: ISO 8601 timestamp of the last refresh from a third-party data provider. Null when the profile has never been provider-enriched. Use it to judge staleness before paying for a realtime_only re-enrich.
    - `error` object
      - `code` string, required
      - `message` string, required
  - `metadata` object, required
    - `request_id` string, required

## Other responses

- `400`: Bad request - invalid parameters
- `401`: Unauthorized - missing or invalid authentication
- `500`: Internal server error

---

[API](https://skmtc.dev/village/apis/village-v2-api.md) - [All operations](https://skmtc.dev/village/apis/village-v2-api/llms.txt) - [OpenAPI document](https://skmtc.dev/village/apis/village-v2-api/revisions/aebe21a1a544?raw)
