Guides · Domain lookup

Domain to company API

Send a website domain and get back the company it belongs to: name, industries, headquarters, headcount band and funding summary. One domain per request, or up to 100 domains in a batch. Useful for enriching CRM records, lead lists and signup forms.

Look up one domain

GET https://indexed.vc/api/v1/companies?domain= with your key in the X-API-Key header. A match returns one company card; fields we do not have come back as null.

bash
curl "https://indexed.vc/api/v1/companies?domain=stripe.com" \
  -H "X-API-Key: idx_YOUR_KEY_HERE"
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"
    }
  }
}

The same call from JavaScript:

javascript
const res = await fetch("https://indexed.vc/api/v1/companies?domain=stripe.com", {
  headers: { "X-API-Key": process.env.INDEXED_API_KEY },
})
const { data } = await res.json()
const company = data[0] ?? null // null when the domain is not covered

Look up a batch

POST https://indexed.vc/api/v1/companies/lookup takes up to 100 domains per request. Inputs are normalized and deduplicated, and each domain gets its own result: hit with the company,miss with a coverage_status, or insufficient_credits. Each costs 1 credit per delivered hit; misses are free.

bash
curl -X POST "https://indexed.vc/api/v1/companies/lookup" \
  -H "X-API-Key: idx_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{ "domains": ["stripe.com", "https://www.notion.so/product", "example-startup.io"] }'

In Python:

python
import requests

domains = ["stripe.com", "notion.so", "linear.app"]
res = requests.post(
    "https://indexed.vc/api/v1/companies/lookup",
    headers={"X-API-Key": "idx_YOUR_KEY_HERE"},
    json={"domains": domains},  # up to 100 per request
)
for item in res.json()["data"]:  # one item per domain, in the order sent
    if item["status"] == "hit":
        company = item["data"]
        print(item["domain"], company["name"], company["total_funding_raised"])
    else:
        print(item["domain"], item["status"], item.get("coverage_status"))

How matching works

The lookup matches the exact domain, never a guess. When the match came from somewhere other than the current website, domain_match.matched_via says so (former_website or alias_domain), so a different canonical website is explicit rather than surprising.

You sendYou getWhy
https://www.Stripe.com/pricingstripe.comScheme, www, path and letter case are ignored
stripe.comStripeExact domain match: matched_via is canonical_domain
bluemercury.comNot MercuryNever a lookalike: mercury.com never matches bluemercury.com
transcarent.aiTranscarent (transcarent.com)A company that moved domains is still found: matched_via is former_website
app.example.comLooked up as writtenA sub-host is not rewritten to example.com, so send the company's main domain

If two companies claim the same domain, the most specific host wins. When that cannot be decided, the lookup returns a miss rather than picking one.

When a domain is not found

Misses are free and never count against your daily lookups. A miss carriescoverage_requested and a coverage_status that says why:

coverage_statusMeaning
queuedWe do not have the company yet; the domain is recorded for coverage review
pending_enrichmentWe hold the company but its profile is not yet complete enough to serve
scope_reviewWe hold the company and its fit with coverage scope is under review
not_in_coverage_scopeWe hold it but it is outside coverage scope (for example a consultancy), so it is not served
not_queuedRecording the request failed; retry later

Cost and limits

PlanLookups per dayRate limit
Free2530 req/min
Silver25060 req/min
Gold1,000120 req/min
Platinum2,500240 req/min

Single-domain lookups count against the daily lookups above. Full company records, with round-by-round funding and the investors in each round, cost 3 credits through GET /api/v1/companies/{slug}?depth=full. A free key needs no card.

Without writing code

Paste a list of domains into Enrich my list after signing up and download the results as a CSV, or run the lookup from a Clay table with the Clay guide.

Questions

What does a lookup that finds nothing cost?

Nothing. Misses are free and do not count against your daily lookups. The domain is recorded for coverage review, and coverage_status says why it missed.

Can I send full URLs instead of domains?

Yes. A full URL is reduced to its host, and www and letter case are ignored. Send the company's main domain rather than a sub-host such as app.example.com.

What happens when a company changed its domain?

Its old domain still resolves to the company. The response includes domain_match, and matched_via is former_website or alias_domain when the match did not come from the current website.

How do I get funding rounds and investors, not just the summary?

Call GET /api/v1/companies/{slug}?depth=full with the slug from the lookup. It costs 3 credits and returns round-by-round funding history with the investors in each round.

Which companies are covered?

Technology and product companies, including bootstrapped ones, and their funding and investors. It is not a registry of every business, so expect misses on agencies, local services and very new companies.

The full request and response schemas are in the API reference and the OpenAPI 3.1 spec.