Generate white pages programmatically — create an order, poll its status, download the ZIP. Same engine, same prices as the website. Billed from your prepaid balance.
Keys are created from your account. You must top up your balance to at least $10 to create a key. Each generation is then charged from that balance (1 credit = $1) — no balance, nothing is generated.
Send your key as a Bearer token on every /api/v1 request:
Authorization: Bearer wl_live_xxxxxxxxxxxxxxxxxxxx
| Field | Type | Default | Notes |
|---|---|---|---|
page_type | string | landing | landing · corporate · blog |
pages | int | 3 | 1–50 pages, landing only. corporate is 7+ pages, blog is always the standard (12+ content pages, 8+ of them articles) — both plus Privacy, Terms and Cookies |
count | int | 5 | 5–100 white pages (minimum 5, as on the website): $4 each, $3.50 each from 100; $3.50 at any count once your account has had a $400+ top-up |
niche | string | random | e.g. "solar panels". Empty = auto |
target_lang | string | en | ISO code, e.g. es, de |
geo | string | required | ISO-2 country of the offer, e.g. US, MX, DE — addresses, phones and currency follow it. Missing or unknown → 400 before anything is charged. The full list: GET /api/v1/geos (no key needed) |
react | bool | false | ignored — the React add-on is off sale since 2026-09-27 |
curl -X POST https://white-lands.com/api/v1/generate \
-H "Authorization: Bearer $WL_KEY" \
-H "Content-Type: application/json" \
-d '{"page_type":"landing","pages":3,"count":5,"niche":"solar","geo":"US","target_lang":"en"}'
Response:
{
"ok": true,
"order_id": 412,
"cost_usd": 23,
"balance_after_usd": 77,
"count": 5,
"status": "queued",
"poll": "/api/v1/orders/412"
}
Poll every ~20–30s. When status is done, downloads holds signed ZIP links (valid 30 days) for all expected_lands. partial means some are ready (ready_lands of expected_lands) and the rest is being finished — download what is there and keep polling. cancelled and failed are final.
curl https://white-lands.com/api/v1/orders/412 \
-H "Authorization: Bearer $WL_KEY"
{
"order_id": 412,
"status": "done", // queued | generating | partial | done | failed | cancelled
"expected_lands": 1,
"ready_lands": 1,
"downloads": [
{"slug":"solar-grid-x9", "url":"https://white-lands.com/api/delivery/solar-grid-x9?t=..."}
]
}
curl https://white-lands.com/api/v1/balance -H "Authorization: Bearer $WL_KEY"
{ "balance_usd": 77 }
import requests, time
H = {"Authorization": "Bearer " + WL_KEY}
B = "https://white-lands.com"
r = requests.post(f"{B}/api/v1/generate",
headers=H, json={"page_type":"landing","pages":3,"count":5,"geo":"US"}).json()
oid = r["order_id"]
print("order", oid, "cost $", r["cost_usd"])
while True:
s = requests.get(f"{B}/api/v1/orders/{oid}", headers=H).json()
print(s["status"])
if s["status"] in ("done","failed","cancelled"): break
time.sleep(30)
for d in s.get("downloads", []):
print("download:", d["url"])
count). Every type costs the same: $4 per white page, $3.50 from 100 or once your account has had a $400+ top-up. Check the live cost in the cost_usd field — it's deducted at order time, before generation.
| Code | Meaning |
|---|---|
401 | Missing / invalid / revoked key |
402 | Insufficient balance for this order |
400 | Bad parameters (type/size/count/geo) |
404 | Order not found (or not yours) |
429 | Rate limit (60 generations / hour / key) |