---
title: "Start a technology list"
method: POST
path: "/v1/tech-lookup/lists"
tags: ["Technology Lists"]
---

# Start a technology list

`POST /v1/tech-lookup/lists`

## Request

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

Queues a full export of every website running one technology and returns
straight away with a `report_id`. Generation takes minutes, so nothing
useful could be returned synchronously. Poll
`GET /v1/tech-lookup/lists/{id}` until `status` is `ready`, then follow
`download_url`.

Costs **1 standard credit**, flat, no matter how large the list. Asking
for the same technology again inside the same billing period is free.
One credit buys that technology for the period, so a nightly refresh
costs one credit a month, not one a night.

This spends STANDARD credits, not the bulk-lookup credits the other
endpoints use. `GET /v1/me` reports both balances.

Nothing is charged when the request is refused: an unknown technology,
or a filter combination that matches no websites, both return an error
with the wallet untouched.

Rate limit: 6 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
  - `technology` string: Any one identifies the technology. techapi_id is exact and is what responses now return; stack_id keeps working for integrations written before the change; technology resolves by name the same way GET technologies/lookup does.
  - `techapi_id` string
  - `stack_id` integer
  - `country` integer[]: Filters, mirroring the dashboard's own filter set. Anything omitted means "no filter", which is the full list.
  - `country_condition` 'include' | 'exclude'
  - `tld` string[]
  - `tld_condition` 'include' | 'exclude'
  - `company_size` string[]
  - `only_with_company_info` boolean

## Response `202`

202: accepted, not done. The file does not exist yet.

- object
  - `success` boolean, required
  - `report_id` integer, required
  - `status` 'ready' | 'queued' | 'failed', required
  - `technology` string, nullable, required
  - `techapi_id` string, nullable, required
  - `credits_charged` number, required
  - `credit_type` 'standard', required
  - `reused_billing_period` boolean, required: Free because already paid for this period, not free because it failed.
  - `estimated_rows` integer, nullable, required: Estimate. The final figure is result_count on the status endpoint.
  - `status_url` string, required

## Other responses

- `401`: Unauthenticated
- `402`
- `403`: Authorization error
- `404`
- `422`: Validation error
- `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)
