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

# Company enrichment

> Send a domain or a LinkedIn company URL. Get the company's firmographics back.

```
POST /v1/companies/enrich
```

Send exactly one of `domain` or `linkedinUrl`. Add `loop_id` if you want the result delivered to a [Loop](/loops-and-webhooks) as well.

| Field         | Type   | Description                                                 |
| ------------- | ------ | ----------------------------------------------------------- |
| `domain`      | string | A company domain, like `"stripe.com"`.                      |
| `linkedinUrl` | string | A LinkedIn company page URL, as an alternative to `domain`. |
| `loop_id`     | uuid   | Optional. Also deliver the result to this Loop's webhook.   |

## Example

```bash theme={null}
curl -X POST "https://api.enrichloops.com/v1/companies/enrich" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain":"stripe.com"}'
```

The response is a task. Poll it, then read `data`:

```json theme={null}
{
  "task": { "id": "8bf3d449-...", "object_type": "company", "status": "succeeded" },
  "data": {
    "name": "Stripe",
    "domain": "stripe.com",
    "linkedin_url": "https://www.linkedin.com/company/stripe",
    "linkedin_id": "2135371",
    "linkedin_followers": 1200000,
    "employee_count": 8000,
    "employee_range": "5001-10000",
    "primary_industry": "Financial Services",
    "organization_type": "Privately Held",
    "year_founded": 2010,
    "about": "Stripe is a financial infrastructure platform for businesses...",
    "slogan": "Financial infrastructure for the internet",
    "headquarters": { "city": "South San Francisco", "country": "United States" },
    "enrichment_status": "enriched"
  }
}
```

See [Tasks, polling and errors](/tasks) for the task object and how to poll.

## The result

| Field                | Notes                                                                      |
| -------------------- | -------------------------------------------------------------------------- |
| `name`               | Always present.                                                            |
| `domain`             | The canonical domain. Can differ from what you sent. See `redirect` below. |
| `linkedin_url`       | The company's LinkedIn page.                                               |
| `linkedin_followers` | Follower count on LinkedIn.                                                |
| `employee_count`     | Headcount as reported on LinkedIn.                                         |
| `employee_range`     | LinkedIn's size bucket, like `"5001-10000"`.                               |
| `primary_industry`   | LinkedIn's industry label.                                                 |
| `organization_type`  | Like `"Privately Held"` or `"Public Company"`.                             |
| `year_founded`       | Founding year.                                                             |
| `about`, `slogan`    | The company's own description and tagline.                                 |
| `headquarters`       | `city` and `country`, plus any other address parts we hold.                |
| `enrichment_status`  | `enriched` on a successful task.                                           |

Any field other than `name` and `enrichment_status` can be `null` when the source does not report it.

### Redirects

When the domain you sent resolves to a different canonical domain, `data.redirect` tells you:

```json theme={null}
{
  "redirect": { "from": "stripe.io", "to": "stripe.com", "confirmed": true }
}
```

`confirmed` is `true` when the domain you sent HTTP-redirects to `to`. It is `false` when we matched the two another way, such as the company's LinkedIn page listing a different website.

## Freshness

A stored company older than 30 days is not served as-is. The request is queued (`202`), the company is re-fetched from source, and then the task settles. A company inside the 30-day window is served from storage in the same request (`200`).

Refreshing costs the same 1 credit as any other company request.

If a refresh cannot complete (a source is down, or the LinkedIn page was removed), the task still succeeds and returns the stored record. You are never left without data you would otherwise have had.
