---
title: "Bulk enrich companies by domain or slug"
method: POST
path: "/enrich"
---

# Bulk enrich companies by domain or slug

`POST /enrich`

## Request

- Base URL: `https://indexed.vc/api/v1`
- URL: `https://indexed.vc/api/v1/enrich`
- Auth: API key in header `X-API-Key`
- TypeScript: <https://skmtc.dev/indexed/apis/indexed-vc-api/docs/enrich/post.ts> (a function with typed inputs; its response is checked against the schema)

The GTM/RevOps query: submit a list of domains (or slugs) and get the
matched company records back. Domain matching is EXACT
registrable-domain (mercury.com matches Mercury at mercury.com or any
of its subdomains — never superstrings like bluemercury.com); you are
never billed for a fuzzy match. Billed like /reveal — 3 credits per
newly revealed match; previously-revealed matches are free within the
12-month cache. Unmatched inputs return status "not_found" (no charge).
Multiple inputs resolving to the same company are billed once; only the first
such input carries the charge. Ambiguous domains return 409 AMBIGUOUS_DOMAIN
without billing; retry with verified company slugs.
Host precedence matches /companies/lookup: the exact current website wins
over subsidiaries or former websites; conflicting current owners still fail closed.
A lookup-card match must also be eligible for full public company data.
Delivered domain matches include domain_match explaining the matched host and evidence.
Misses carry coverage_status (not_in_coverage_scope, scope_review,
pending_enrichment, not_found, or invalid_domain for malformed input that was never searched). A miss does not enqueue research.
Batch size and hourly limits follow your tier's reveal limits.

## Request body

- object
  - `domains` string[]: Company website domains, e.g. ["stripe.com", "openai.com"]
  - `slugs` string[]: Indexed company slugs

## Response `200`

Enrich results (normalized unique domains first, then unique slugs, in first-seen order within each group) + summary

