Quick start
Search, register and connect a domain with a test key. Nothing is charged and nothing is really registered.
1. Get a test key
Create an account, open API keys in the dashboard and create a key with mode Test. It starts with plk_test_. Treat keys like passwords.
shell
export PLONKI_KEY=plk_test_...
2. Search
curl "https://plonki.com.au/v1/domains/search?q=acme%20coffee" \ -H "Authorization: Bearer $PLONKI_KEY"
const res = await fetch("https://plonki.com.au/v1/domains/search?q=acme%20coffee", {
headers: { Authorization: `Bearer ${process.env.PLONKI_KEY}` },
});
const { results } = await res.json();
console.log(results.filter((r) => r.available));import os, requests
r = requests.get(
"https://plonki.com.au/v1/domains/search",
params={"q": "acme coffee"},
headers={"Authorization": f"Bearer {os.environ['PLONKI_KEY']}"},
)
print([x for x in r.json()["results"] if x["available"]])A phrase is checked across .com, .io, .ai, .app, .co, .dev, .com.au, .net and .xyz. Each result has available and a price in cents per year.
3. Register
Send the domain, the most you'll pay (max_price, the total in cents), an Idempotency-Key, and the owner's details the first time. Later registrations reuse the saved contact.
curl https://plonki.com.au/v1/domains \
-H "Authorization: Bearer $PLONKI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"domain": "acmecoffee.com",
"years": 1,
"max_price": 3399,
"contact": {
"first_name": "Sam", "last_name": "Lee",
"email": "sam@acmecoffee.com", "phone": "0412 345 678",
"address1": "1 Smith St", "city": "Melbourne",
"state": "VIC", "postcode": "3000", "country": "AU"
}
}'const res = await fetch("https://plonki.com.au/v1/domains", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PLONKI_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
domain: "acmecoffee.com",
years: 1,
max_price: 3399,
contact: {
first_name: "Sam", last_name: "Lee", email: "sam@acmecoffee.com", phone: "0412 345 678",
address1: "1 Smith St", city: "Melbourne", state: "VIC", postcode: "3000", country: "AU",
},
}),
});
const order = await res.json(); // order.status: "completed", "awaiting_payment" or "processing"import os, uuid, requests
order = requests.post(
"https://plonki.com.au/v1/domains",
headers={
"Authorization": f"Bearer {os.environ['PLONKI_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"domain": "acmecoffee.com",
"years": 1,
"max_price": 3399,
"contact": {
"first_name": "Sam", "last_name": "Lee", "email": "sam@acmecoffee.com",
"phone": "0412 345 678", "address1": "1 Smith St", "city": "Melbourne",
"state": "VIC", "postcode": "3000", "country": "AU",
},
},
).json()json
{
"id": "ord_k2v9wq4x8n1m7b3c5d6f",
"type": "register",
"domain": "acmecoffee.com",
"years": 1,
"amount": 3399,
"currency": "AUD",
"status": "completed",
"payment": "free_test",
"checkout_url": null,
"error": null,
"external_ref": null,
"test_mode": true,
"next_step": "Done. Use point_domain or set_nameservers to connect it to a website.",
"created_at": "2026-11-08T01:23:45.000Z"
}4. Connect it
shell
curl https://plonki.com.au/v1/domains/acmecoffee.com/point \
-H "Authorization: Bearer $PLONKI_KEY" \
-H "Content-Type: application/json" \
-d '{"target": "acmecoffee.vercel.app"}'Plonki sets the right records for the root and www, and tells you the last step to do at your host.
5. Go live
- Top up your balance under Billing, or plan to use checkout links (see Payments and billing).
- Create a key with mode Live and swap it in. Same code, real domains.
- Add a webhook URL under Settings to hear when orders finish (see Webhooks).