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

# List companies

> Tracked companies, paginated and date-filterable

```
GET https://app.gethuntd.com/api/v1/public/companies
```

Returns the companies Huntd tracks for your organization. Supports
[pagination](/public-api/conventions#pagination),
[date filtering](/public-api/conventions#date-filtering) and
[`source` / `is_user` filtering](/public-api/conventions#filtering).

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://app.gethuntd.com/api/v1/public/companies?limit=50" \
    -H "X-API-Key: hntd_abc12345_yoursecretkey"
  ```

  ```javascript JavaScript theme={null}
  const params = new URLSearchParams({ limit: '50' });
  const res = await fetch(
    `https://app.gethuntd.com/api/v1/public/companies?${params}`,
    { headers: { 'X-API-Key': process.env.HUNTD_API_KEY } }
  );
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os
  import requests

  body = requests.get(
      'https://app.gethuntd.com/api/v1/public/companies',
      params={'limit': 50},
      headers={'X-API-Key': os.environ['HUNTD_API_KEY']}
  ).json()
  ```
</CodeGroup>

## Response

```json theme={null}
{
  "success": true,
  "pagination": { "page": 1, "limit": 50, "total": 3866, "totalPages": 78 },
  "data": [
    {
      "domain": "acme.com",
      "name": "Acme",
      "size": 2100,
      "industry": "banking,financial services",
      "country": "United States",
      "people": 12,
      "sources": ["devin", "factory"],
      "discoveredAt": "2026-07-31T18:31:58.294Z"
    }
  ]
}
```

## Fields

<ResponseField name="domain" type="string">
  The normalized, stable key for this company. Use it to deduplicate and to join to `/people`.
</ResponseField>

<ResponseField name="name" type="string">
  Company display name.
</ResponseField>

<ResponseField name="size" type="integer">
  Employee count.
</ResponseField>

<ResponseField name="industry" type="string">
  Comma-separated industry labels.
</ResponseField>

<ResponseField name="country" type="string" />

<ResponseField name="people" type="integer">
  How many tracked people you have at this company.
</ResponseField>

<ResponseField name="sources" type="array">
  Source slugs with at least one confirmed user at this company.
</ResponseField>

<ResponseField name="discoveredAt" type="string">
  UTC timestamp of when we last checked this company.
</ResponseField>

<Warning>
  An empty `sources` array means **we checked and found no user** — not that the company is
  untracked.
</Warning>

## Joining to people

`companyDomain` on [`/people`](/public-api/people) is normalized to exactly match `domain` here,
so the two endpoints join directly with no cleanup.

<CodeGroup>
  ```javascript JavaScript theme={null}
  const key = { 'X-API-Key': process.env.HUNTD_API_KEY };
  const base = 'https://app.gethuntd.com/api/v1/public';

  const companies = await (
    await fetch(`${base}/companies?limit=1000`, { headers: key })
  ).json();

  const people = await (
    await fetch(`${base}/people?limit=1000&is_user=true`, { headers: key })
  ).json();

  // Group people under their company by domain
  const byDomain = new Map(
    companies.data.map((c) => [c.domain, { ...c, people: [] }])
  );

  for (const person of people.data) {
    byDomain.get(person.companyDomain)?.people.push(person);
  }
  ```

  ```python Python theme={null}
  import os
  import requests

  key = {'X-API-Key': os.environ['HUNTD_API_KEY']}
  base = 'https://app.gethuntd.com/api/v1/public'

  companies = requests.get(
      f'{base}/companies', params={'limit': 1000}, headers=key
  ).json()

  people = requests.get(
      f'{base}/people', params={'limit': 1000, 'is_user': 'true'}, headers=key
  ).json()

  by_domain = {c['domain']: {**c, 'people': []} for c in companies['data']}

  for person in people['data']:
      company = by_domain.get(person['companyDomain'])
      if company:
          company['people'].append(person)
  ```
</CodeGroup>

<Note>
  The `people` **integer** on this endpoint is the count Huntd tracks. It will not always equal
  the number of rows you get back from `/people` for that domain, because your `/people` query
  may be filtered by source, date, or `is_user`.
</Note>

For a full export of both sets, see [streaming](/public-api/streaming).