- object
  - `data` object[], required
    - `query` string, required
    - `matched` boolean, required
    - `status` 'revealed' | 'cached' | 'insufficient_credits' | 'not_found', required
    - `credits_charged` integer, required
    - `domain_match` DomainMatch
      - `queried` string, required: Canonicalized domain supplied by the caller
      - `canonical_domain` string, nullable, required: Current website host on the matched company
      - `matched_via` 'canonical_domain' | 'alias_domain' | 'former_website', required
    - `coverage_status` 'not_in_coverage_scope' | 'scope_review' | 'pending_enrichment' | 'not_found' | 'invalid_domain': Explanation for unmatched inputs; does not promise admission or an enrichment timeline.
    - `data` CompanyProfile: Shape varies by depth parameter (slim/standard/full)
      - `id` string, uuid, required
      - `name` string, required
      - `slug` string, required
      - `data_as_of` string, date-time, nullable: Last verified enrichment timestamp; null when unknown.
      - `logo_url` string, nullable
      - `website` string, nullable
      - `short_description` string, nullable
      - `long_description` string, nullable
      - `industries` string[], nullable
      - `hq_city` string, nullable
      - `hq_state` string, nullable
      - `hq_country` string, nullable
      - `employee_count_range` string, nullable
      - `total_funding_raised` integer, nullable: Whole USD. Sum of disclosed itemized funding rounds at confidence 50+: equity rounds, notes, SAFEs, equity crowdfunding and grants. Grants are included; debt, IPOs, acquisitions and secondaries are not. Null when no counted round has a disclosed amount.
      - `operating_status` string, nullable
      - `founded_year` integer, nullable
      - `last_valuation` integer, nullable: Null at slim/standard depth or when undisclosed.
      - `last_valuation_date` string, date, nullable: Null at slim/standard depth or when unknown.
      - `load_states` object
        - `relationships` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `acquisitions` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `acquirer` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `parent_company` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `valuation_events` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `technologies` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
        - `app_stack` ProfileLoadState: Section read status, not a claim of historical data completeness. Full-record delivery rejects unsuccessful tracked section reads.
          - `status` 'ok' | 'partial' | 'unavailable' | 'failed', required
          - `cause` 'outage' | 'defect': Present only for unsuccessful reads.
      - `acquirer` NullableCompanyReference, nullable: Visible parent or acquirer identity; null when no visible reference is recorded.
        - `id` string, uuid
        - `name` string
        - `slug` string
        - `logo_url` string, nullable
      - `parent_company` NullableCompanyReference, nullable: Visible parent or acquirer identity; null when no visible reference is recorded.
        - `id` string, uuid
        - `name` string
        - `slug` string
        - `logo_url` string, nullable
      - `owners` CompanyRelationship[]: depth=standard and full. Companies that own this one, from reviewed, sourced relationships: its controlling parent (subsidiary, brand or division), or its joint-venture owners. This and subsidiaries share a bounded set of up to 200 relationships ordered by child name; empty means none in that returned set.
        - `relationship_type` 'subsidiary' | 'brand' | 'division' | 'joint_venture'
        - `ownership_pct` number, nullable: Stated ownership percentage when a source gives it
        - `started_on` string, date, nullable
        - `company` object
          - `id` string, uuid
          - `slug` string
          - `name` string
          - `logo_url` string, nullable
      - `subsidiaries` CompanyRelationship[]: depth=standard and full. Companies this one owns (subsidiaries, brands, divisions, joint ventures), from the same bounded set of up to 200 relationships as owners, ordered by child name.
        - `relationship_type` 'subsidiary' | 'brand' | 'division' | 'joint_venture'
        - `ownership_pct` number, nullable: Stated ownership percentage when a source gives it
        - `started_on` string, date, nullable
        - `company` object
          - `id` string, uuid
          - `slug` string
          - `name` string
          - `logo_url` string, nullable
      - `acquisitions` object[]: depth=full only. Up to 100 visible acquisitions, most recent first; a bounded subset, not a complete acquisition history.
        - `id` string, uuid
        - `name` string
        - `slug` string
        - `logo_url` string, nullable
        - `website` string, nullable
        - `short_description` string, nullable
        - `industries` string[], nullable
        - `hq_city` string, nullable
        - `hq_country` string, nullable
        - `acquisition_date` string, date, nullable
        - `acquisition_price_usd` integer, nullable
      - `valuation_events` object[]: Only present at depth=full
        - `id` string, uuid
        - `event_type` string
        - `amount_raised_usd` integer, nullable
        - `announced_date` string, date, nullable
        - `participants` object[]
          - `is_lead` boolean
          - `investor` object
            - `id` string, uuid
            - `name` string
            - `slug` string
            - `investor_type` string, nullable
      - `technologies` object[]: Only present at depth=full
        - `technology_name` string
        - `category` string, nullable
        - `stack_type` 'tech'
      - `app_stack` object[]: Only present at depth=full
        - `technology_name` string
        - `category` string, nullable
        - `stack_type` 'app'
  - `summary` EnrichSummary, required
    - `total_requested` integer, required: Number of unique normalized inputs.
    - `total_matched` integer, required: Number of distinct matched companies; multiple inputs can match one company.
    - `total_revealed` integer, required
    - `total_cached` integer, required
    - `total_unmatched` integer, required: Number of unmatched unique inputs
    - `total_credits_charged` integer, required

## Other responses

- `400`: Invalid request parameters
- `401`: Missing, invalid, or insufficient API key
- `402`: Credits exhausted, no active credit period, or overage cap reached (code CREDIT_LIMIT_REACHED). This is a billing state, not a rate limit — do not retry. Follow top_up_url to repurchase the returned top_up_pack.
- `409`: Domain matches multiple companies (AMBIGUOUS_DOMAIN); no charge.
- `429`: Rate limit exceeded (code RATE_LIMITED). Back off and retry after Retry-After.
- `503`: Data or credit service unavailable. DATA_UNAVAILABLE means requested entity preparation failed before charging; retry later. SYSTEM_ERROR may have an unknown billing outcome after a lost deduction response; check credit usage before retrying.

---

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