> Reverse Contact API documentation. This is the Markdown copy of https://docs.reversecontact.com/use-cases/find-a-company
> Every page is listed at https://docs.reversecontact.com/llms.txt, every endpoint with its credit cost and status at https://docs.reversecontact.com/catalog.json

# Find a company from a domain or a page URL

> Find a company profile from a domain or Social company page URL with the API. Compare cached and live data, credit costs and SDK examples.

- Last verified: 2026-11-04

Find a company profile from a domain or Social company page URL, including industry and employee information. Enrich and cached Fetch return the profile immediately. Use Live to retrieve a fresh profile in the background.

## Which endpoint

| Input you have | Endpoint | Cost | Mode |
| --- | --- | --- | --- |
| Company domain | [Enrich company](https://docs.reversecontact.com/endpoints/enrich-company) | 2 credits when found. A 404 is free | Synchronous |
| Company page URL or company id | [Company profile](https://docs.reversecontact.com/endpoints/fetch-company) | 1 credit when found in the cache. A 404 is free | Synchronous |
| Company page URL or company id, with a stale or missing cache | [Company profile live](https://docs.reversecontact.com/endpoints/fetch-company-live) | 2 credits when the job is created | Asynchronous |

## How it works

Set `RC_API_KEY` to your [API key](https://docs.reversecontact.com/authentication). Install the [TypeScript SDK](https://docs.reversecontact.com/sdk/javascript), [Python SDK](https://docs.reversecontact.com/sdk/python) or [CLI](https://docs.reversecontact.com/guides/cli) for your chosen example. The cURL live example also uses `jq`. Choose either the domain lookup or the page URL fetch, depending on your input.

### Find the company behind a domain

Send a bare domain or a full website URL as `domain` to Enrich company. Read the profile from `data.company` before saving the result. If no company matches, handle the HTTP `404` response, or `null` / `None` in the SDKs.

**Code Examples**

```bash [cURL]
curl --fail-with-body -sS -X POST https://api.reversecontact.com/v2/enrich/companies \
  -H "Authorization: Bearer $RC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "acme.com"}'
```
```typescript [TypeScript SDK]
import ReverseContact from "@reverse-contact/sdk";

const client = new ReverseContact({ apiKey: process.env.RC_API_KEY });

const result = await client.enrich.company({ domain: "acme.com" });
if (result === null) {
  console.log("No company found: nothing was charged");
} else {
  console.log(result.data.company?.name, result.data.company?.industry);
}
```
```python [Python SDK]
import os

from reversecontact import ReverseContact

with ReverseContact(api_key=os.environ["RC_API_KEY"]) as client:
    result = client.enrich.company(domain="acme.com")
    if result is None:
        print("No company found: nothing was charged")
    elif result.data is not None and result.data.company is not None:
        print(result.data.company.name, result.data.company.industry)
```
```bash [CLI]
rc enrich company --domain acme.com
```

### Fetch a company page you already know

When you have the company page URL, fetch the cached profile and read `data.companyName`, `data.industry` and `data.employeesCount`. You can send the company `id` from an earlier response instead of `url`.

**Code Examples**

```bash [cURL]
curl --fail-with-body -sS -X POST https://api.reversecontact.com/v2/fetch/companies \
  -H "Authorization: Bearer $RC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.social.com/company/acme-corp"}'
```
```typescript [TypeScript SDK]
import ReverseContact from "@reverse-contact/sdk";

const client = new ReverseContact({ apiKey: process.env.RC_API_KEY });

const result = await client.fetch.company({ url: "https://www.social.com/company/acme-corp" });
if (result === null) {
  console.log("Company not found: nothing was charged");
} else {
  console.log(result.data.companyName, result.data.industry);
}
```
```python [Python SDK]
import os

from reversecontact import ReverseContact

with ReverseContact(api_key=os.environ["RC_API_KEY"]) as client:
    result = client.fetch.company(url="https://www.social.com/company/acme-corp")
    if result is None:
        print("Company not found: nothing was charged")
    elif result.data is not None:
        print(result.data.company_name, result.data.industry)
```
```bash [CLI]
rc fetch company --url https://www.social.com/company/acme-corp
```

### Refresh the company when the cache is too old

You can use Live for a stale or missing company profile. To decide based on the profile's age, [check freshness](https://docs.reversecontact.com/use-cases/keep-profiles-fresh) first. Save the job id, then poll for the company profile in `data.result`.

**Code Examples**

```bash [cURL]
curl --fail-with-body -sS -X POST https://api.reversecontact.com/v2/fetch/companies/live \
  -H "Authorization: Bearer $RC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.social.com/company/acme-corp"}' > live-job.json
WEBHOOK_ID=$(jq -er .data.webhookId live-job.json)
printf 'Save this job id: %s\n' "$WEBHOOK_ID"

while :; do
  result=$(curl --fail-with-body -sS --max-time 30 \
    "https://api.reversecontact.com/v2/webhooks/$WEBHOOK_ID?wait=20" \
    -H "Authorization: Bearer $RC_API_KEY") || break
  case "$(printf '%s' "$result" | jq -r '.data.status')" in
    succeeded) printf '%s' "$result" | jq '.data.result'; break ;;
    errored) printf '%s' "$result" | jq '.data | {errorCode, creditsConsumed}'; break ;;
    created|in_progress) sleep 2 ;;
    *) printf '%s\n' "$result"; break ;;
  esac
done
```
```typescript [TypeScript SDK]
import ReverseContact, { JobFailedError } from "@reverse-contact/sdk";

const client = new ReverseContact({ apiKey: process.env.RC_API_KEY });

const job = await client.fetch.companyLive({ url: "https://www.social.com/company/acme-corp" });
console.log("Save this job id:", job.id); // resume after a restart with client.jobs.wait(id)

try {
  // Long polls until the job ends, 30 minutes at most by default.
  const done = await job.wait();
  console.log(done.data.result?.companyName, done.data.result?.industry);
} catch (error) {
  if (error instanceof JobFailedError) console.log("Job failed:", error.errorCode, "credits:", error.creditsConsumed);
  else throw error;
}
```
```python [Python SDK]
import os

from reversecontact import JobFailedError, ReverseContact

with ReverseContact(api_key=os.environ["RC_API_KEY"]) as client:
    job = client.fetch.company_live(url="https://www.social.com/company/acme-corp")
    print("Save this job id:", job.id)  # resume after a restart with client.jobs.wait(id)

    try:
        # Long polls until the job ends, 30 minutes at most by default.
        done = job.wait()
        company = done.data.result if done.data else None
        if company is not None:
            print(company.company_name, company.industry)
    except JobFailedError as error:
        print("Job failed:", error.error_code)
```
```bash [CLI]
rc fetch company --url https://www.social.com/company/acme-corp --live --wait --timeout 300
```

## What it costs

Enrich company costs **2 credits when a company is found**, with the full profile included. Company profile costs **1 credit when the company is found in the cache**. A `404` from either synchronous lookup is free.

Company profile live consumes **2 credits per request when the job is created**. A `company-not-found` failure remains billed. Failures with `invalid-data` or `fetch-data-error` are refunded. The [live failure rules](https://docs.reversecontact.com/endpoints/fetch-company-live#webhook-callback-errors-advanced) describe the other outcomes. Polling costs nothing.

> [!NOTE]
> For 1,000 domain lookups that match 800 companies, Enrich costs 800 × 2 = **1,600 credits**. The 200 unmatched lookups are free. Retrieving 800 known company URLs from the cache instead costs **800 credits**. Starting 100 live refreshes consumes **200 credits** at creation.

## Good to know

Enrich returns `data.company` and `data.isFullProfile`. Cached Fetch returns the company directly in `data`. If Enrich returns a light profile, `data.isFullProfile` is `false` and the request still costs 2 credits. A separate cached fetch can complete the profile for 1 additional credit when found.

Use `employeesCount` for the exact headcount when available. The `employeeCountRange` field gives a size bracket. Treat missing values as unknown, as described in [Missing and empty profile fields](https://docs.reversecontact.com/guides/missing-and-empty-fields).

Live jobs can take tens of minutes. Use [polling](https://docs.reversecontact.com/guides/polling), or pass `webhookUrl` for optional [webhook delivery](https://docs.reversecontact.com/guides/webhooks). Resume a saved job with `client.jobs.wait(jobId)` or `rc task` after a timeout instead of starting a new paid refresh.

## FAQ

### How do I find a company profile from a domain with the API?

Send `domain` to `POST /v2/enrich/companies`. Enrich company returns the profile in `data.company` and costs 2 credits when a company is found. An unmatched lookup is free.

### Can I fetch a company from a Social company page URL?

Send `url` to `POST /v2/fetch/companies` for the cached profile. Company profile costs 1 credit when found and returns the company directly in `data`.

### When should I use Company profile live?

Use Company profile live when the cached profile is stale or missing. A live refresh consumes 2 credits when the job is created and returns the fresh company asynchronously through polling or a webhook.

### Is a company live lookup free when the company is not found?

No. A `company-not-found` failure from Company profile live remains billed at 2 credits. A `404` from cached Company profile or Enrich company is free.
