POST /orders never reads,
reserves, attaches, or changes pool inventory. Only POST /pool/attach assigns
pre-warmed domains.
1. Create the routing target
CallPOST /workspaces first and keep the returned workspace_id. Workspace
creation does not use an Idempotency-Key.
For Smartlead, connect the main workspace. Do not send client_id or customer
data. The login pair is optional, but it must be complete when sent:
422 provider_login_credentials_required before
reserving any pool domain. Connect the same workspace again with the pair, then
retry the attach.
2. Add paid domains
POST /pool/add adds domains from a paid Google order that already has active
inboxes.
available only after all of these are true:
- Its source order is at least 14 days old.
- Its recorded warmup time has been served, when a warmup start is known.
- Its inboxes are active.
burned result. The source order, recorded
warmup clocks, active billing, mailbox identity, and forwarding checks still
apply.
With a sandbox key, initial and post-release warmups are five seconds instead
of 14 days. POST /pool/add may therefore return a new domain with status
warming. Poll GET /pool?availability=available until it appears before
previewing or attaching it.
3. Preview an exact quantity
insufficient_inventory. A preview does not
reserve them. Peeker tries not to show the same domains in two concurrent
previews for five minutes, but can reuse an unclaimed preview when inventory is
tight.
Use GET /pool?availability=available when you need to list ready inventory.
Follow the next link until it is null.
4. Attach the domains
Send the previewed domain names and the public workspace target:client_id to attach to the Smartlead main workspace. Include it for one
client workspace:
workspace_id in the reservation and resolves
the client behind it. No email, user, or customer object is needed.
You can send 1 to 10 personas. Prefer usernames for exact mailbox local parts:
one persona may list multiple aliases (for example alex and alex.r). For
usernames, Peeker keeps the first local parts that fit each domain’s inbox
count, generates any missing seats from the persona names, and ignores extras.
Legacy email (a full address, one per persona) still works when every persona
includes it; those domains must have at least that many inboxes. Otherwise omit
both fields and Peeker creates the usernames from the names.
If a submitted domain is no longer ready, Peeker uses the oldest ready domain
instead. If it cannot fill the whole request, nothing is assigned.
Before reserving anything, Peeker checks that every selected domain has complete
provider mailbox identity. It also checks that Smartlead and PlusVibe targets
have a complete saved login pair. Missing target login returns 422 with
provider_login_credentials_required and reserves nothing. When
forwarding_url is present, Peeker checks that every selected domain has an
active Cloudflare zone and account. A domain failure returns 422 with code
domains_not_submittable and one reason per blocked domain:
google_engine_identity_incompleteforwarding_not_ready
202 means the assignment was accepted. Peeker then updates forwarding,
submits one Google username swap per domain, and uploads the inboxes to the
destination workspace. The response maps each requested_domain to the final
domain and says if it was substituted.
Poll the returned reservation_id:
pool.claim.completed and pool.claim.failed.
reserved and renaming remain in progress while Peeker retries provider or
network attempts. action_required is used only when fulfillment needs a
customer or partner change. failed means fulfillment was explicitly stopped;
Peeker does not fail an accepted reservation because a retry limit was reached.
Sandbox behavior
Sandbox uses the same requests, response shapes, polling, and webhooks as live. Workspace credentials are checked for the right shape and stored, but sandbox uses a local provider identity instead of validating them with the sequencer. Use placeholder credentials, never production provider keys. Sandbox orders create local Cloudflare test records, but they do not create or change pool rows. Pool rows still enter throughPOST /pool/add and leave only
through the pool lifecycle. Sandbox attach records forwarding changes and
simulates username swaps without calling Cloudflare, the mailbox provider, or
the destination sequencer.
Before switching to a live key:
- Confirm
GET /mereportsapi_key.environment: "live". - Confirm the destination workspace credentials are valid.
- Confirm each pool domain has complete provider mailbox identity and an active Cloudflare connection when forwarding is requested. Review its health signal separately; a burned signal does not block attach.
- Ask Peeker to configure the live pool recycle forwarding URL before releasing any reservation that used forwarding.
- Use a unique idempotency key for each new attach.
- Treat
202as accepted work and poll until the reservation is terminal.
5. Return the domains when the customer cancels
When a customer cancels, release their reservation. By default the domains come back on the next monthly date from the original attach, so the customer keeps sending until the end of their current month:effective_at. Add "forced": true to take the
domains back immediately. If a release is already scheduled, sending the
forced request moves that same release to now. It does not create a second
release.
Poll GET /pool/releases/{id} or listen for pool.release.completed and
pool.release.failed.
Peeker retries temporary forwarding or Google Engine errors up to three total
attempts, one minute apart. The release stays scheduled during those retries.
Permanent setup errors fail immediately, and a temporary error emits
pool.release.failed only after the final attempt.
Healthy and underperforming domains return to your pool, get fresh sender names
and redirects, then warm up again before they can be assigned. They are not
treated as burned.
If the reservation used forwarding_url, a live pool must already have its
recycle forwarding URL configured. Peeker configures this live-only setting
during production setup. Sandbox supplies a local recycle target automatically.
What happens when a domain is burned
Peeker runs two separate replacements:- The customer gets an available warmed domain. Pool health stays visible but
does not block that candidate. Based on your pool setting, this
starts at once, waits for your approval, or stays off. It has its own
reservation and
pool.replacement.*webhooks. - The pool gets a bought backup domain. Peeker cancels the old inboxes, clears the old stats, and creates new inboxes under the same original order and billing. Billing is not changed.