Download OpenAPI specification:Download
This API allows the Business Registry (Ariregister) to reserve .ee domain names
on behalf of entrepreneurs during the company registration process.
| Term | Description |
|---|---|
| Registration code (password) | A unique secret code returned when a domain is reserved. The entrepreneur must provide this code to an accredited .ee registrar to complete the domain registration via the EPP protocol. Without this code, the domain cannot be registered. |
| user_unique_id | A 10-character identifier generated for each reservation request. It links a user session to their reserved domains. Must be stored by the Business Registry portal to retrieve reservation details later. |
| invoice_number | An invoice identifier generated by the billing system for paid (long-term) reservations. Must be stored together with user_unique_id to check payment status. |
| linkpay_url | A one-time Everypay payment page URL. The Business Registry portal should redirect the user to this URL to complete the payment. No automatic callback redirect — use the status endpoint to poll for payment completion. |
| reference_no | Estonian payment reference number (viitenumber) generated for each paid (long-term) reservation invoice. The payer must put it into the reference number field (or the payment description) of a bank transfer so that the payment is matched to the invoice. |
The Business Registry portal sends the organization name to the API.
The API generates domain variants (with and without hyphens, across all .ee zones),
removes common legal forms (AS, OU, FIE, MTU, etc.), checks availability in the domain registry,
and returns only the domains that are both unregistered and not already reserved.
Endpoint: GET /api/v1/business_registry/domain_names/{organization_name}
The user picks one or more domain names from the suggestions. The Business Registry portal sends them to one of the reservation endpoints:
POST /api/v1/business_registry/reserve_domainspassword) for each domainuser_unique_id to retrieve reservation details laterPOST /api/v1/business_registry/long_reserve_domainslinkpay_url), a payment reference number (reference_no) and a due date (due_date)pending status until payment is completedinvoice_number and user_unique_id to check payment status laterlinkpay_url (Everypay) or by bank transfer to the IBAN shown on the invoice PDF, with reference_no as the reference numbercancelled) and the payment is refundedGET /api/v1/business_registry/reserve_domains/{user_unique_id}GET /api/v1/business_registry/long_reserve_domains_status?invoice_number=...&user_unique_id=...paid, the response includes registration codes for each domainThe Business Registry portal can download a printable invoice as a PDF both before and after payment. Before payment the PDF is the invoice for a bank transfer (IBAN, reference number, due date, amount due); after payment it shows the invoice as paid.
GET /api/v1/business_registry/reserved_domains_invoice_pdf?invoice_number=...&user_unique_id=...private_individual=true for
physical persons) can be passed as query parameters so the invoice recipient
block is filled in by the Business Registry422 if the invoice is cancelled, 502 if the billing backend is
unreachableThe entrepreneur takes the registration code (password) to any accredited .ee registrar
and registers the domain via the EPP protocol. Once registered, the domain is removed
from the reserved list.
Both status endpoints (/reserve_domains/{user_unique_id} and /long_reserve_domains_status)
return a status field for each domain, allowing the Business Registry portal to show
only the domains that still need action:
| Status | Meaning | Fields present |
|---|---|---|
reserved |
Domain is reserved and waiting for registration | name, status, password, expire_at |
registered |
Domain has been registered through a registrar | name, status |
expired |
Reservation has expired (domain is no longer held) | name, status |
Typical usage: Filter the response to show only domains with status: "reserved" —
these are the domains the user still needs to register.
user_unique_idAll endpoints require two forms of authentication:
Authorization header must contain a valid API tokenAuthorization: Bearer <your-api-token>
[\p{L}\p{N}\-\.]+ (letters, numbers, hyphens, dots)[\p{L}\p{N}\s\-]+Generates domain name variants based on the organization name and returns only those that are currently available for registration.
How it works:
examplecompany) and hyphenated (example-company).ee zone originsNote: Expired reservations are automatically cleaned up during the availability check, so a previously reserved domain may become available again after its reservation period ends.
| organization_name required | string <= 100 characters ^[\p{L}\p{N}\s\-]+$ Example: Example Company OU Name of the organization to generate domain variants for. Common legal forms (AS, OU, FIE, MTU, etc.) are automatically removed before generating variants. |
curl -sS \ -H "Authorization: Bearer ${TOKEN}" \ "https://testadm.internet.ee/api/v1/business_registry/domain_names/Example%20Company%20OU"
{- "variants": [
- "examplecompany.ee",
- "example-company.ee"
]
}Creates free short-term domain reservations (7 days). Reserved domains receive a unique
registration code (password) that the entrepreneur must use to register the domain
at an accredited .ee registrar.
Important behaviors:
422 error is returnedWhat to store: Save the user_unique_id from the response. You will need it to retrieve
the registration codes later via GET /reserve_domains/{user_unique_id}.
| domain_names required | Array of strings [ 1 .. 20 ] items Array of domain names to reserve. Must include the zone (e.g., |
{- "domain_names": [
- "examplecompany.ee",
- "example-company.ee"
]
}{- "message": "Domains reserved successfully",
- "reserved_domains": [
- {
- "name": "examplecompany.ee",
- "password": "0b23bf0decfb2724ebd37e46715b63d8",
- "expire_at": "2025-03-13T14:30:00.000+02:00"
}, - {
- "name": "example-company.ee",
- "password": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
- "expire_at": "2025-03-13T14:30:00.000+02:00"
}
], - "user_unique_id": "f8d51313-b"
}Retrieves the current state of domains from a short-term (free) reservation.
Each domain in the response includes a status field that reflects its current state:
reserved — Domain is still reserved. The response includes the password (registration code)
and expire_at date. The entrepreneur can use the registration code to register the domain at a registrar.registered — Domain has already been registered through a registrar using the registration code.
No password or expire_at is returned.expired — The 7-day reservation period has ended. The domain is no longer held and may be
taken by someone else. No password or expire_at is returned.Typical usage: Display only domains with status: "reserved" to the user —
these are the ones that still need to be registered at a registrar.
Note: For long-term (paid) reservations, use
GET /api/v1/business_registry/long_reserve_domains_status instead.
| user_unique_id required | string Example: f8d51313-b The unique identifier returned in the |
curl -sS \ -H "Authorization: Bearer ${TOKEN}" \ "https://testadm.internet.ee/api/v1/business_registry/reserve_domains/f8d51313-b"
[- {
- "name": "examplecompany.ee",
- "status": "reserved",
- "password": "0b23bf0decfb2724ebd37e46715b63d8",
- "expire_at": "2025-03-13T14:30:00.000+02:00"
}, - {
- "name": "example-company.ee",
- "status": "reserved",
- "password": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
- "expire_at": "2025-03-13T14:30:00.000+02:00"
}
]Creates a paid long-term domain reservation (1 year). This endpoint does not reserve the domains immediately — it creates an invoice and returns a payment link.
Flow:
linkpay_url, invoice_number, user_unique_id, reference_no and due_datelinkpay_url to complete payment in Everypay, or give the user
the invoice PDF (GET /reserved_domains_invoice_pdf) to pay by bank transfer using reference_noGET /long_reserve_domains_status?invoice_number=...&user_unique_id=... to check payment statusImportant behaviors:
available_domains field in the response shows which domains were actually includedWhat to store: Save both invoice_number and user_unique_id — they are required
to check payment status and retrieve registration codes later.
| domain_names required | Array of strings [ 1 .. 20 ] items Array of domain names to reserve. Must include the zone (e.g., |
{- "domain_names": [
- "examplecompany.ee",
- "example-company.ee"
]
}{- "message": "Domains are in pending status. Need to pay for domains.",
- "invoice_number": 1234567,
- "user_unique_id": "a1b2c3d4e5",
- "reference_no": "3656985",
- "due_date": "2026-11-15",
- "available_domains": [
- "examplecompany.ee",
- "example-company.ee"
]
}Checks the payment status of a long-term domain reservation invoice and returns registration codes once paid.
How to use:
status changes to paid, the registration codes are availablereserved_domains array to the user, filtering by status: "reserved"Response variants:
paid — Invoice is paid. The response includes reserved_domains with registration codes
and domain statuses (reserved, registered, or expired).pending, unpaid, failed, error, cancelled) — Invoice is not yet paid.
The response includes the names array (plain list of domain names without registration codes).Side effect: When the invoice status is paid, calling this endpoint also triggers
the creation of reserved domain records if they haven't been created yet (idempotent operation).
Note: For short-term (free) reservations, use
GET /api/v1/business_registry/reserve_domains/{user_unique_id} instead.
| invoice_number required | string Example: invoice_number=1234567 Invoice number returned by |
| user_unique_id required | string Example: user_unique_id=a1b2c3d4e5 Unique identifier returned by |
curl -sS \ -H "Authorization: Bearer ${TOKEN}" \ -G "https://testadm.internet.ee/api/v1/business_registry/long_reserve_domains_status" \ --data-urlencode "invoice_number=1234567" \ --data-urlencode "user_unique_id=a1b2c3d4e5"
{- "status": "paid",
- "message": "Payment received",
- "reserved_domains": [
- {
- "name": "examplecompany.ee",
- "status": "reserved",
- "password": "0b23bf0decfb2724ebd37e46715b63d8",
- "expire_at": "2026-03-06T14:30:00.000+02:00"
}, - {
- "name": "example-company.ee",
- "status": "reserved",
- "password": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
- "expire_at": "2026-03-06T14:30:00.000+02:00"
}
]
}Generates and returns a PDF invoice for a long-term (paid) domain reservation. The PDF is produced on the fly — the registry does not persist it.
Preconditions:
pending (not paid yet) or paid. A cancelled or failed
invoice returns 422 Unprocessable Entity.invoice_number + user_unique_id pair must match an existing invoice,
otherwise 404 Not Found is returned.PDF layout:
The PDF header shows the invoice number and the EIS logo. The details block
contains the invoice number, invoice date (Arve kuupäev), due date (Maksetähtaeg),
payment reference number (Viitenumber) and payment status (Makse staatus:
Tasumata before payment, Tasutud after payment). The customer block
(Arve saaja) shows name, address and VAT number. The main table lists the
domain names with their status (Ootab tasumist before payment, Reserveeritud
after payment) and price, followed by "Ridade summa", "Käibemaks" (VAT, rate read
from registry settings), "Summa kokku" and either "Tasuda" (amount due, before
payment) or "Tasutud summa" (amount paid).
The footer lists EIS's own billing details (juridical name, address, reg. no,
VAT, contacts, bank/IBAN/SWIFT). To pay by bank transfer, use the IBAN from the
footer and the reference number from the details block.
An unpaid invoice also contains a notice (in Estonian and English) that issuing the
invoice does not guarantee the reservation: reservation is first-come-first-served,
and if it is no longer possible when the payment arrives, the invoice is cancelled
and the payment is refunded.
Customer details (optional query parameters):
The Business Registry passes the customer name, address and VAT number as
query parameters so that the PDF reflects the actual invoice recipient.
If these are omitted, placeholders ([Kliendi nimi], [Kliendi aadress],
[Kliendi VAT number]) are rendered. For private individuals, pass
private_individual=true — the customer block is replaced with the single
word eraisik and the other customer fields are ignored.
Response: Binary PDF with Content-Type: application/pdf and
Content-Disposition: attachment; filename="invoice-<invoice_number>.pdf".
| invoice_number required | string Example: invoice_number=1234567 Invoice number returned by |
| user_unique_id required | string Example: user_unique_id=a1b2c3d4e5 Unique identifier returned by |
| customer_name | string Example: customer_name=Acme OÜ Customer legal name shown in the "Arve saaja" block.
Ignored when |
| customer_address | string Example: customer_address=Tartu mnt 1, Tallinn Customer address. Ignored when |
| customer_vat_no | string Example: customer_vat_no=EE123456789 Customer VAT / KMKR number. Ignored when |
| private_individual | boolean When |
curl -sS \ -H "Authorization: Bearer ${TOKEN}" \ -o invoice.pdf \ "https://testadm.internet.ee/api/v1/business_registry/reserved_domains_invoice_pdf?invoice_number=1234567&user_unique_id=a1b2c3d4e5"
{- "error": "Unauthorized"
}