What is an IP pool?
An IP pool is a named set of proxy IP addresses that one or more targets draw from. Pools sit between providers (which declare the IPs) and targets (which define the routing rules and rate-limit policies).Why pools exist
Pools decouple IP supply from routing policy:- Shared IP set, independent state — multiple targets can reference the same pool definition. Each target maintains its own rotation queue and quarantine state independently, so a failure on one target does not affect the other.
- Flexible composition — a single pool can draw IPs from multiple providers, mixing regions or credential sets into one rotation.
- Runtime mutability — pools are first-class repository objects. You can add or remove IPs from a provider and the change propagates automatically through every pool that references it, and on to every target that references those pools.
Defining a pool
count controls how many IPs are taken from that provider’s list. Selection is deterministic (the first N IPs from the provider’s ipList) and graceful — if the provider has fewer IPs than count, all available IPs are used with no error.
Drawing from multiple providers
global-pool rotate across all 10.
Sharing a pool across targets
google-apis is still available for general.
Runtime pool management
Pools can be created, updated, and removed at runtime via the GraphQL API without restarting the server. When you add or remove an IP from a provider viaaddIpToProvider / removeIpFromProvider, the change cascades automatically:
- The provider’s
ipListis updated - All pools that reference that provider are recomputed
- All targets that reference those pools receive updated resolved IPs
- Live pool queues are updated — new IPs are pushed in; removed IPs drain naturally
Mutability and config ownership
Two flags control how a pool interacts with the admin API:mutable: false — the pool cannot be updated or removed via the admin API at all:
static: true (default for all YAML-defined pools) — the pool is config-owned. On every startup the pool is overwritten from the config file, ensuring config changes always take effect even when using a persistent Redis backend. API mutations are rejected on static pools.
Set static: false on a YAML-defined pool to allow the API to manage it at runtime while still seeding it on first run:
static: false.