> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seamless.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Website → Company Profile

> Turn a website URL or domain into a full company profile: firmographics, phones, headquarters address, technologies, funding, and news.

> [!NOTE]
>
> **Endpoint** `POST /companies/research` · **Credits** 1 per company · **Delivery** async (poll or webhook) · **Versions** v1, v2

## Introduction

Send a website domain and get back the company behind it: name, description, industry and SIC/NAICS codes, headcount, revenue, company phones with confidence scores, headquarters address, top technologies, funding, and recent news. Use it to enrich form fills, score inbound accounts, and fill gaps in CRM account records.

Send up to 500 domains per request. Pass the root domain without `https://` or a path, for example `acme.com`.

## AI agent prompt

```text theme={null}
Read https://docs.seamless.ai/llms.txt and https://docs.seamless.ai/api-catalog/website-to-company-profile.
Using my Seamless.AI API key from SEAMLESS_API_KEY, strip each URL in my list to its root domain,
send them to POST https://api.seamless.ai/api/client/v1/companies/research as {"companies":[{"domain": <domain>}]},
poll GET /companies/research/poll until each status is done, and return companyName, industries,
companySize, companyRevenue, phones, and location.
```

## Authentication

Send your API key in the `Token` header, or `Authorization: Bearer <token>` with [OAuth](/authentication/oauth). Create a key under [Settings → Public API](/authentication/api-keys).

## Example

```bash cURL theme={null}
curl -X POST https://api.seamless.ai/api/client/v1/companies/research \
  -H "Token: $SEAMLESS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "companies": [ { "domain": "seamless.ai" }, { "domain": "acme.com" } ] }'
```

```python Python theme={null}
import os, time, requests
from urllib.parse import urlparse

BASE = "https://api.seamless.ai/api/client/v1"
H = {"Token": os.environ["SEAMLESS_API_KEY"]}

def root_domain(url):
    host = urlparse(url if "//" in url else "//" + url).hostname or url
    return host.removeprefix("www.")

ids = requests.post(f"{BASE}/companies/research", headers=H,
                    json={"companies": [{"domain": root_domain("https://www.seamless.ai/pricing")}]}).json()["requestIds"]
while True:
    rows = requests.get(f"{BASE}/companies/research/poll", headers=H,
                        params={"requestIds": ",".join(ids)}).json()["data"]
    if all(r["status"] not in ("queued", "researching") for r in rows):
        break
    time.sleep(3)
print(rows[0].get("company"))
```

```javascript Node.js theme={null}
const resp = await fetch("https://api.seamless.ai/api/client/v1/companies/research", {
  method: "POST",
  headers: { Token: process.env.SEAMLESS_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({ companies: [{ domain: "seamless.ai" }] }),
});
const { requestIds } = await resp.json();
```

## Reference

| Parameter | Type | Required | Description |
| - | - | - | - |
| `companies[].domain` | string | Yes\* | Root website domain |
| `companies[].companyName` | string | No | Company name. Add it to disambiguate, or send it alone when you have no domain. |
| `skipDeduplicationCheck` | boolean | No | Research again even if researched recently. Uses credits. |

\* Each item needs `domain` or `companyName`.

## Response

When a poll returns `status: done`, `company` holds the record:

| Field | Description |
| - | - |
| `companyName`, `description`, `domain` | Identity |
| `industries`, `sicCode`, `naicsCode` | Industry classification |
| `staffCount`, `companySize`, `annualRevenue`, `companyRevenue` | Size and revenue |
| `phones`, `phoneTypes`, `phonesAiScores` | Company phones with confidence (comma-separated, aligned by position) |
| `location` | Headquarters address |
| `topTechnologies` | Detected technologies (comma-separated) |
| `fundingTotal`, `latestFundingDate`, `newsAndEvents` | Growth signals |

If Seamless has no company for a domain, that request's poll status is `error`.

## Errors

| Status | Meaning |
| - | - |
| `401` | Missing or invalid API key |
| `422` | `insufficientCredits` or `missingLicense` |
| `429` | Rate limit reached |

## Related

* [Company Name → Website](/api-catalog/company-name-to-website)
* [Company Research API](/api-catalog/company-enrichment)
* [Data dictionary](/api-catalog/data-dictionary)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.