Skip to content

Registering a domain name

This guide will show you how to register and setup a domain name with the API.

Info

This will require an access token with the domains:contact, domains:contact_address, domains:domain and domains:domain.create scopes.

Create a contact

Every domain needs at least a registrant contact, let's create one. First we need a address for the contact. We'll only create a localised address but you can create an internationalised address too.

POST /api/contact_addresses/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json

{
    "description": "Exmaple Address",
    "name": "Barry Benson",
    "organisation": "The Honey Factory",
    "street_1": "5 Buzz Street",
    "street_2": null,
    "street_3": null,
    "city": "Some City",
    "province": "Flyshire",
    "postal_code": "TE57 1NG",
    "country_code": "GB",
    "disclose_name": true,
    "disclose_organisation": false,
    "disclose_address": false
}

The server should return the object we just created if all is well.

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{
    "url": "https://domains.glauca.digital/api/contact_addresses/908b1a1b-e452-4c87-a711-1ab3e8e61c50/",
    "id": "908b1a1b-e452-4c87-a711-1ab3e8e61c50",
    "description": "Exmaple Address",
    "name": "Barry Benson",
    "organisation": "The Honey Factory",
    "street_1": "5 Buzz Street",
    "street_2": null,
    "street_3": null,
    "city": "Some City",
    "province": "Flyshire",
    "postal_code": "TE57 1NG",
    "country_code": "GB",
    "birthday": null,
    "identity_number": null,
    "disclose_name": true,
    "disclose_organisation": false,
    "disclose_address": false
}

Make a note of this ID, we'll need it in the next step. Which is to create the contact. Use this ID in the local_address field.

POST /api/contacts/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json

{
    "description": "Exmaple contact",
    "local_address": "908b1a1b-e452-4c87-a711-1ab3e8e61c50",
    "int_address": null,
    "phone": "+441234567890",
    "phone_ext": null,
    "fax": null,
    "fax_ext": null,
    "email": "b.benson@honey.co.uk",
    "entity_type": "uk_limited_company",
    "trading_name": null,
    "company_number": "12345678",
    "disclose_phone": false,
    "disclose_fax": false,
    "disclose_email": true
}

And again the object will be sent back to us.

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{
    "url": "https://domains.glauca.digital/api/contacts/2a2b0972-a64d-42e2-a401-b09595306e5d/",
    "id": "2a2b0972-a64d-42e2-a401-b09595306e5d",
    "description": "Exmaple contact",
    "local_address": "908b1a1b-e452-4c87-a711-1ab3e8e61c50",
    "local_address_url": "https://domains.glauca.digital/api/contact_addresses/908b1a1b-e452-4c87-a711-1ab3e8e61c50/",
    "int_address": null,
    "int_address_url": null,
    "int_address": null,
    "phone": "+441234567890",
    "phone_ext": null,
    "fax": null,
    "fax_ext": null,
    "email": "b.benson@honey.co.uk",
    "entity_type": "uk_limited_company",
    "trading_name": null,
    "company_number": "12345678",
    "disclose_phone": false,
    "disclose_fax": false,
    "disclose_email": true
}

Registering the domain

Now we have everything setup to register the domain. First lets check the domain we want is available to register.

POST /api/domains/check/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json

{
    "domain": "honey.li",
    "period": {
        "unit": "y",
        "value": 1
    }
}
HTTP/1.1 200 OK
Content-Type: application/json

{
    "domain": "honey.li",
    "available": true,
    "reason": null,
    "price": "9.99"
}

Excellent! It's available, let's register it. To do this we'll need to create a domain registration order. We're setting this to be an 'off session' order so it'll fail if there isn't enough money in your account with us.

POST /api/domain_registration_orders/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json

{
    "domain": "honey.li",
    "period": {
        "unit": "y",
        "value": 1
    },
    "off_session": true,
    "registrant": "2a2b0972-a64d-42e2-a401-b09595306e5d"
}

