---
title: "Build a lead list from the pool"
method: POST
path: "/v1/pool/lists"
tags: ["Pool"]
---

# Build a lead list from the pool

`POST /v1/pool/lists`

## Request

- Base URL: `https://api.automatedclientacquisition.com`
- URL: `https://api.automatedclientacquisition.com/v1/pool/lists`
- Auth: HTTP bearer

Enqueues a build and returns a job handle immediately — no HTTP request
ever spans this work, so there is nothing to time out. Poll
`GET /v1/pool/jobs/{id}` for progress.

`max_contacts` is required and is the point of the endpoint. The build is
refused if the filter's exact count exceeds it, so you cannot enqueue a
four-million-contact build by leaving a parameter out — you have to state
the number and mean it. The hard ceiling is 250,000 regardless.

Give either `list_id` to append to an existing list, or `list_name` to
create one. The destination is resolved before the size gate runs, so a
rejected build never leaves an empty list behind.

## Request body

- object
  - `filter` object, required: Same shape as `/v1/pool/search`, byte for byte.
  - `max_contacts` integer, required: Ceiling on this build. Refused if the exact count is higher.
  - `list_id` string, uuid: Append to this existing list.
  - `list_name` string: Create a new list with this name instead.
  - `description` string

## Response `202`

Build accepted. The work happens on the next worker tick.

- object
  - `success` boolean
  - `data` PoolBuildJob
    - `id` string, uuid
    - `status` 'pending' | 'running' | 'completed' | 'failed'
    - `total` integer: Contacts this build will create.
    - `processed` integer: Contacts created so far.
    - `errors` integer
    - `error_message` string, nullable
    - `current_offset` integer
    - `target_list_id` string, uuid
    - `created_at` string, date-time
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable
  - `list_id` string, uuid
  - `matched` integer

## Other responses

- `400`: Missing `max_contacts`, a filter matching more than `max_contacts`, or a filter too broad to run.
- `401`: Missing, invalid or revoked token.
- `404`: The destination list was not found, or the filter matched nothing.
- `429`: Over 120 requests in the current minute. `Retry-After` says how many seconds until the window resets; wait that long and continue.
- `500`: Something broke on our side. Safe to retry with backoff.

---

[API](https://skmtc.dev/automatedclientacquisition/apis/aca-api.md) · [All operations](https://skmtc.dev/automatedclientacquisition/apis/aca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/automatedclientacquisition/apis/aca-api/revisions/8f3e3b141311?raw)
