Skip to content

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=true the 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 ​

FieldTypeDescription
emailstringUnique email address with DNS verification (max 255 chars).
phonestringUnique phone number in international format with country code (e.g., +421901234567). See Phone Numbers.
passwordstringPassword (min 8 chars, must include letters and numbers).
passwordConfirmationstringMust match password.
firstNamestringExpert's first name.
lastNamestringExpert's last name.
nationalitystringISO 3166-1 Alpha-2 nationality code (e.g., SK).
dateOfBirthobjectDate of birth object (see below).
billingAddressobjectBilling address object (see below).
companyobjectCompany information object (see below).
bankAccountobjectBank account object (see below).
registrationNumberstringExpert's professional registration number.
regionsarrayArray of region codes (min: 1, max: 8). See Regions.
newsletterSubscribedbooleanSubscribe to newsletters (true or false).
termsAgreedbooleanMust be true to accept terms of service.
verificationDocumentFrontfileFront of ID document (JPEG, PNG, JPG, max 10MB).
verificationDocumentBackfileBack of ID document (JPEG, PNG, JPG, max 10MB).
turnstileTokenstringCloudflare Turnstile verification token.

Date of Birth Object ​

FieldTypeDescription
dayintegerDay of month (1-31).
monthintegerMonth (1-12).
yearintegerYear 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.

json
{
  "day": 15,
  "month": 6,
  "year": 1985
}

Address Object ​

FieldTypeRequiredDescription
firstNamestringNoContact's first name (for shipping addresses only).
lastNamestringNoContact's last name (for shipping addresses only).
line1stringYesStreet address (e.g., "Trieda Andreja Hlinku"). Max 255 characters.
line2stringYesAdditional address info (e.g., unit number). Must be a non-empty string — "" and null are rejected. Max 255 characters.
citystringYesCity name. Max 255 characters.
postalCodestringYesPostal code. Max 255 characters.
countrystringYesISO 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 firstName and lastName fields for delivery contact
  • Checkout Address: All fields have a maximum length of 255 characters

Example (Shipping Address):

json
{
  "firstName": "Anton",
  "lastName": "Čomáš",
  "line1": "Trieda Andreja Hlinku",
  "line2": "1/14A",
  "city": "Nitra",
  "postalCode": "949 01",
  "country": "SK"
}

Example (Billing Address):

json
{
  "line1": "Trieda Andreja Hlinku",
  "line2": "1/14A",
  "city": "Nitra",
  "postalCode": "949 01",
  "country": "SK"
}

Company Object ​

For expert registration, the company object accepts:

FieldTypeDescription
businessIdstring, nullableBusiness ID (IČO). Optional.
taxIdstringTax ID (DIČ).
vatIdstring, nullableVAT ID (IČ DPH), if applicable.

Bank Account Object ​

For expert registration, only IBAN is required:

FieldTypeDescription
ibanstringSlovak IBAN (must start with SK, 24 characters).

Regions ​

Experts must select 1-8 Slovak regions where they provide services:

CodeRegion
baBratislavský kraj
bbBanskobystrický kraj
keKošický kraj
nrNitriansky kraj
poPrešovský kraj
tnTrenčiansky kraj
ttTrnavský kraj
zaŽilinský kraj

Example Request ​

json
{
  "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

json
{
  "data": {
    "token": "5|mK2jX9nNwZ7vB4fQpR3tYhD8cS5aL1uE0iO6nM9vA3e1f7g2"
  }
}

The token is a Bearer token that must be included in the Authorization header for all authenticated requests:

plaintext
Authorization: Bearer 3|4UgEk8lXwa1D6rbYO8fqMfKhgnwdRuSqZb4Woz083ad0785f

Note: 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

json
{
  "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

json
{
  "message": "Access denied for authenticated users."
}