> ## 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.

# Introduction

> Company enrichment, on demand or by webhook.

Send us a company. We enrich it and send the result back — either to you directly, or to a webhook you register. Built for teams enriching data as part of a pipeline: signups, CRM records, lead lists, anything that needs a company's firmographic data attached to it.

## How it works

<Steps>
  <Step title="You send us something to enrich">
    A domain or a LinkedIn company URL, via `POST /v1/companies/enrich`.
  </Step>

  <Step title="We check whether we already know it">
    If we do, the task settles immediately.
  </Step>

  <Step title="If we don't, we go find it">
    Resolving the domain, locating the company's LinkedIn page, and pulling structured data from it — then queuing the result.
  </Step>

  <Step title="You get the result">
    Either by polling the task, or by having it delivered to your own webhook via a [Loop](/loops-and-webhooks).
  </Step>
</Steps>

Most requests for companies we've already seen resolve instantly. New companies typically resolve within seconds to low tens of seconds.

## Quick start

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

Every enqueue call responds with a task, never the enrichment data inline — even on a cache hit:

```json theme={null}
{
  "task": {
    "id": "8bf3d449-e013-4faa-8994-a6d25031e001",
    "object_type": "company",
    "operation": "enrich",
    "status": "succeeded",
    "target": "stripe.com",
    "credits_charged": 1,
    "created_at": "2026-08-07T23:21:32.481Z"
  }
}
```

`200` means it already settled; `202` means it's queued. Either way, fetch the result from the task:

```bash theme={null}
curl "https://api.enrichloop.com/v1/tasks/8bf3d449-e013-4faa-8994-a6d25031e001" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```json theme={null}
{
  "task": { "...": "...", "status": "succeeded" },
  "data": {
    "name": "Stripe",
    "domain": "stripe.com",
    "linkedin_url": "https://www.linkedin.com/company/stripe",
    "employee_count": 8000,
    "employee_range": "5001-10000",
    "primary_industry": "Financial Services",
    "headquarters": { "city": "San Francisco", "country": "United States" }
  }
}
```

`data` is present once `task.status` is `succeeded`; `error` is present once it's `failed`. Poll until the status is terminal — we recommend waiting 2 seconds between polls, and a `Retry-After: 2` header is included as a hint while a task is still pending. If you'd rather not poll at all, use a [Loop](/loops-and-webhooks) and we'll push the result to you.

<Card title="API Reference" icon="code" href="/api-reference">
  Full request/response schemas for every endpoint.
</Card>

## Error codes

A failed task carries a stable `error.code` you can branch on:

| Code                   | Meaning                                                                          |
| ---------------------- | -------------------------------------------------------------------------------- |
| `not_found`            | The company couldn't be found or resolved on LinkedIn.                           |
| `provider_unavailable` | A temporary issue on our end kept us from resolving the company — safe to retry. |
| `timed_out`            | Enrichment didn't complete in time — safe to retry.                              |
| `invalid_input`        | The request was malformed (e.g. neither `domain` nor `linkedinUrl` provided).    |
| `internal_error`       | Something went wrong on our end.                                                 |

A failed task is refunded automatically — you're never charged for a task that doesn't produce a result.

## Rate limits and credits

Each successful enrichment costs credits, deducted from your account balance — whether the answer came back instantly or after a short wait makes no difference to the price. A failed task is never charged.

There's no hard cap on how many requests you can have in flight, but very large bursts may be queued and processed in order of when you started sending — later requests from a customer with a smaller backlog won't get stuck behind one customer's bulk upload.
