Skip to content

Languages

Language management endpoints.

Base path: /api/v1/languages


List Languages

GET /api/v1/languages

Required permission: languages:read

Query parameters

Parameter Type Default Description
page int 1 Page number
per_page int 20 Items per page
code string Filter by language code (case-insensitive)
name string Filter by language name (case-insensitive)
is_active boolean Filter by active status

Response 200 OK

{
  "data": [
    {
      "id": "uuid",
      "code": "en",
      "name": "English",
      "is_default": true,
      "is_active": true,
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": null
    }
  ],
  "pagination": {
    "total": 3,
    "page": 1,
    "per_page": 20,
    "pages": 1,
    "has_next": false,
    "has_prev": false
  }
}


Get Active Languages

Returns only active languages. No pagination — intended for use in dropdowns and selectors.

GET /api/v1/languages/active

Required permission: languages:read

Response 200 OK

[
  {
    "id": "uuid",
    "code": "en",
    "name": "English",
    "is_default": true,
    "is_active": true
  }
]


Create Language

POST /api/v1/languages

Required permission: languages:create

Request body

{
  "code": "sr",
  "name": "Serbian",
  "is_default": false,
  "is_active": true
}

Field Type Required Constraints
code string 2–10 characters
name string 2–100 characters
is_default bool Default: false
is_active bool Default: true

Response 201 Created — full LanguageResponse object.

Info

If this is the first language created, it is automatically set as default regardless of the is_default field. If is_default is true, all other languages lose their default status.

Errors

Status Description
409 Language code already exists

Get Language

GET /api/v1/languages/{id}

Required permission: languages:read

Response 200 OK — full LanguageResponse object.

Errors

Status Description
404 Language not found

Update Language

PATCH /api/v1/languages/{id}

Required permission: languages:update

Request body — all fields optional

{
  "name": "Serbian (Latin)",
  "is_active": false
}

Response 200 OK — updated LanguageResponse object.

Errors

Status Description
400 Cannot deactivate the default language
404 Language not found

Set Default Language

Sets a language as the system default. Only one language can be default at a time.

POST /api/v1/languages/{id}/set-default

Required permission: languages:update

Response 200 OK — updated LanguageResponse object.

Errors

Status Description
400 Language is already the default
400 Cannot set inactive language as default
404 Language not found

Delete Language

Soft-deletes a language.

DELETE /api/v1/languages/{id}

Required permission: languages:delete

Response 204 No Content

Errors

Status Description
400 Cannot delete the default language
404 Language not found