The end-to-end flow most resellers ship as their first integration. Your customer is buying email infrastructure on domains they already own at GoDaddy / Namecheap / Squarespace / etc. — Peeker provisions the inboxes on their existing domains and pushes them into Smartlead.Documentation Index
Fetch the complete documentation index at: https://docs.peeker.ai/llms.txt
Use this file to discover all available pages before exploring further.
Full workflow
Save this as a sandbox script to verify the chain end-to-end before you ship.cURL · full workflow
Steps in detail
1. Search for available domains
1. Search for available domains
Your customer types domain candidates in your app’s search box. Debounce 250–400 ms and batch the latest input into one call to
POST /domains/availability (up to 25 candidates). Each available row comes back with available, price_cents, renewal_price_cents, usable_for, and premium.In your UI, render available: true rows that include the customer’s chosen provider in usable_for. Hide premiums (they aren’t orderable via API) or surface them as “contact us.”200 OK · response shape
2. Submit the import job
2. Submit the import job
After the customer picks. Send the customer those nameservers in your UI:
POST /domains/import returns quickly with the nameserver_groups your customer must paste at their registrar. The domains are imported into your default org; they attach to the customer later when you place the order.202 Accepted · nameserver groups
Open your registrar’s DNS settings for acme-mail.com and team-acme.com. Replace the existing nameservers with helena/idris. Most registrars apply the change within a few hours.
3. Wait for the import to complete
3. Wait for the import to complete
Poll
GET /domains/import/{id} every 60 seconds, or subscribe to the domain_import.completed webhook. Status moves from in_progress → completed once nameservers propagate.If you get domain_import.action_required, surface “Acme — waiting on registrar” in your UI and re-show the same nameservers. Peeker keeps re-checking; you’ll get domain_import.completed automatically when the customer flips DNS.4. Submit the order
4. Submit the order
One call. Pick a Use
bundle_id (resolves the license mix from monthly volume), pass the Smartlead route and login credentials, list the imported domains, and list the personas (first/last names + optional profile picture URLs).If the email already exists, Peeker reuses that user and updates their saved Smartlead routing for future orders. Re-sending the same body returns the original order — orders dedupe for 24 hours.200 OK · order
GET /orders/{id} or order webhooks when you need the full detail response with imported vs registered domains, line items, and generated users.5. Watch fulfillment webhooks
5. Watch fulfillment webhooks
The progression for a Smartlead-backed order:When
order.completed fires, the inboxes are already pushed into Smartlead. They can start warming and sending. No additional API call from your side.Things to handle in production
A few real-world cases that show up once you’re past sandbox:- Customer hasn’t flipped nameservers yet. You’ll see
domain_import.action_requiredafter ~30 minutes. Re-show the nameservers in your UI and surface “Acme — waiting on registrar.” Peeker keeps re-checking; you’ll getdomain_import.completedwhen they propagate. - Profile picture URL is private/invalid. You’ll see
order.action_requiredbetweenin_progressandcompletedwithreason: "profile_picture_public_link_required"or"profile_picture_resubmit". Get a fresh public URL from the customer andPATCH /users/{id}(or place a corrected order). Provisioning resumes automatically. - Smartlead credentials are wrong. You’ll see
order.action_requiredwithreason: "provider_workspace_problem", and the order stalls. Submit a corrected order or update the user’s Smartlead route before future orders.
What’s next
Buying domains from your registrar
Same flow, but Peeker buys the domains and runs DNS — no nameserver step for the customer.
Change forwarding URLs in bulk
Repoint many domains at a new forwarding URL after the order is live.
How to implement domain swaps
Replace a degrading domain mid-flight without losing warmup.
Best practices
Errors, paging, idempotent retries, pending actions, webhook hygiene.