---
title: Research a company from its domain
description: Pull a company's profile, tech stack, recent news and known contacts for one domain, each fact tied to the provider that returned it, then write one brief.
---

This walks through the jobs behind the `research-company` skill: `company.enrich`,
`company.technographics`, `company.news`, `people.domain.search` and, with a LinkedIn page,
`linkedin.company.profile`. Run the ones your brief needs; skip the rest.

## What it costs

Read each job's price before you run it:

```json MCP
search {"filters": {"capability": "company.enrich"}, "prefer": "cheapest"}
```

On 2026-09-28 the cheapest listed prices were `company.enrich` around $0.0019 per call,
`company.technographics` around $0.01 per result, `company.news` under a cent per call, and
`people.domain.search` around $0.009 per call. Check the live numbers and [`balance`](/mcp-tools/balance) before a batch
of companies.

1. **Enrich the company**

    Send `domain`. `company.enrich` gives back name, industry and size.

    <CodeGroup>

    ```json MCP
    run {"endpointId": "job:company.enrich", "input": {"domain": "example.com"}, "idempotencyKey": "research-example-enrich", "fallback": {"maxAttempts": 2, "maxCostUsd": 0.1}}
    ```

    ```bash REST
    curl -s "https://api.looot.ai/v1/runs?wait=20" \
      -H "Authorization: Bearer $LOOOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "endpointId": "job:company.enrich",
        "input": {"domain": "example.com"},
        "idempotencyKey": "research-example-enrich",
        "fallback": {"maxAttempts": 2, "maxCostUsd": 0.1}
      }'
    ```

    ```bash CLI
    looot run job:company.enrich --input '{"domain": "example.com"}' --wait
    ```

    </CodeGroup>

    Read `normalized.fields.name`, `.domain`, `.industry` and `.size`.

2. **List its technologies**

    Same input, a different job:

    <CodeGroup>

    ```json MCP
    run {"endpointId": "job:company.technographics", "input": {"domain": "example.com"}, "idempotencyKey": "research-example-tech", "fallback": true}
    ```

    ```bash REST
    curl -s "https://api.looot.ai/v1/runs?wait=20" \
      -H "Authorization: Bearer $LOOOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "endpointId": "job:company.technographics",
        "input": {"domain": "example.com"},
        "idempotencyKey": "research-example-tech",
        "fallback": true
      }'
    ```

    ```bash CLI
    looot run job:company.technographics --input '{"domain": "example.com"}' --wait
    ```

    </CodeGroup>

    This job has no [`normalized`](/concepts/normalized-output) map yet, so read the list of technologies from `result` directly.

3. **Recent news**

    `company.news` also takes `domain`, or `company` (the name) if that is all you have:

    <CodeGroup>

    ```json MCP
    run {"endpointId": "job:company.news", "input": {"domain": "example.com"}, "idempotencyKey": "research-example-news", "fallback": true}
    ```

    ```bash REST
    curl -s "https://api.looot.ai/v1/runs?wait=20" \
      -H "Authorization: Bearer $LOOOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "endpointId": "job:company.news",
        "input": {"domain": "example.com"},
        "idempotencyKey": "research-example-news",
        "fallback": true
      }'
    ```

    ```bash CLI
    looot run job:company.news --input '{"domain": "example.com"}' --wait
    ```

    </CodeGroup>

    Read the news items from `result`; there is no `normalized` map for this job yet, so field names
    follow the provider that answered.

4. **Known contacts at the domain**

    `people.domain.search` lists email addresses looot's providers have already seen at that domain:

    <CodeGroup>

    ```json MCP
    run {"endpointId": "job:people.domain.search", "input": {"domain": "example.com"}, "idempotencyKey": "research-example-contacts", "fallback": true}
    ```

    ```bash REST
    curl -s "https://api.looot.ai/v1/runs?wait=20" \
      -H "Authorization: Bearer $LOOOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "endpointId": "job:people.domain.search",
        "input": {"domain": "example.com"},
        "idempotencyKey": "research-example-contacts",
        "fallback": true
      }'
    ```

    ```bash CLI
    looot run job:people.domain.search --input '{"domain": "example.com"}' --wait
    ```

    </CodeGroup>

5. **Company LinkedIn page (optional)**

    With the company's LinkedIn URL in hand, `linkedin.company.profile` takes `linkedin_url`:

    ```json MCP
    run {"endpointId": "job:linkedin.company.profile", "input": {"linkedin_url": "https://www.linkedin.com/company/example"}, "idempotencyKey": "research-example-linkedin", "fallback": true}
    ```

6. **Write the brief**

    One short brief: what the company does, its size and industry, its tech stack, the last few news
    items with dates, and any contacts found. Name the provider behind each fact
    ([`servedProviderId`](/concepts/served-provider)). End with the total spent, the sum of `actualCost` across every run.

:::note
looot 1.1.0 does not accept `--fallback` on `looot run`. Every CLI call above tries one provider;
use MCP or REST for fallback across the steps.
:::

## What the answer looks like

| Field | What it is |
| --- | --- |
| `status` | `completed`, `failed`, `queued`, `running` |
| [`outcome`](/concepts/outcomes) | `hit`, `weak`, `miss`, `error`, `rejected`, `skipped` or `pending` |
| `servedProviderId` | the provider that answered |
| `actualCost` | what this run charged |
| `normalized.fields` | only on `company.enrich`: `name`, `domain`, `industry`, `size` |
| `route.summary` | fallback runs only |

`company.technographics`, `company.news`, `people.domain.search` and `linkedin.company.profile`
have no `normalized` map yet: read `result` directly and check the field names the provider used.

## On a miss or error

- `company.enrich` finds nothing: `outcome` is `miss`. With [`fallback`](/concepts/fallback), the next provider tries
  inside the same hold.
- A domain that resolves to nothing your providers cover: skip the step and say so in the brief.
  Don't guess.
- [`insufficient_balance`](/errors/rest-errors#insufficient_balance): the run is blocked and not charged. Use [`top_up`](/mcp-tools/top-up), then retry with a new
  [`idempotencyKey`](/concepts/idempotency).

<Related />
