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 response | Meaning |
|---|---|
| data[0].name | Company name |
| data[0].slug | Indexed identifier. Input for the optional full-profile column |
| data[0].website | Canonical website |
| data[0].short_description | One-line description |
| data[0].industries | List of industry labels |
| data[0].hq_city | Headquarters city |
| data[0].hq_country | Headquarters country |
| data[0].employee_count_range | Headcount band: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+ |
| data[0].total_funding_raised | Total funding in whole USD. Sums equity rounds, notes, SAFEs and grants; debt and exits are excluded |
| data[0].last_funding_type | Most recent round type, for example seed or series_a |
| data[0].last_funding_date | Date of the most recent round (YYYY-MM-DD) |
| data[0].last_valuation | Most recent disclosed valuation in whole USD |
| data[0].operating_status | active, acquired, ipo, closed, merged |
| data[0].estimated_revenue_range | Estimated revenue band |
| data[0].domain_match | Which 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.
| Plan | Lookups per day | Rate limit | After the daily quota |
|---|---|---|---|
| Free | 25 | 30 req/min | Stops until 00:00 UTC |
| Silver | 250 | 60 req/min | 1 credit per lookup |
| Gold | 1,000 | 120 req/min | 1 credit per lookup |
| Platinum | 2,500 | 240 req/min | 1 credit per lookup |
Set up the Clay column
- 1
Save your key as a header account
In the table, clickAdd enrichment, search forHTTP API, openSelect header accountand choose+ Add account. Under API Request Headers add KeyX-API-Keywith your key as the Value, name the account (for exampleIndexed API) and save. Clay stores it encrypted at the workspace level, so the key is not visible in the column settings. - 2
Configure the request
On theConfiguretab set Method toGETand the Endpoint URL tohttps://indexed.vc/api/v1/companies. Under Query string parameters add Keydomainand 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
Set rate limiting
Set Request limit to30and Duration (ms) to60000. That fits every plan's per-minute limit. See rate limits before raising it. - 4
Set run conditions
Under Run Settings, add anOnly run ifformula 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
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 setting | Value |
|---|---|
| Enrichment | HTTP API |
| Header account | X-API-Key: idx_... |
| Method | GET |
| Endpoint URL | https://indexed.vc/api/v1/companies |
| Query string parameter | domain = /Domain |
| Rate limiting | 30 requests per 60000 ms |
| Only run if | !!{{Domain}} |
Sample request and response
The same request from a terminal:
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.
{
"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.
{
"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_status | Meaning |
|---|---|
| queued | Not in the index; recorded for review |
| not_queued | Not in the index; recording failed, safe to retry |
| pending_enrichment | We hold the company but its profile is not ready to serve yet |
| scope_review | We hold the company and its fit is under review |
| not_in_coverage_scope | We 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
| What | Endpoint | Cost |
|---|---|---|
| Domain lookup (this recipe) | GET /companies?domain= | Included in the daily quota; misses free |
| Batch domain lookup | POST /companies/lookup | 1 credit per hit; misses free |
| Full profile with rounds and investors | GET /companies/:slug?depth=full | 3 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 setting | Value |
|---|---|
| Method | POST |
| Endpoint URL | https://indexed.vc/api/v1/companies/lookup |
| Body | { "domains": ["/Domain"] } |
| Result status | data[0].status: hit, miss or insufficient_credits |
| Company fields | data[0].data.name, data[0].data.total_funding_raised, ... |
| Miss fields | data[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 response | Meaning |
|---|---|
| data.valuation_events | Funding history, one entry per round |
| data.valuation_events[i].event_type | Round type |
| data.valuation_events[i].announced_date | Announcement date |
| data.valuation_events[i].amount_raised_usd | Amount raised in whole USD, null when undisclosed |
| data.valuation_events[i].participants[j].investor.name | Investor in that round |
| data.valuation_events[i].participants[j].is_lead | true when that investor led the round |
| data.technologies · data.app_stack | Tech stack and SaaS tools |
| data.data_as_of | When 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.
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.
| Status | Cause | Fix |
|---|---|---|
| 200, empty data | The domain is not covered. Not an error | See Handling misses; the row costs nothing |
| 401 AUTH_REQUIRED | No X-API-Key header was sent | Select the header account on the column; the key name must be X-API-Key |
| 401 AUTH_INVALID | The key is wrong or revoked | Create a new key at /developers/keys and update the header account |
| 400 VALIDATION_FAILED | The 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_LIMITED | Too many requests per minute for this key | Lower Request limit in Rate limiting; Clay can retry after the Retry-After interval |
| 429 SEARCH_QUOTA_EXCEEDED | Free plan: 25 lookups used today | Wait for 00:00 UTC, switch to batch lookup (credits), or move to a paid plan |
| 402 CREDIT_LIMIT_REACHED | Out 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_SUSPENDED | An automated rule fired, for example more than 2,000 result rows in an hour | Email support@indexed.vc with the key prefix; lower the Clay rate limit before resuming |
| 404 NOT_FOUND | Full-profile column received an empty or unknown slug | Require the slug in Only run if |
| 503 SYSTEM_ERROR | Credit system briefly unavailable | Re-run the failed rows; nothing was charged |
Clay documentation
- HTTP API integration overview (https://university.clay.com/docs/http-api-integration-overview)
- Enrichments: run settings (Auto-update, Only run if) (https://university.clay.com/docs/enrichments)
- Formulas: conditional run formulas (https://university.clay.com/docs/formula-generator)