Auth Codes

When CoCCA or a registrar creates or edits an domain or contact authorisation code, the code is one-way hashed and only the hash is stored in the database.

The only option for a TLD manager or a registrar to know the code - if they dont have a record of it, is to re-set the authcode.

Authorization codes can only be re-set in the web portal or via EPP by the TLD manager or the controlling registrar.

When requesting the current authcode over EPP CoCCA will return the hash value, not the actual authorisation code.

If a registrar does not know the existing code and needs to provide one to a registrant to enable a transfer, the recomended process would be to re-set the authorisation code to a known value and provide that to the registrant.


Authcodes have a validity period equal to the transfer time-out configured by the TLD manager for the zone the domain is in. An attemept to transfer using an expired authcode will fail.

Registars can check if an authcode is valid prior to initiating a transfer using the REST API on the RDAP server. Prior to doing this the registrar must 1.) Generate their API Token in the CoCCA portal, and 2.) Add the IP they will query from to their trusted EPP/API IPs.

Example:

curl --location 'https://lab03-rdap.coccaregistry.org/domain/nic.cx/attributes?authToken=123456Abc890' --header 'Authorization: Bearer 7ad326a4-23af-4cd3-ae0f-8e6f80cfd36f'

PEM Client Certs

Extract private key and cert from pfx:

Extract private key
openssl pkcs12 -in CoCCA.pfx -nocerts -out CoCCA_key.pem -legacy

Extract certificate
openssl pkcs12 -in CoCCA.pfx -clcerts -nokeys -out CoCCA_client_cert.pem -legacy

The above command will ask for password, and the password is changeit

EPP Balance

How do I check my available balance over EPP ?

The simplest ( and recomended ) method is to use the finance extension. Note: This is a bespoke, non-rfc extension. The RESPONSE is TLD | CURRENCY | BALANCE.

As an alternative method, CoCCA supports the Registry Fee Extension rfc8748.

Finance Extension - Balance Client REQUEST

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  <command>
    <info>
      <finance:info xmlns:finance="https://finance.coccaregistry.org">
      </finance:info>
    </info>
    <clTRID>CoCCATest</clTRID>
  </command>
</epp>

Finance Extension - Balance Server RESPONSE

<?xml version="1.0" encoding="utf-8"?>
<epp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn
:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd" xmlns="urn:ietf:params:xml:ns:epp-1.0"> <response> <result code="1000"> <msg>Command completed successfully</msg> </result> <resData> <finance:infData xmlns:finance="https://finance.coccaregistry.org"> <finance:balance>LAB|EUR|18.00</finance:balance> <finance:balance>OTE|USD|90.00</finance:balance> </finance:infData> </resData> <trID> <clTRID>CoCCATest</clTRID> <svTRID>2e438303-259a-4bdc-b0de-e7d62c4b1477:2</svTRID> </trID> </response> </epp>

Alternative Method, rfc8748 - Fees Extension ( client REQUEST - renew )

See more examples in https://datatracker.ietf.org/doc/html/rfc8748

Any EPP Domain CHECK, CREATE, UPDATE, DELETE, RENEW command that includes the fee extension tag will return the currency, fee, balance and credit limit.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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">
  <command>
    <renew>
      <domain:renew xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
       xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd">
          <domain:name>test90nepp22.ote</domain:name>
          <domain:curExpDate>2023-04-11</domain:curExpDate>
          <domain:period unit="y">1</domain:period>
       </domain:renew>
    </renew>
	<extension>
        <fee:renew xmlns:fee="urn:ietf:params:xml:ns:epp:fee-1.0">
        <fee:currency>USD</fee:currency>
        <fee:fee>5.00</fee:fee>
        </fee:renew>
	</extension>
	<clTRID>ABC-12345</clTRID>
  </command>
</epp>

Alternative Method, rfc8748 - Fees Extension ( server RESPONSE - renew )

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <msgQ count="1" id="2549253"/>
	<resData>
        <domain:renData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
	 xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd">
        <domain:name>test90nepp22.ote</domain:name>
        <domain:exDate>2024-04-11T22:00:00.000Z</domain:exDate>
	</domain:renData>
	</resData>
        <extension>
	   <fee:renData xmlns:fee="urn:ietf:params:xml:ns:epp:fee-1.0">
	   <fee:currency>USD</fee:currency>
           <fee:fee grace-period="P5D">1.00</fee:fee>
           <fee:balance>20246.39</fee:balance>
           <fee:creditLimit>0.00</fee:creditLimit>
           </fee:renData>
        </extension>
    <trID>
	<clTRID>ABC-12345</clTRID>
        <svTRID>1658914294415</svTRID>
    </trID>
  </response>
</epp>

EPP Restore

How do I Re-Activate a domain that is in a ‘pendingDelete’ state?

When a domain with a status of redemptionPeriod + pendingDelete is restored via EPP, the registrar must also submit a Restore Report. Upon receipt of a Report, the restrictive statuses will be removed. A restore request made via the web portal automatically appends the required Restore Report.

If no Restore Report is provided, the domain will have a new status - pendingRestore, the request will need to be manually approved by the registry administrator. A domain with a pendingRestore status will NOT be included the zone.

Note: Restore does not automatically renew a domain, depending on your client preferences, you may need to also submit a renew request. If an expired domain with a redemptionPeriod + pendingDelete status is restored but not renewed, the registry automation may set the status back to redemptionPeriod + pendingDelete status within 24 hours.

Restore request example

<?xml version='1.0' encoding='UTF-8'?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
   <command>
      <update>
         <domain:update xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
            <domain:name>testdomain3.lab</domain:name>
            <domain:chg/>
         </domain:update>
      </update>
      <extension>
         <rgp:update xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0"
            <rgp:restore"request"/>
         </rgp:update>
      </extension>
      <clTRID>ABC-12345</clTRID>
   </command>
</epp>

Restore report example

<?xml version='1.0' encoding='UTF-8'?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
   <command>
      <update>
         <domain:update xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
            <domain:name>testdomain3.lab</domain:name>
            <domain:chg/>
         </domain:update>
      </update>
      <extension>
         <rgp:update xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0">
            <rgp:restore op="report">
                <rgp:report>
                   <rgp:preData>Pre-delete registration data.</rgp:preData>
                   <rgp:postData>Post-restore registration data.</rgp:postData>
                   <rgp:delTime>2003-07-10T22:00:00.0Z</rgp:delTime>
                   <rgp:resTime>2003-07-20T22:00:00.0Z</rgp:resTime>
                   <rgp:resReason>Registrant error.</rgp:resReason>
                   <rgp:statement>This registrar has not restored ...</rgp:statement>
                   <rgp:statement>The information in this report is ...</rgp:statement>
                   <rgp:other>Supporting information ...</rgp:other>
                 </rgp:report>
            </rgp:restore>
         </rgp:update>
      </extension>
   </command>
</epp>