Plonki

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

  1. Top up your balance under Billing, or plan to use checkout links (see Payments and billing).
  2. Create a key with mode Live and swap it in. Same code, real domains.
  3. Add a webhook URL under Settings to hear when orders finish (see Webhooks).