Host objects and commands

An EPP host object is defined in IETF defined in STD69 by RFC5732 and is one of the three primary objects utilised in EPP. Host objects are utilised as nameservers for domains.

Important key points

  • In-bailiwick means a host which will be a nameserver that is sub-ordinate to the zone (i.e. the fully qualified host name would end in the zone).
  • A domain cannot use a nameserver unless a host object exists for it, irrespective of which top-level-domain the host object is in.
  • Once created hosts objects can be linked to any domain in the registry as a nameserver by any registrar.
  • If a host object is currently used for any domain as a nameserver within the registry then the host object cannot be deleted.
  • In-bailiwick host objects can only be created by the registrar that owns the parent domain. (e.g. ns1.example.uk can only be created by the registrar sponsoring example.uk)
  • If a host object is used by a domain and the host object is renamed it appears as if the domain nameserver has been changed.
  • Whilst it is not possible to re-name an out-of-bailiwick host object utilised by other registrars, it is possible for the sponsoring registrar to rename an in-bailiwick host object.
  • If a host object exists the parent domain cannot be deleted; if you wish to no longer renew the parent domain you must delete the sub-ordinate host object; if the sub-ordinate host object is used by another registrar as a nameserver you must re-name the host object. It is recommended that a registrar follows the Renaming to Client-Maintained Dedicated Sacrificial Name Server Host Objects best practice.

Managing host objects:

  1. Host object data
  2. Host:Check command
  3. Host:Create command
  4. Host:Info command
  5. Host:Update command
  6. Host:Delete command

Host object data

A host object is made up of the following data points, further details can be found in RFC5732:

FieldDescription
host:nameThe fully qualified name of the host object without the trailing dot.
Note: For in-bailiwick nameservers, updating the host:name will result in any linked domains having their nameservers changed.
host:roidThe Repository object identifier is a unique over time identifier for the host. If a host is renamed the host:roid remains the same.
host:statusContains information about either locks or link statuses.
host:addrContains either IPv4 or IPv6 addresses for any in-bailiwick nameserver hosts.
host:clIDIdentifies which registrar currently has control of the host object.
host:crIDIdentifies which registrar created the host object.
host:crDateTimestamp the host object was created.
host:upIDIdentifies which registrar last updated the host object.
host:upDateTimestamp the host object was last updated.
host:trDateTimestamp the host object last transferred between registrars. Host objects only transfer between registrars if they are in-bailiwick and their super-ordinate domain transfers.
All fields within a host object are visible to sponsoring and non-sponsoring registrars accredited in the registry.

host:check command

Before linking a domain to a nameserver either with a domain:create or a domain:update command, you should check that the host object already exists in the registry. Note, even if the hostname is out-of-bailiwick you need the object to exist in the registry. This is checked for through a host:check command.

One check command can query one or more hostnames, so you can list all the nameservers that your domain needs in one query:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <command>
    <check>
      <host:check
       xmlns:host="urn:ietf:params:xml:ns:host-1.0">
        <host:name>ns1.nominetdns.uk</host:name>
        <host:name>ns2.nominetdns.wales</host:name>
        <host:name>ns3.nominetdns.cymru</host:name>
      </host:check>
    </check>
    <clTRID>EXAMPLE-CHECK-12345</clTRID>
  </command>
</epp>

A response will confirm whether or not you need to create the host object – “true” indicates you need to create the host to use it, “false” indicates its already provisioned and can be used; so the below response indicates that you need to create ns1.nominetdns.uk and ns3.nominetdns.cymru.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <resData>
            <host:chkData xmlns:host="urn:ietf:params:xml:ns:host-1.0">
                <host:cd>
                    <host:name avail="true">ns1.nominetdns.uk</host:name>
                </host:cd>
                <host:cd>
                    <host:name avail="false">ns2.nominetdns.wales</host:name>
                </host:cd>
                <host:cd>
                    <host:name avail="true">ns3.nominetdns.cymru</host:name>
                </host:cd>
            </host:chkData>
        </resData>
        <trID>
            <clTRID>EXAMPLE-CHECK-12345</clTRID>
            <svTRID>1841174950732370546</svTRID>
        </trID>
    </response>
</epp>

host:create command

