---
title: "Look up company profiles for many domains"
method: POST
path: "/v1/tech-lookup/companies/batch"
tags: ["TechLookup"]
---

# Look up company profiles for many domains

`POST /v1/tech-lookup/companies/batch`

## Request

- Base URL: `https://api.stackscan.com/api`
- URL: `https://api.stackscan.com/api/v1/tech-lookup/companies/batch`
- Auth: HTTP bearer and API key in header `X-Tenant-Id`

Takes up to 100 domains and returns the company behind each one, in a
single request. Built for enriching a CRM: one call replaces one call
per record.

Costs 1 Bulk Lookup Credit per domain that RESOLVES. Domains with no
data cost nothing, and malformed domains are reported in `invalid`
rather than failing the batch, because real CRM exports always contain
some junk. If the balance runs out partway through, the domains that
could not be paid for are listed in `skipped_insufficient_credits` and
returned without data. You are never charged for data you did not get,
and never given data you did not pay for.

Duplicate and equivalent domains (`stripe.com`, `www.stripe.com`,
`https://stripe.com/pricing`) collapse to one entry and are charged once.

Rate limit: 30 requests per minute, counted per API token. Going over returns 429 with `error_code: rate_limited` and a `Retry-After` header in seconds. A 429 costs no credits. Traffic is also subject to a higher shared ceiling per network address, applied before authentication.

## Request body

- object
  - `domains` string[], required
  - `fresh` boolean

## Response `200`

Per-domain company profiles. Always 200 on a well-formed request, including partial success. Deducts 1 Bulk Lookup Credit per RESOLVED domain; domains with no data, malformed domains, and domains skipped for lack of credits are free.

- object
  - `success` boolean, required
  - `requested` integer, required
  - `resolved` integer, required
  - `served` integer, required
  - `credits_charged` number, required
  - `results` object[], required
    - `success` boolean, required
    - `domain` string, required
    - `last_updated` string
    - `company` object
      - `name` string, nullable, required
      - `industry` string, nullable, required
      - `city` string, nullable, required
      - `country` string, nullable, required
      - `address` string, nullable, required
      - `estimated_revenue_band` string, nullable, required
      - `linkedin_url` string, nullable, required
    - `total_technologies_tracked` integer
    - `error` string
  - `not_found` string[], required
  - `invalid` string[], required
  - `skipped_insufficient_credits` string[], required

## Other responses

- `401`: Unauthenticated
- `402`: Insufficient Bulk Lookup Credits - returned only when the balance is empty before the batch starts. A balance that runs out partway through returns 200 with the remainder listed in `skipped_insufficient_credits`.
- `403`: Authorization error
- `422`: Malformed payload (missing `domains`, not an array, empty, or over the per-batch limit).
- `429`: Rate limit exceeded. Costs no credits. Back off for the number of seconds in Retry-After.

---

[API](https://skmtc.dev/stackscan/apis/stackscan-api-reference.md) · [All operations](https://skmtc.dev/stackscan/apis/stackscan-api-reference/llms.txt) · [OpenAPI document](https://skmtc.dev/stackscan/apis/stackscan-api-reference/revisions/66531cd65f3a?raw)
