Introduction
Welcome to the Estonian Internet Foundation's REST EPP (REPP for short) API documentation! You can use our API endpoints, which can mimic almost the full functionality of our EPP protocol.
We have language bindings in Shell. You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
This production API project is only available for our active registrars. You can find more information about becoming registrar at our wiki page.
Environments
Production endpoint: https://repp.internet.ee/
Sandbox endpoint: https://testrepp.internet.ee/
Production environment is only available for our active registrars.
Access to our sandbox environment is not publicly available. We can grant access to third parties upon request.
Authentication
REPP uses API keys and certificates to allow access to our API. Certificates are the same ones that are used for EPP protocol.
API key, in a nutshell, is a Basic authorization key that consists of ApiUser's username and password, separated by colon, in Base64 format.
For example if your username is test
and password test123
, , you have to encode test:test123
to Base64 and put it into Authorization
header of each request.
For example:
Authorization: Basic dGVzdDp0ZXN0MTIz
Billing
Get account balance
curl --location --request GET 'https://testrar.internet.ee/repp/v1/accounts/balance' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"balance": "420.0",
"currency": "EUR"
}
}
Command above with detailed=true flag returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"balance": "420.0",
"currency": "EUR",
"transactions": [
{
"created_at": "2021-02-26T17:12:46.045+02:00",
"description": "Create abadiitas.ee",
"type": "debit",
"sum": "-6.0",
"balance": "420.0"
},
{
"created_at": "2021-02-11T11:32:49.158+02:00",
"description": "Invoice no. 131096",
"type": "credit",
"sum": "100.0",
"balance": "426.0"
}
]
}
}
Get account balance
HTTP Request
GET /repp/v1/accounts/balance
URL Parameters
Parameter | Required | Description |
---|---|---|
detailed | False | Set to true to get detailed transaction data |
from | False | Show detailed transactions starting from datetime (yyyy-mm-dd) |
until | False | Show detailed transactions created before datetime (yyyy-mm-dd) |
Poll messages
Get all messages
curl --location --request GET 'https://testrar.internet.ee/repp/v1/registrar/notifications/all_notifications' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
{
"code": 1000,
"message": "Command completed successfully. Returning 200 out of 500. Use URL parameters :limit and :offset to list other messages if needed",
"data": {
"id": 1399,
"text": "Registrant rejected domain update: koer.ee",
"attached_obj_type": "Epp::Domain",
"attached_obj_id": 34
}
}
Get the list of unread pool messages.
HTTP Request
GET /repp/v1/registrar/notifications/all_notifications
URL Parameters
Parameter | Required | Default | Description |
---|---|---|---|
limit | No | 200 | How many objects to return |
offset | No | 0 | Object query offset |
Get latest unread poll message
curl --location --request GET 'https://testrar.internet.ee/repp/v1/registrar/notifications' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"id": 1399,
"text": "Registrant rejected domain update: koer.ee",
"attached_obj_type": "Epp::Domain",
"attached_obj_id": 34
}
}
Get the latest unread poll message
HTTP Request
GET /repp/v1/registrar/notifications
Mark poll message as read
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/registrar/notifications/1398' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"notification": {
"read": true
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"notification_id": 1398,
"read": true
}
}
Mark poll message as read
HTTP Request
PUT /repp/v1/registrar/notifications/:notification_id
URL Parameters
Parameter | Required | Description |
---|---|---|
notification_id | Yes | Notification ID |
Payload Parameters
Parameter | Required | Description |
---|---|---|
read | Yes | Set to true to mark as read |
Get a specific poll message
curl --location --request GET 'https://testrar.internet.ee/repp/v1/registrar/notifications/1398' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"id": 1398,
"text": "Contact ATSAA:57C8A9CB has been updated by registrant",
"attached_obj_type": null,
"attached_obj_id": null
}
}
Get a specific poll message
HTTP Request
GET /repp/v1/registrar/notifications/:notification_id
URL Parameters
Parameter | Required | Description |
---|---|---|
notification_id | Yes | Notification ID |
Contacts
Get all contacts
curl --location --request GET 'https://testrar.internet.ee/repp/v1/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"contacts": [
"ATSAA:15554596",
"ATSAA:5767A313",
"ATSAA:634CF14B",
],
"count": 3
}
}
Get all contacts
HTTP Request
GET /repp/v1/contacts
URL Parameters
Parameter | Required | Default | Description |
---|---|---|---|
limit | No | 200 | How many objects to return |
offset | No | 0 | Object query offset |
details | No | false | Show full object for each contact |
Get a specific contact
curl --location --request GET 'https://testrar.internet.ee/repp/v1/contacts/ATSAA:KARL' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"contact": {
"code": "1111111:8E561326",
"name": "John Doe",
"ident": {
"code": "12345678901",
"type": "priv",
"country_code": "EE"
},
"email": "xxx@xxx.ee",
"phone": "+xxx",
"auth_info": "ed33c67bedb32b1567b131",
"statuses": {
"ok": "ok status description",
"linked": null
},
"disclosed_attributes": [],
"registrar": {
"name": "Registrar",
"website": "https://registrar"
},
"domains": [],
"domains_count": 0
}
}
}
Get a specific contact
HTTP Request
GET /repp/v1/contacts/:contact_id
URL Parameters
Parameter | Required | Default | Description |
---|---|---|---|
contact_id | Yes | Contact ID | |
simple | No | false | Show simple object for contact |
Delete a specific contact
curl --location --request DELETE 'https://testrar.internet.ee/repp/v1/contacts/ATSAA:KARL' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {}
}
In case contact can not be destroyed, it returns a JSON structured like this:
{
"code": 2305,
"message": "Object association prohibits operation [domains]",
"data": {}
}
Delete a specific contact
HTTP Request
DELETE /repp/v1/contacts/:contact_id
URL Parameters
Parameter | Required | Description |
---|---|---|
contact_id | Yes | Contact ID |
Create a new contact
curl --location --request POST 'https://testrar.internet.ee/repp/v1/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"contact": {
"name": "John Doe",
"email": "john@doe.com",
"phone": "+372.xxx",
"ident": {
"ident": "xxx",
"ident_type": "priv",
"ident_country_code": "EE"
}
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"contact": {
"code": "ATSAA:84F23FD1"
}
}
}
Create a new contact
HTTP Request
POST /repp/v1/contacts
Payload Parameters
Parameter | Required | Description |
---|---|---|
id | No | Custom contact id for contact |
name | Yes | Full name of contact |
Yes | Email address of contact | |
phone | Yes | phone number of contact, with '.' as CC separator |
ident[ident] | Yes | Identity / Registry code of contact |
ident[ident_type] | Yes | Type of ident number (priv/org/birthday) |
ident[ident_country_code] | Yes | Nationality of contact in alpha-2 format |
Update an existing contact
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/contacts/ATSAA:84F23FD1' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"contact": {
"name": "John Doee",
"email": "john@doee.com",
"phone": "+372.590146111"
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"contact": {
"code": "ATSAA:84F23FD1"
}
}
}
Update an existing contact
HTTP Request
PUT /repp/v1/contacts/:contact_id
URL Parameters
Parameter | Required | Description |
---|---|---|
contact_id | Yes | Contact ID |
Payload Parameters
Parameter | Required | Description |
---|---|---|
name | No | Full name of contact |
No | Email address of contact | |
phone | No | phone number of contact, with '.' as CC separator |
Check contact code availability
curl --location --request GET 'https://testrar.internet.ee/repp/v1/contacts/check/PUDERJAKAPSAS' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"contact": {
"code": "PUDERJAKAPSAS",
"available": true
}
}
}
Checks whether the contact code is available for custom use
HTTP Request
GET /repp/v1/contacts/check/:contact_id
URL Parameters
Parameter | Required | Description |
---|---|---|
contact_id | Yes | Contact ID to check |
Domains
Get all existing domains
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"new_domain": [
"www.ee"
],
"domains": [
"kass.ee",
"koer.ee",
],
"count": 69
}
}
When ?details=true is appended, it returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"new_domain": [
{
"name": "wwww.ee",
"registrant": {
"name": "Mary Änn O’Connež-Šuslik",
"code": "1111111:0FEEDC3C"
},
"created_at": "2022-06-15T16:04:07.042+03:00",
"updated_at": "2022-06-20T14:02:10.339+03:00",
"expire_time": "2022-12-16T00:00:00.000+02:00",
"outzone_at": "2022-06-20T14:02:10.304+03:00",
"delete_date": "2022-07-21",
"force_delete_date": null,
"contacts": [
{
"code": "1111111:65B7EB55",
"type": "AdminDomainContact",
"name": "Mary Änn O’Connež-Šuslik"
},
{
"code": "1111111:8E3736F2",
"type": "TechDomainContact",
"name": "Mary Änn O’Connež-Šuslik"
}
],
"nameservers": [
{
"id": 37,
"hostname": "ns1.oberbrunner.net",
"ipv4": [
"219.175.134.244"
],
"ipv6": [
"647B:275:536E:1C6B:8D51:5E15:D6F5:184A"
]
},
{
"id": 38,
"hostname": "ns2.kunze.org",
"ipv4": [
"134.156.204.100"
],
"ipv6": [
"A724:680A:9437:E459:A20D:5C53:DF42:CD5F"
]
}
],
"dnssec_keys": [
{
"id": 8,
"flags": 257,
"protocol": 3,
"alg": 8,
"public_key": "e087a47db0e31dbb162e4bb62da7a34322be3ff66fdcf65268225c4db3b37d79"
}
],
"statuses": {
"ok": "",
"pendingDelete": "",
"serverHold": ""
},
"registrar": {
"name": "Registrar",
"website": "https://regitrar.ee"
},
"dispute": false,
"transfer_code": "a39f33a5c6a5aa3ac44e625c9eaa7476"
}
],
"domains": [
{
"name": "kass.ee",
"registrant": {
"name": "KARL",
"code": "ATSAA:KARL"
},
"created_at": "2021-01-29T11:15:52.753+02:00",
"updated_at": "2021-01-29T11:15:52.753+02:00",
"expire_time": "2022-01-30T00:00:00.000+02:00",
"outzone_at": null,
"delete_date": null,
"force_delete_date": null,
"transfer_code": "378499652fe9f0075600bba06c3a2449",
"contacts": [
{
"code": "ATSAA:KARL",
"type": "AdminDomainContact",
"name": "KARL"
},
{
"code": "ATSAA:KARL",
"type": "TechDomainContact",
"name": "KARL"
}
],
"nameservers": [],
"dnssec_keys": [],
"statuses": {
"inactive": ""
},
"registrar": {
"name": "Kreative Digital OÜ",
"website": "https://kreative.ee"
},
"dispute": false,
"transfer_code": "2f81ec671b69a2aa5d6375631e259ae7",
},
{
"name": "koer.ee",
"registrant": "ATSAA:KARL",
"created_at": "2021-01-29T11:16:23.679+02:00",
"updated_at": "2021-01-29T11:16:23.679+02:00",
"expire_time": "2022-01-30T00:00:00.000+02:00",
"outzone_at": null,
"delete_date": null,
"force_delete_date": null,
"transfer_code": "669031afb3bf93a8df55d29e33debc8c",
"contacts": [
{
"code": "ATSAA:KARL",
"type": "AdminDomainContact"
},
{
"code": "ATSAA:KARL",
"type": "TechDomainContact"
}
],
"nameservers": [],
"dnssec_keys": [],
"statuses": {
"inactive": ""
},
"registrar": {
"name": "Kreative Digital OÜ",
"website": "https://kreative.ee"
},
"dispute": false,
"transfer_code": "asdf564cs89er3dg46d5f3v1df6534g3f2",
},
],
"count": 69
}
}
Gets all existing domains under current registrar account.
HTTP Request
GET /repp/v1/domains
URL Parameters
Parameter | Required | Default | Description |
---|---|---|---|
limit | No | 200 | How many objects to return |
offset | No | 0 | Object query offset |
details | No | false | Show full object of each domain |
Get a specific domain
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains/biz.ee' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "biz.ee",
"registrant": {
"name": "KARL",
"code": "ATSAA:749AA80F"
},
"created_at": "2021-01-15T12:07:20.079+02:00",
"updated_at": "2021-01-21T16:41:59.707+02:00",
"expire_time": "2023-01-16T00:00:00.000+02:00",
"outzone_at": null,
"delete_date": null,
"force_delete_date": null,
"contacts": [
{
"code": "ATSAA:C7A52A30",
"type": "AdminDomainContact",
"name": "KARL"
},
{
"code": "ATSAA:CC53EF9C",
"type": "TechDomainContact",
"name": "KARL"
}
],
"nameservers": [],
"dnssec_keys": [],
"statuses": {
"inactive": ""
},
"registrar": {
"name": "Kreative Digital OÜ",
"website": "https://kreative.ee"
},
"dispute": false,
"transfer_code": "2f81ec671b69a2aa5d6375631e259ae7",
}
}
}
Returns a specific domain object, even if it doesn't belong to your registrar account. If you aren't sponsoring registrar for the domain, transfer_code is omitted from the response.
HTTP Request
GET /repp/v1/domains/:domain_name
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Register a new domain
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"domain": {
"name": "kasskoer.ee",
"registrant": "ATSAA:KARL",
"period": 1,
"period_unit": "y",
"admin_contacts": [
"ATSAA:KARL"
],
"tech_contacts": [
"ATSAA:KARL"
],
"nameservers_attributes": [
{
"hostname": "ns1.kreative.ee"
},
{
"hostname": "ns2.kreative.ee"
}
]
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kasskoer.ee"
}
}
}
Register a new domain
HTTP Request
POST /repp/v1/domains
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
name | Yes | String | Domain name |
reserved_pw | No | String | Reserved password for domain |
transfer_code | No | String | Desired transfer code for domain |
registrant | Yes | String | Registrant contact code |
period_unit | Yes | String | Period unit. Can be year (y) or month (m) |
period | Yes | Integer | For how many period units to register domain |
admin_contacts | No | Array | Array of admin domain contact codes |
tech_contacts | No | Array | Array of tech domain contact codes |
nameservers_attributes | No | Array | Array of nameserver objects |
nameservers_attributes[hostname] | Yes | String | Hostname of nameserver |
nameservers_attributes[ipv4] | Yes | Array | Array of IPv4 attributes |
nameservers_attributes[ipv6] | Yes | Array | Array of IPv6 attributes |
dnskeys_attributes | No | Array | Array of DNSSEC key attributes |
dnskeys_attributes[flags] | Yes | String | 256 (KSK) or 257 (ZSK) |
dnskeys_attributes[protocol] | Yes | String | Key protocol (3) |
dnskeys_attributes[alg] | Yes | String | DNSSEC key algorithm (3,5,6,7,8,10,13,14) |
dnskeys_attributes[public_key] | Yes | String | DNSSEC public key |
Change domain registrant / Auth code
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/domains/kasskoer.ee' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"domain": {
"registrant": {
"code": "ATSAA:LIZ"
},
"transfer_code": "123"
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kasskoer.ee"
}
}
}
Changes domain registrant or auth code
HTTP Request
PUT /repp/v1/domains/:domain_name
URL Parameters
Parameter | Required | Type | Description |
---|---|---|---|
domain_name | Yes | String | Domain |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
registrant | Yes | Object | New registrant object |
registrant[code] | Yes | String | Contact ID of new registrant |
registrant[verified] | No | Boolean | Possible values are true / false. Defaults to false. Include it only if set to true. |
transfer_code | No | String | New EPP transfer code for domain |
Get all contacts of specific domain
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains/kasskoer.ee/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"admin_contacts": [
"1111111:65B7EB55"
],
"tech_contacts": [
"1111111:0FEEDC3C",
"1111111:65B7EB55"
]
}
}
Views domain's admin and tech contacts.
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Link new contact(s) to specific domain
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/kasskoer.ee/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"contacts": [
{
"code": "1111111:65B7EB55",
"type": "admin"
},
{
"code": "1111111:8E3736F2",
"type": "tech"
}
]
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kasskoer.ee"
}
}
}
Adds contact(s) to domain.
HTTP Request
POST /repp/v1/domains/:domain_name/contacts
URL Parameters
Parameter | Required | Type | Description |
---|---|---|---|
domain_name | Yes | String | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
contacts | Yes | Array | Array of contact objects |
contacts[code] | Yes | String | Code of contact |
contacts[type] | Yes | String | Type of contact. Can be 'admin' or 'tech' |
Remove contact(s) from specific domain
curl --location --request DELETE 'https://testrar.internet.ee/repp/v1/domains/kasskoer.ee/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"contacts": [
{
"code": "1111111:65B7EB55",
"type": "admin"
},
{
"code": "1111111:8E3736F2",
"type": "tech"
}
]
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kasskoer.ee"
}
}
}
Deletes contact(s) from domain.
HTTP Request
DELETE /repp/v1/domains/:domain_name/contacts
URL Parameters
Parameter | Required | Type | Description |
---|---|---|---|
domain_name | Yes | String | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
contacts | Yes | Array | Array of contact objects |
contacts[code] | Yes | String | Code of contact |
contacts[type] | Yes | String | Type of contact. Can be 'admin' or 'tech' |
Renew a specific domain
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/kasskoer.ee/renew' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"renews": {
"period": 1,
"period_unit": "y",
"exp_date": "2021-04-20"
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kasskoer.ee"
}
}
}
Renews current domain for desired period.
HTTP Request
POST /repp/v1/domains/:domain_name/renew
URL Parameters
Parameter | Required | Type | Description |
---|---|---|---|
domain_name | Yes | String | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
period_unit | Yes | String | Period unit. Can be year (y) or month (m) |
period | Yes | Integer | For how many period units to register domain |
exp_date | Yes | String | Current expiry date for domain (yyyy-mm-dd) |
Delete a specific domain
curl --location --request DELETE 'https://registry.test/repp/v1/domains/kanakotlet.ee' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"domain": {
"delete": {
"verified": false
}
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kanakotlet.ee"
}
}
}
Deletes a specific domain
HTTP Request
DELETE /repp/v1/domains/:domain_name
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Required Headers
Parameter | Required | Description |
---|---|---|
Auth-Code | No | domain's EPP transfer code |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
delete | Yes | Hash | Hash holding verified flag |
delete[verified] | Yes | Boolean | Whether to ask registrant confirmation or not |
Nameservers
Get domain's nameservers
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains/domeener.ee/nameservers' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"nameservers": [
{
"hostname": "ns1.domeener.ee",
"ipv4": ["192.168.1.1"],
"ipv6": ["fe80::aede:48ff:fe00:1122"]
},
{
"hostname": "ns2.domeener.ee",
"ipv4": ["192.168.1.2"],
"ipv6": ["fe80::aede:48ff:fe00:1123"]
},
]
}
}
Gets a specific domain's nameservers
HTTP Request
GET /repp/v1/domains/:domain_name/nameservers
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Add new nameserver
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/kotlet.ee/nameservers' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"nameservers": [
{
"hostname": "ns1.domainer.ee",
"ipv4": ["192.168.1.1", "192.168.1.2"],
"ipv6": ["2620:119:35::35", "2620:119:35::36"]
},
{
"hostname": "ns2.domainer.ee",
"ipv4": ["192.168.1.3", "192.168.1.4"],
"ipv6": ["2620:119:35::37", "2620:119:35::38"]
}
]
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "kotlet.ee"
}
}
}
Add new nameserver(s) to specific domain
HTTP Request
POST /repp/v1/domains/:domain_name/nameservers
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
nameservers | Yes | Array | Array of new nameserver objects |
nameservers[hostname] | Yes | Hostname of nameserver | |
nameservers[ipv4] | No | Array | Array of IPv4 addresses |
nameservers[ipv6] | No | Array | Array of IPv6 addresses |
Delete existing nameserver
curl --location --request DELETE 'https://testrar.internet.ee/repp/v1/domains/kotlet.ee/nameservers/ns3.domainer.ee' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "666.ee"
}
}
}
Delete existing nameserver from domain.
HTTP Request
DELETE /repp/v1/domains/:domain_name/nameservers/:nameserver_hostname
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
nameserver_hostname | Yes | nameserver hostname to delete |
DNSSEC
Get domain's DNSSEC keys
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains/666.ee/dnssec' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"dns_keys": [
{
"flags": 257,
"protocol": 3,
"alg": 13,
"public_key": "pubkeyhere"
}
]
}
}
Gets a specific domain's DNSSEC keys
HTTP Request
GET /repp/v1/domains/:domain_name/dnssec
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Add new DNSSEC key
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/666.ee/dnssec' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"dns_keys": [
{
"flags": "257",
"protocol": "3",
"alg": "8",
"public_key": "AwEAAddt2AkLfYGKgiEZB5SmIF8EvrjxNMH6HtxWEA4RJ9Ao6LCWheg8"
},
{
"flags": "257",
"protocol": "3",
"alg": "13",
"public_key": "mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ=="
}
]
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "666.ee"
}
}
}
Add new DNSSEC key(s) to specific domain
HTTP Request
POST /repp/v1/domains/:domain_name/dnssec
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
dns_keys | Yes | Array | Array of DNSSEC key objects |
dns_keys[flags] | Yes | String | 256 (KSK) or 257 (ZSK) |
dns_keys[protocol] | Yes | String | Key protocol (3) |
dns_keys[alg] | Yes | String | DNSSEC key algorithm (3,5,6,7,8,10,13,14) |
dns_keys[public_key] | Yes | String | DNSSEC public key |
Delete DNSSEC key
curl --location --request DELETE 'https://testrar.internet.ee/repp/v1/domains/666.ee/dnssec' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"dns_keys": [
{
"flags": "257",
"protocol": "3",
"alg": "8",
"public_key": "AwEAAddt2AkLfYGKgiEZB5SmIF8EvrjxNMH6HtxWEA4RJ9Ao6LCWheg8"
}
]
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "666.ee"
}
}
}
Deletes one or many DNSSEC key(s) for specific domain.
HTTP Request
DELETE /repp/v1/domains/:domain_name/dnssec
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
dns_keys | Yes | Array | Array of DNSSEC key objects |
dns_keys[flags] | Yes | String | 256 (KSK) or 257 (ZSK) of existing DNSSEC key |
dns_keys[protocol] | Yes | String | Key protocol of existing DNSSEC key |
dns_keys[alg] | Yes | String | DNSSEC key algorithm of existing DNSSEC key |
dns_keys[public_key] | Yes | String | Public key of existing DNSSEC key |
Statuses
Add clientHold to domain
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/domains/biz.ee/statuses/clientHold' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": "biz.ee",
"status": "clientHold"
}
}
Adds a clientHold status to a specific domain
HTTP Request
PUT /repp/v1/domains/:domain_name/statuses/clientHold
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Remove clientHold from domain
curl --location --request DELETE 'https://testrar.internet.ee/repp/v1/domains/biz.ee/statuses/clientHold' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {}
}
Removes clientHold status from specific domain
HTTP Request
DELETE /repp/v1/domains/:domain_name/statuses/clientHold
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Transfers
Get transfer info
curl --location --request GET 'https://testrar.internet.ee/repp/v1/domains/kotlet.ee/transfer_info' \
--header 'Auth-Code: 6699fb661ee3a2006a3d1e5833d7c5abv' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--data-raw ''
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": "kotlet.ee",
"registrant": {
"code": "ATSAA:E36957D7",
"phone": "+372.xxx",
"email": "xxx",
"ident": "xxx",
"ident_type": "priv",
"name": "xxx",
"ident_country_code": "EE",
"city": null,
"street": null,
"zip": null,
"country_code": null,
"statuses": [
"ok",
"linked"
]
},
"admin_contacts": [
{
"code": "ATSAA:E36957D7",
"phone": "+372.xxx",
"email": "xxx",
"ident": "xxx",
"ident_type": "priv",
"name": "xxx",
"ident_country_code": "EE",
"city": null,
"street": null,
"zip": null,
"country_code": null,
"statuses": [
"ok",
"linked"
]
}
],
"tech_contacts": [
{
"code": "ATSAA:E36957D7",
"phone": "+372.xxx",
"email": "xxx",
"ident": "xxx",
"ident_type": "priv",
"name": "xxx",
"ident_country_code": "EE",
"city": null,
"street": null,
"zip": null,
"country_code": null,
"statuses": [
"ok",
"linked"
]
}
]
}
}
Gets a specific domain's transfer info
HTTP Request
GET /repp/v1/domains/:domain_name/transfer_info
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Required Headers
Submit domain's EPP authorization code if domain doesn't belong to you (yet)
Parameter | Required | Description |
---|---|---|
Auth-Code | No | Queried domain's EPP authorization code |
Transfer domain
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/666.ee/transfer' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"transfer": {
"transfer_code": "d79d865fdf589a1cd52ae95fde4e5d30"
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"domain": {
"name": "666.ee",
"type": "domain_transfer"
}
}
}
Transfers domain from another registrar to your account.
HTTP Request
POST /repp/v1/domains/:domain_name/transfer
URL Parameters
Parameter | Required | Description |
---|---|---|
domain_name | Yes | Domain name |
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
transfer | Yes | Object | Object holding transfer elements |
transfer[transfer_code] | Yes | String | EPP authorization code |
Bulk actions
Bulk domain transfer
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/transfer' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"domain_transfers": [
{
"domain_name": "domain1.ee",
"transfer_code": "a45e543ddabee202f95eebae5a7c917c"
},
{
"domain_name": "domain2.ee",
"transfer_code": "cce67ca63adc8c2938f199f10108881e"
}
]
}
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"success": [
{
"type": "domain_transfer",
"domain_name": "domain1.ee"
},
{
"type": "domain_transfer",
"domain_name": "domain2.ee"
}
],
"failed": []
}
}
Transfers multiple domains from another registrar to your account.
HTTP Request
POST /repp/v1/domains/transfer
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
data | Yes | Object | Object holding domain_transfers array |
data[domain_transfers] | Yes | Array | Array of domain transfer objects |
data[domain_transfers][domain_name] | Yes | String | Domain name |
data[domain_transfers][transfer_code] | Yes | String | EPP authorization code |
Bulk tech contact replace
curl --location --request PATCH 'https://testrar.internet.ee/repp/v1/domains/contacts' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"current_contact_id": "ATSAA:B839862D",
"new_contact_id": "ATSAA:KARL"
}'
The above command returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"affected_domains": [],
"skipped_domains": []
}
}
Cycles through every domain and replaces specific tech contact with another one.
HTTP Request
PATCH /repp/v1/domains/contacts
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
current_contact_id | Yes | String | Tech contact ID you wish to replace |
new_contact_id | Yes | String | New contact ID to assign as tech contact |
Bulk nameserver change
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/registrar/nameservers' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"type": "nameserver",
"id": "ns1.domainer.ee",
"attributes": {
"hostname": "ns1.ams1.domainer.ee",
"ipv4": ["192.168.1.1"],
"ipv6": ["2620:119:35::36"]
}
}
}'
If you want to replace nameserver only for specific domains, submit scoped "domains" array like that:
curl --location --request PUT 'https://testrar.internet.ee/repp/v1/registrar/nameservers' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"type": "nameserver",
"id": "ns1.ams1.domainer.ee",
"domains": ["only.ee", "these.ee", "domains.ee"],
"attributes": {
"hostname": "ns2.ams1.domainer.ee",
"ipv4": ["192.168.1.1"],
"ipv6": ["2620:119:35::36"]
}
}
}'
Both commands above return JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"type": "nameserver",
"id": "ns1.ams1.domainer.ee",
"attributes": {
"hostname": "ns1.ams1.domainer.ee",
"ipv4": [
"192.168.1.1"
],
"ipv6": [
"2620:119:35::36"
]
},
"affected_domains": [
"only.ee",
"these.ee",
"domains.ee"
],
"skipped_domains": []
}
}
Cycles through every domain and replaces their specific nameserver with new data. The new new hostname of the nameserver must be different. It's not possible to change existing nameserver's IPv4 / IPv6 addresses with this request.
HTTP Request
PUT /repp/v1/registrar/nameservers
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
data | Yes | Object | Object holding nameserver changes |
data[type] | Yes | String | Always set it as "nameserver" |
data[id] | Yes | String | Hostname of replacable nameserver |
data[domains] | No | Array | Array of domain names qualified for nameserver replacement. |
data[attributes] Yes | Object | Object holding new nameserver values | |
data[attributes][hostname] | Yes | String | New hostname of nameserver |
data[attributes][ipv4] | No | Array | Array of nameserver's fixed IPv4 addresses |
data[attributes][ipv6] | No | Array | Array of nameserver's fixed IPv6 addresses |
Bulk domain renew
curl --location --request POST 'https://testrar.internet.ee/repp/v1/domains/renew/bulk' \
--header 'Authorization: Basic dGVzdDp0ZXN0MTIz' \
--header 'Content-Type: application/json' \
--data-raw '{
"domains": ["kotlet.ee", "kasskoer.ee"],
"renew_period": "1y"
}'
Command above returns JSON structured like this:
{
"code": 1000,
"message": "Command completed successfully",
"data": {
"updated_domains": [
"kotlet.ee",
"kasskoer.ee"
]
}
}
Renews multiple domanins at once, for a fixed period.
HTTP Request
POST /repp/v1/domains/renew/bulk
Payload Parameters
Parameter | Required | Type | Description |
---|---|---|---|
domains | Yes | Array | Array of domain names for renewal |
renew_period | Yes | String | Period for domain renew (3m, 6m, 9m, 1y ... 10y) |
Errors
The REPP API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- Your API key is wrong. |
403 | Forbidden -- The requested object is hidden for administrators only. |
404 | Not Found -- The specified object could not be found. |
405 | Method Not Allowed -- You tried to access a object with an invalid method. |
406 | Not Acceptable -- You requested a format that isn't json. |
410 | Gone -- The requested object has been removed from our servers. |
418 | I'm a teapot. |
429 | Too Many Requests -- You're requesting too many objects! Slow down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |