Skip to main content
New Use the domain registration API when you want to buy a new domain programmatically through Bizzy. The API searches registrar availability, returns a live quote, charges your account’s default saved Stripe payment method, and starts a registration operation you can poll until it completes.

Prerequisites

Before you call the registration endpoints, make sure you have:
  • A Bizzy API key with domains:read and domains:write.
  • A default Stripe payment method saved on the Bizzy account.
  • The registrant contact details required by the domain registry.
  • A maximum price, in cents, that you are willing to pay for the registration.
The examples below use this base URL:
https://api.bizzyco.ai/v1

Step 1: Search availability

Search the exact domain you want to register.
curl "https://api.bizzyco.ai/v1/domain-registrations/search?query=example.com" \
  -H "Authorization: Bearer $BIZZY_API_KEY"
The response is wrapped in data:
{
    "data": {
        "query": "example.com",
        "results": [
            {
                "domain": "example.com",
                "available": true,
                "premium": false,
                "priceCents": 1800
            }
        ]
    }
}
Only continue if available is true.

Step 2: Get a live quote

Request a quote for the domain and registration period. periodYears is optional and defaults to 1; it can be any integer from 1 to 10.
curl "https://api.bizzyco.ai/v1/domain-registrations/quote?domain=example.com&periodYears=1" \
  -H "Authorization: Bearer $BIZZY_API_KEY"
Use the returned amountCents as the minimum value for maxAmountCents in the registration request.
{
    "data": {
        "domain": "example.com",
        "available": true,
        "periodYears": 1,
        "amountCents": 1800,
        "currency": "usd",
        "premium": false
    }
}
Quotes are live. The registration request re-checks availability and price before charging. If the current price is higher than maxAmountCents, the API rejects the request instead of charging you.

Step 3: Register the domain

Submit the registration request with the domain, price guardrail, registration settings, and registrant contact details. Registration moves money, so it requires an Idempotency-Key header. Generate a unique value per registration attempt and send the same value if you retry that attempt.
curl -X POST "https://api.bizzyco.ai/v1/domain-registrations" \
  -H "Authorization: Bearer $BIZZY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 9f8c2b1a-4d3e-4a6b-8c1d-2e3f4a5b6c7d" \
  -d '{
    "domain": "example.com",
    "periodYears": 1,
    "maxAmountCents": 1800,
    "autoRenew": true,
    "whoisPrivacy": true,
    "contact": {
      "label": "Primary registrant",
      "firstName": "Ada",
      "lastName": "Lovelace",
      "organizationName": "Example Co",
      "jobTitle": "Founder",
      "address1": "123 Market St",
      "address2": "Suite 400",
      "city": "San Francisco",
      "stateProvince": "CA",
      "postalCode": "94105",
      "country": "US",
      "email": "domains@example.com",
      "phone": "+14155550123"
    }
  }'
Successful registration requests return 202 Accepted with an operation ID:
{
    "data": {
        "operationId": "550e8400-e29b-41d4-a716-446655440000",
        "status": "queued",
        "domain": "example.com"
    }
}
The API charges the account’s default saved Stripe payment method before the operation is queued. If no default payment method exists, the request fails with 402.

Idempotency

The Idempotency-Key header is required and makes the charge safe to retry:
  • Reuse the same key to retry a request that may already have succeeded (a timeout or dropped connection before you saw the 202). The API replays the original operation and never charges twice.
  • Use a new key for a genuinely new registration attempt — for example, after a previous attempt failed and was refunded.
If you omit the header, the request is rejected with 400. The same header is required on domain renewal (POST /v1/domains/{id}/registration/renew).

Required registration inputs

FieldRequiredNotes
domainYesDomain name to register, such as example.com
periodYearsNoInteger from 1 to 10; defaults to 1
maxAmountCentsYesMaximum amount you authorize Bizzy to charge, in USD cents
autoRenewNoDefaults to true
whoisPrivacyNoDefaults to true
contactYesRegistrant contact object used for the domain registration
Transfer lock is enabled automatically after a domain is registered. Manage it afterwards with PATCH /v1/domains/{id}/registration. The contact object requires:
FieldRequiredNotes
firstNameYesRegistrant first name
lastNameYesRegistrant last name
address1YesStreet address
cityYesCity
stateProvinceYesState, province, or administrative region
postalCodeYesPostal or ZIP code
countryYesTwo-letter country code, such as US
emailYesRegistrant email address
phoneYesRegistrant phone number; E.164 recommended
These contact fields are optional: label, organizationName, jobTitle, and address2. If you provide organizationName, jobTitle is also required — the domain registry rejects a company contact without a job title. label is stored only in Bizzy; changing it later does not update the registrar contact. After registration, update registrar-backed contact fields with PATCH /v1/domains/{id}/registration/contact. Changing the registrant’s name, organization, or email resets Bizzy’s 15-day ICANN verification window and shows the registrant verification notice again. Changing only the local label does not contact the registrar or reset verification. Registered Bizzy-managed domains cannot be deleted with DELETE /v1/domains/{id}. Disable auto-renew or handle cancellation with the registrar first so the paid registration is not hidden from Bizzy while it is still active.

Step 4: Poll the operation

Registration is asynchronous because it depends on payment, registrar, DNS, and email setup work. Poll the operation until it reaches succeeded or failed.
curl "https://api.bizzyco.ai/v1/operations/550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer $BIZZY_API_KEY"
Operation statuses are:
StatusMeaning
queuedPayment succeeded and provisioning is waiting
runningRegistration provisioning has started
succeededThe domain was registered and added to Bizzy
failedRegistration failed; check errorMessage
When the operation succeeds, resourceType is domain and resourceId is the new Bizzy domain ID.
{
    "data": {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "type": "domain_registration",
        "status": "succeeded",
        "resourceType": "domain",
        "resourceId": "6f5b6fc6-7e21-4f5b-8d6d-0c0f6c269b5d",
        "resourceName": "example.com",
        "workflowId": "domain-registration-example-com",
        "paymentIntentId": "pi_123",
        "errorCode": null,
        "errorMessage": null,
        "completedAt": "2026-06-14T16:30:00.000Z",
        "createdAt": "2026-06-14T16:29:45.000Z",
        "updatedAt": "2026-06-14T16:30:00.000Z"
    }
}

Step 5: Read the domain

After the operation succeeds, fetch the new domain using resourceId.
curl "https://api.bizzyco.ai/v1/domains/6f5b6fc6-7e21-4f5b-8d6d-0c0f6c269b5d" \
  -H "Authorization: Bearer $BIZZY_API_KEY"
Registered domains are managed by Bizzy, so DNS and email authentication records are configured automatically. The domain becomes usable for Bizzy-hosted email after setup completes.

Common failures

Error codeHTTP statusWhat to do
DOMAIN_UNAVAILABLE409Search for another domain or TLD
PRICE_EXCEEDS_MAXIMUM409Get a fresh quote and decide whether to raise maxAmountCents
PAYMENT_METHOD_REQUIRED402Add or choose a default payment method in Bizzy billing
PAYMENT_FAILED402Update the default payment method and try again

Next steps

After registration succeeds:
Last modified on June 15, 2026