Integrations · Clay

Enrich companies by domain in Clay

Add an HTTP API column to a Clay table of company domains and get back each company's name, industries, headquarters, headcount band and funding summary from Indexed. An optional second column adds round-by-round funding history and the investors in each round.

What you get

Each matched domain returns the company card below. Fields we do not have come back as null; nothing is filled with a guess.

Path in the responseMeaning
data[0].nameCompany name
data[0].slugIndexed identifier. Input for the optional full-profile column
data[0].websiteCanonical website
data[0].short_descriptionOne-line description
data[0].industriesList of industry labels
data[0].hq_cityHeadquarters city
data[0].hq_countryHeadquarters country
data[0].employee_count_rangeHeadcount band: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+
data[0].total_funding_raisedTotal funding in whole USD. Sums equity rounds, notes, SAFEs and grants; debt and exits are excluded
data[0].last_funding_typeMost recent round type, for example seed or series_a
data[0].last_funding_dateDate of the most recent round (YYYY-MM-DD)
data[0].last_valuationMost recent disclosed valuation in whole USD
data[0].operating_statusactive, acquired, ipo, closed, merged
data[0].estimated_revenue_rangeEstimated revenue band
data[0].domain_matchWhich host matched: queried, canonical_domain and matched_via (canonical_domain, alias_domain or former_website)

Coverage focuses on technology and product companies and their funding and investors. It is not a registry of every business, so expect misses on agencies, local services and very new companies.

Before you start

  • An Indexed API key. Create one at Developer · API keys; it starts with idx_.
  • A Clay table with a column of company domains or website URLs. This guide calls it Domain.
  • Domain lookups are included in a daily search quota on every plan. Lookups that find nothing never count.
PlanLookups per dayRate limitAfter the daily quota
Free2530 req/minStops until 00:00 UTC
Silver25060 req/min1 credit per lookup
Gold1,000120 req/min1 credit per lookup
Platinum2,500240 req/min1 credit per lookup

Set up the Clay column

  1. 1

    Save your key as a header account

    In the table, click Add enrichment, search for HTTP API, open Select header account and choose + Add account. Under API Request Headers add Key X-API-Key with your key as the Value, name the account (for example Indexed API) and save. Clay stores it encrypted at the workspace level, so the key is not visible in the column settings.
  2. 2

    Configure the request

    On the Configure tab set Method to GET and the Endpoint URL to https://indexed.vc/api/v1/companies. Under Query string parameters add Key domain and for the Value type / and pick your domain column, so it reads /Domain. Bare domains (stripe.com) and full URLs (https://www.stripe.com/pricing) both work; only the host is used.
  3. 3

    Set rate limiting

    Set Request limit to 30 and Duration (ms) to 60000. That fits every plan's per-minute limit. See rate limits before raising it.
  4. 4

    Set run conditions

    Under Run Settings, add an Only run if formula so empty rows are skipped, for example !!{{Domain}}. Leave Auto-update on if new rows should enrich as they arrive, or turn it off to run the column manually.
  5. 5

    Test, then run

    Leave Field paths to return empty so the full response is kept. Test on a single row, open the cell to check the result, then run the column on the table and add the fields you want as columns.
Clay settingValue
EnrichmentHTTP API
Header accountX-API-Key: idx_...
MethodGET
Endpoint URLhttps://indexed.vc/api/v1/companies
Query string parameterdomain = /Domain
Rate limiting30 requests per 60000 ms
Only run if!!{{Domain}}

Sample request and response

The same request from a terminal:

bash
curl "https://indexed.vc/api/v1/companies?domain=stripe.com" \
  -H "X-API-Key: idx_YOUR_KEY_HERE"

The response for a Silver key. Company values are the Stripe record as stored on 2026-09-25 and change as the record is updated; id and logo_url are shortened.

json
{
  "data": [
    {
      "id": "<uuid>",
      "name": "Stripe",
      "slug": "stripe",
      "logo_url": "<logo url>",
      "website": "http://stripe.com",
      "short_description": "Stripe provides payments, billing, money-management, fraud-prevention, and identity tools that help businesses accept payments and manage online commerce.",
      "industries": [
        "Banking",
        "Fintech",
        "SaaS",
        "Payments",
        "Developer Tools"
      ],
      "hq_city": "South San Francisco",
      "hq_country": "United States",
      "employee_count_range": "5001-10000",
      "total_funding_raised": 8755000000,
      "last_funding_date": "2023-03-15",
      "last_funding_type": "series_g_plus",
      "last_valuation": 107000000000,
      "operating_status": "active",
      "estimated_revenue_range": null,
      "_revealed": false,
      "domain_match": {
        "queried": "stripe.com",
        "canonical_domain": "stripe.com",
        "matched_via": "canonical_domain"
      }
    }
  ],
  "meta": {
    "total": 1,
    "page": 1,
    "limit": 25,
    "hasMore": false,
    "revealed_count": 0,
    "unrevealed_count": 1,
    "search_quota": {
      "per_day": 250,
      "used_today": 1,
      "remaining_today": 249,
      "resets_at": "2026-09-26T00:00:00.000Z"
    },
    "depth": {
      "endpoint": "GET /api/v1/companies/{slug}?depth=full",
      "cost_credits": 3,
      "unlocks": [
        "funding_rounds",
        "investors",
        "tech_stack",
        "app_stack",
        "valuations"
      ],
      "docs": "https://indexed.vc/docs/api#credits"
    }
  }
}