To create a host object, send a host:create command:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <command>
    <create>
      <host:create
       xmlns:host="urn:ietf:params:xml:ns:host-1.0">
        <host:name>ns1.nominetdns.uk</host:name>
      </host:create>
    </create>
    <clTRID>EXAMPLE-HOST-12345</clTRID>
  </command>
</epp>

A successful response will return a 1000 result code and resData as below.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <resData>
            <host:creData xmlns:host="urn:ietf:params:xml:ns:host-1.0">
                <host:name>ns1.nominetdns.uk</host:name>
                <host:crDate>2025-05-13T23:44:57.059Z</host:crDate>
            </host:creData>
        </resData>
        <trID>
            <clTRID>EXAMPLE-HOST-12345</clTRID>
            <svTRID>1841165225911392217</svTRID>
        </trID>
    </response>
</epp>

host:info command

To query the current status of a host object:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <command>
    <info>
      <host:info
       xmlns:host="urn:ietf:params:xml:ns:host-1.0">
        <host:name>ns1.nominetdns.uk</host:name>
      </host:info>
    </info>
    <clTRID>EXAMPLE-INFO-12345</clTRID>
  </command>
</epp>

Response:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <resData>
            <host:infData xmlns:host="urn:ietf:params:xml:ns:host-1.0">
                <host:name>s1.nominetdns.uk</host:name>
                <host:roid>H41331979-UK</host:roid>
                <host:status s="ok"/>
                <host:clID>nominet</host:clID>
                <host:crID>nominet/host:crID>
                <host:crDate>2025-05-13T23:32:36.867Z</host:crDate>
            </host:infData>
        </resData>
        <trID>
            <clTRID>EXAMPLE-INFO-12345</clTRID>
            <svTRID>1841163555441742788</svTRID>
        </trID>
    </response>
</epp>

Update command

The host update command can be used to update the:

  1. host name
  2. EPP client statuses
  3. glue records for in-bailiwick host objects

Only the registrar that sponsors the host object (i.e. the host:clID matches their EPP username), can update the host object.

An example of adding an EPP status lock to a host object to secure it:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
    <command>
        <update>
            <host:update xmlns:host="urn:ietf:params:xml:ns:host-1.0">
                <host:name>ns1.nominetdns.uk</host:name>
                <host:add>
                    <host:status s="clientUpdateProhibited"/>
                </host:add>
            </host:update>
        </update>
        <clTRID>HOST-UPDATE-STATUS-12345</clTRID>
    </command>
</epp>

Response

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <trID>
            <clTRID>HOST-UPDATE-STATUS-12345</clTRID>
            <svTRID>1841183403932653985</svTRID>
        </trID>
    </response>
</epp>

An example on changing a host name:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
    <command>
        <update>
            <host:update xmlns:host="urn:ietf:params:xml:ns:host-1.0">
                <host:name>ns1.nominetdns.uk</host:name>
                <host:chg>
                    <host:name>ns1.nominetdns.wales</host:name>
                </host:chg>
            </host:update>
        </update>
        <clTRID>HOST-NAME-CHANGE-12345</clTRID>
    </command>
</epp>

Response:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <trID>
            <clTRID>HOST-NAME-CHANGE-12345</clTRID>
            <svTRID>1841183403932653986</svTRID>
        </trID>
    </response>
</epp>

host:delete Command

A registrar can only delete a host object if:

  1. it is not currently linked to a domain name as a nameserver within the same registry (i.e. host:info command does not contain a status of “linked”); and
  2. the EPP status of clientDeleteProhibited is not set; and
  3. the EPP status of serverDeleteProhibited is not set; and
  4. the registrar is the sponsoring registrar for the host object – that means the host:clID is the registrars EPP client ID.

To delete a host object send a command as follows:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <command>
    <delete>
      <host:delete
       xmlns:host="urn:ietf:params:xml:ns:host-1.0">
        <host:name>ns200.nominetdns.uk</host:name>
      </host:delete>
    </delete>
    <clTRID>EXAMPLE-DELETE-12345</clTRID>
  </command>
</epp>

The system response is as follows:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1000">
            <msg>Command completed successfully</msg>
        </result>
        <trID>
            <clTRID>EXAMPLE-DELETE-12345</clTRID>
            <svTRID>1841177506359548228</svTRID>
        </trID>
    </response>
</epp>

Minerva House, Edmund Halley Road, Oxford Science Park, OX4 4DQ, United Kingdom