Register Expert
Registers a new expert with complete business details, identity verification, and returns an authentication token.
Important: Expert registration requires significantly more information than client registration, including business details, bank account, identity documents, and service regions.
Sandbox: when
APP_SANDBOX=truethe expert is approved automatically right after registration, exactly as after Stripe verifies the account — the approval email is sent, the expert can create offers that clients see, and Toggle Expert Approval can revoke it again. The email verification flow is unchanged.
Bot Protection
This endpoint requires a valid Cloudflare Turnstile token when bot protection is enabled. See the Turnstile Integration Guide for frontend setup instructions.
HTTP Request
POST /api/v1/auth/register/expert
This endpoint requires multipart/form-data encoding due to file uploads.
Required Fields
| Field | Type | Description |
|---|---|---|
email | string | Unique email address with DNS verification (max 255 chars). |
phone | string | Unique phone number in international format with country code (e.g., +421901234567). See Phone Numbers. |
password | string | Password (min 8 chars, must include letters and numbers). |
passwordConfirmation | string | Must match password. |
firstName | string | Expert's first name. |
lastName | string | Expert's last name. |
nationality | string | ISO 3166-1 Alpha-2 nationality code (e.g., SK). |
dateOfBirth | object | Date of birth object (see below). |
billingAddress | object | Billing address object (see below). |
company | object | Company information object (see below). |
bankAccount | object | Bank account object (see below). |
registrationNumber | string | Expert's professional registration number. |
regions | array | Array of region codes (min: 1, max: 8). See Regions. |
newsletterSubscribed | boolean | Subscribe to newsletters (true or false). |
termsAgreed | boolean | Must be true to accept terms of service. |
verificationDocumentFront | file | Front of ID document (JPEG, PNG, JPG, max 10MB). |
verificationDocumentBack | file | Back of ID document (JPEG, PNG, JPG, max 10MB). |
turnstileToken | string | Cloudflare Turnstile verification token. |
Date of Birth Object
| Field | Type | Description |
|---|---|---|
| day | integer | Day of month (1-31). |
| month | integer | Month (1-12). |
| year | integer | Year of birth (1920 or later). |
The three parts must form a valid calendar date and the person must be at least 18 years old; otherwise the request fails with 422 on the dateOfBirth field.
{
"day": 15,
"month": 6,
"year": 1985
}Address Object
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | No | Contact's first name (for shipping addresses only). |
lastName | string | No | Contact's last name (for shipping addresses only). |
line1 | string | Yes | Street address (e.g., "Trieda Andreja Hlinku"). Max 255 characters. |
line2 | string | Yes | Additional address info (e.g., unit number). Must be a non-empty string — "" and null are rejected. Max 255 characters. |
city | string | Yes | City name. Max 255 characters. |
postalCode | string | Yes | Postal code. Max 255 characters. |
country | string | Yes | ISO 3166-1 Alpha-2 country code (e.g., SK, CZ, HU). |
Address Types
- Billing Address: Contains core address fields only (no name fields)
- Shipping Address: Includes optional
firstNameandlastNamefields for delivery contact - Checkout Address: All fields have a maximum length of 255 characters
Example (Shipping Address):
{
"firstName": "Anton",
"lastName": "Čomáš",
"line1": "Trieda Andreja Hlinku",
"line2": "1/14A",
"city": "Nitra",
"postalCode": "949 01",
"country": "SK"
}Example (Billing Address):
{
"line1": "Trieda Andreja Hlinku",
"line2": "1/14A",
"city": "Nitra",
"postalCode": "949 01",
"country": "SK"
}Company Object
For expert registration, the company object accepts:
| Field | Type | Description |
|---|---|---|
businessId | string, nullable | Business ID (IČO). Optional. |
taxId | string | Tax ID (DIČ). |
vatId | string, nullable | VAT ID (IČ DPH), if applicable. |
Bank Account Object
For expert registration, only IBAN is required:
| Field | Type | Description |
|---|---|---|
iban | string | Slovak IBAN (must start with SK, 24 characters). |
Regions
Experts must select 1-8 Slovak regions where they provide services:
| Code | Region |
|---|---|
ba | Bratislavský kraj |
bb | Banskobystrický kraj |
ke | Košický kraj |
nr | Nitriansky kraj |
po | Prešovský kraj |
tn | Trenčiansky kraj |
tt | Trnavský kraj |
za | Žilinský kraj |
Example Request
{
"email": "expert@example.com",
"phone": "+421901234567",
"password": "SecurePass123",
"passwordConfirmation": "SecurePass123",
"firstName": "Ján",
"lastName": "Novák",
"nationality": "SK",
"dateOfBirth": {
"day": 15,
"month": 6,
"year": 1985
},
"billingAddress": {
"line1": "Trieda Andreja Hlinku 1",
"line2": "14A",
"city": "Nitra",
"postalCode": "949 01",
"country": "SK"
},
"company": {
"businessId": "12345678",
"taxId": "2023456789",
"vatId": "SK2023456789"
},
"bankAccount": {
"iban": "SK3112000000198742637541"
},
"registrationNumber": "REG123456",
"regions": ["nr", "tt", "ba"],
"newsletterSubscribed": true,
"termsAgreed": true,
"verificationDocumentFront": <file>,
"verificationDocumentBack": <file>
}Note: When sending as
multipart/form-data, nested objects should be sent as JSON strings or flattened fields (e.g.,dateOfBirth[day]=15).
Response
201 Created
{
"data": {
"token": "5|mK2jX9nNwZ7vB4fQpR3tYhD8cS5aL1uE0iO6nM9vA3e1f7g2"
}
}The token is a Bearer token that must be included in the Authorization header for all authenticated requests:
Authorization: Bearer 3|4UgEk8lXwa1D6rbYO8fqMfKhgnwdRuSqZb4Woz083ad0785fNote: After registration, a verification email is sent. The expert receives immediate API access with the token, but may need email verification for certain account features. Identity documents are reviewed before the expert can accept testimonies.
Error Handling
For invalid data:
422 Unprocessable Entity
{
"message": "E-mail musí byť platná emailová adresa. (a 4 ďalších chýb)",
"errors": {
"email": [
"E-mail musí byť platná emailová adresa."
],
"phone": [
"Telefónne číslo už existuje."
],
"password": [
"Heslo musí mať minimálne 8 znakov.",
"Musíte potvrdiť Heslo."
],
"termsAgreed": [
"Súhlas s podmienkami musí byť akceptovaný."
],
"bankAccount.iban": [
"IBAN musí byť platný slovenský IBAN."
]
}
}If a user is already authenticated:
403 Forbidden
{
"message": "Access denied for authenticated users."
}