This will be sent back to us in the started state.

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{
    "url": "https://domains.glauca.digital/api/domain_registration_orders/4717d5b5-16e0-461d-8d9d-650bc03e7a5c/",
    "id": "4717d5b5-16e0-461d-8d9d-650bc03e7a5c",
    "redirect_uri": null,
    "last_error": null,
    "off_session": true,
    "price": 9.99,
    "state": "started",
    "domain": "honey.li",
    "domain_id": "631a9f98-6f20-45a0-9468-d599f318133a",
    "domain_obj": null,
    "domain_obj_url": null,
    "registrant": "2a2b0972-a64d-42e2-a401-b09595306e5d",
    "registrant_url": "https://domains.glauca.digital/api/contacts/2a2b0972-a64d-42e2-a401-b09595306e5d/",
    "admin_contact": null,
    "admin_contact_url": null,
    "billing_contact": null,
    "billing_contact_url": null,
    "tech_contact": null,
    "tech_contact_url": null,
    "period": {
        "unit": "y",
        "value": 1
    }
}

The order will then be processed in the background and assuming everything went well it'll transition to the completed state and the domain_obj field will be populated.

GET /api/domain_registration_orders/4717d5b5-16e0-461d-8d9d-650bc03e7a5c/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{
    "url": "https://domains.glauca.digital/api/domain_registration_orders/4717d5b5-16e0-461d-8d9d-650bc03e7a5c/",
    "id": "4717d5b5-16e0-461d-8d9d-650bc03e7a5c",
    "redirect_uri": null,
    "last_error": null,
    "off_session": true,
    "price": 9.99,
    "state": "completed",
    "domain": "honey.li",
    "domain_id": "631a9f98-6f20-45a0-9468-d599f318133a",
    "domain_obj": "631a9f98-6f20-45a0-9468-d599f318133a",
    "domain_obj_url": "https://domains.glauca.digital/api/domains/631a9f98-6f20-45a0-9468-d599f318133a",
    "registrant": "2a2b0972-a64d-42e2-a401-b09595306e5d",
    "registrant_url": "https://domains.glauca.digital/api/contacts/2a2b0972-a64d-42e2-a401-b09595306e5d/",
    "admin_contact": null,
    "admin_contact_url": null,
    "billing_contact": null,
    "billing_contact_url": null,
    "tech_contact": null,
    "tech_contact_url": null,
    "period": {
        "unit": "y",
        "value": 1
    }
}

Setting up the domain

If we check the newly registered domain it should look something like this.

GET /api/domains/631a9f98-6f20-45a0-9468-d599f318133a/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{
    "url": "https://domains.glauca.digital/api/domains/631a9f98-6f20-45a0-9468-d599f318133a/",
    "id": "631a9f98-6f20-45a0-9468-d599f318133a",
    "domain": "honey.li",
    "statuses": [
        "ok"
    ],
    "deleted": false,
    "registrant": "2a2b0972-a64d-42e2-a401-b09595306e5d",
    "registrant_url": "https://domains.glauca.digital/api/contacts/2a2b0972-a64d-42e2-a401-b09595306e5d/",
    "admin_contact": null,
    "admin_contact_url": null,
    "billing_contact":  null,
    "billing_contact_url": null,
    "tech_contact": null,
    "tech_contact_url": null,
    "name_servers": [
        {
            "host_object": "ns1.as207960.net",
            "host_name": null,
            "addresses": null
        },
        {
            "host_object": "ns2.as207960.net",
            "host_name": null,
            "addresses": null
        }
    ],
    "hosts": [],
    "rgp_state": [],
    "auth_info": "abc123",
    "sec_dns": null,
    "created": null,
    "expiry": "2020-08-23T21:59:59Z",
    "last_updated": null,
    "last_transferred": null
}

Let's say we don't want to use HexDNS and want to setup another DNS server (no hard feelings, honest). We'll patch the domain to set new name servers.

PATCH /api/domains/631a9f98-6f20-45a0-9468-d599f318133a/ HTTP/1.1
Authorization: Bearer <your token>
Content-Type: application/json; charset=utf-8
Accept: application/json

{
    "name_servers": [
        {
            "host_object": "ns1.he.net",
            "host_name": null,
            "addresses": null
        },
        {
            "host_object": "ns2.he.net",
            "host_name": null,
            "addresses": null
        }
    ]
}

For more information on what's available to change on the domain see the domain object reference