When a domain belongs to more than one company record (a parent and a sub-site), the most specific host is listed first, so data[0] is the right default.

Handling misses

A domain we do not cover is not an error. The request returns 200 with an empty data array, costs nothing and does not count toward the daily quota. Map meta.total to a column to filter found (1 or more) from missed (0) rows.

json
{
  "data": [],
  "coverage_requested": true,
  "coverage_status": "queued",
  "meta": {
    "total": 0,
    "page": 1,
    "limit": 25,
    "hasMore": false,
    "revealed_count": 0,
    "unrevealed_count": 0,
    "search_quota": {
      "per_day": 250,
      "used_today": 0,
      "remaining_today": 250,
      "resets_at": "2026-09-26T00:00:00.000Z"
    }
  }
}

coverage_requested: true means the domain was recorded for manual review; false means recording failed (retry later) or the company is outside coverage scope. Review does not guarantee the company will be added. coverage_status says why it missed:

coverage_statusMeaning
queuedNot in the index; recorded for review
not_queuedNot in the index; recording failed, safe to retry
pending_enrichmentWe hold the company but its profile is not ready to serve yet
scope_reviewWe hold the company and its fit is under review
not_in_coverage_scopeWe hold the company but it is outside coverage scope

If the domain belongs to an investor rather than a company, meta.alternate_entities points to the investor profile.

Credits and cost

WhatEndpointCost
Domain lookup (this recipe)GET /companies?domain=Included in the daily quota; misses free
Batch domain lookupPOST /companies/lookup1 credit per hit; misses free
Full profile with rounds and investorsGET /companies/:slug?depth=full3 credits

Fetching the same full profile again within 12 months is free, so re-running a table does not charge twice. Every response carries X-Credits-Cost and, for searches, X-Search-Quota-Remaining. See pricing for monthly credits by plan.

Tables larger than the daily quota

Batch lookup has no daily quota and charges 1 credit per matched domain on every plan, Free included. Use the same header account with these settings:

Clay settingValue
MethodPOST
Endpoint URLhttps://indexed.vc/api/v1/companies/lookup
Body{ "domains": ["/Domain"] }
Result statusdata[0].status: hit, miss or insufficient_credits
Company fieldsdata[0].data.name, data[0].data.total_funding_raised, ...
Miss fieldsdata[0].coverage_requested, data[0].coverage_status

Keep the quotes around /Domain in the body; Clay requires quotes around string column references. One invalid domain rejects the request with 400 VALIDATION_FAILED, so keep the Only run if formula.

Round history and investors

Investors are not on the company card. First add data[0].slug from the lookup column as its own column, for example Indexed slug. Then add a second HTTP API column: Method GET, Endpoint URL https://indexed.vc/api/v1/companies/ followed by /Indexed slug, and Query string parameter depth = full. Set Only run if to !!{{Indexed slug}} so misses are never sent. Each call costs 3 credits.

Path in the responseMeaning
data.valuation_eventsFunding history, one entry per round
data.valuation_events[i].event_typeRound type
data.valuation_events[i].announced_dateAnnouncement date
data.valuation_events[i].amount_raised_usdAmount raised in whole USD, null when undisclosed
data.valuation_events[i].participants[j].investor.nameInvestor in that round
data.valuation_events[i].participants[j].is_leadtrue when that investor led the round
data.technologies · data.app_stackTech stack and SaaS tools
data.data_as_ofWhen the record was last verified

Rate limits

Limits apply per API key over a 60-second window; over the limit you get 429 RATE_LIMITED with a Retry-After header. On paid plans, a key that receives more than 2,000 search result rows in one hour is suspended automatically, and each matched domain is one row. 30 requests per minute stays under both limits. For faster runs, use batch lookup, which is not a search.

Need a higher limit for a large Clay workspace? Write to hello@indexed.vc.

Troubleshooting

Errors return JSON with a readable error and a stable code. Clay shows the status on the cell; open it to read the body.

StatusCauseFix
200, empty dataThe domain is not covered. Not an errorSee Handling misses; the row costs nothing
401 AUTH_REQUIREDNo X-API-Key header was sentSelect the header account on the column; the key name must be X-API-Key
401 AUTH_INVALIDThe key is wrong or revokedCreate a new key at /developers/keys and update the header account
400 VALIDATION_FAILEDThe cell is not a domain (blank, a company name, a malformed URL)Add the Only run if formula, or clean the column with a formula first
429 RATE_LIMITEDToo many requests per minute for this keyLower Request limit in Rate limiting; Clay can retry after the Retry-After interval
429 SEARCH_QUOTA_EXCEEDEDFree plan: 25 lookups used todayWait for 00:00 UTC, switch to batch lookup (credits), or move to a paid plan
402 CREDIT_LIMIT_REACHEDOut of credits (batch lookup, full profile, or searches past the quota)Follow top_up_url in the response body, or enable overage in Settings
403 KEY_SUSPENDEDAn automated rule fired, for example more than 2,000 result rows in an hourEmail support@indexed.vc with the key prefix; lower the Clay rate limit before resuming
404 NOT_FOUNDFull-profile column received an empty or unknown slugRequire the slug in Only run if
503 SYSTEM_ERRORCredit system briefly unavailableRe-run the failed rows; nothing was charged

Clay documentation