5.3 KiB
Specialty API
Prefix:
/api/v1/specialties,/api/v1/admin/specialty
GET /api/v1/specialties
List all medical specialties.
Permission: PUBLIC
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
parent_id |
integer | ❌ | Filter to sub-specialties of a parent |
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "قلب و عروق",
"slug": "ghalb-va-oroug",
"parent_id": null,
"status": "active",
"weight": 10
},
{
"id": 5,
"name": "فوق تخصص قلب",
"slug": "fowgh-takhassos-ghalb",
"parent_id": 1,
"status": "active",
"weight": 5
}
]
}
GET /api/v1/specialties/doctor-counts
List active specialties together with the number of doctors in each — optionally scoped to a city. Used by the public /specialties page to show «N پزشک» under each specialty.
Permission: PUBLIC
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
city_id |
integer | ❌ | Count only doctors in this city (the categories.id of the city). Omit for a global count. |
Response 200
{
"success": true,
"data": [
{
"id": 2,
"name": "داخلی عمومی",
"slug": "...",
"parent_id": null,
"status": "active",
"weight": 10,
"number_of_doctors": 10
}
]
}
- Returns all active specialties; those with no doctors have
number_of_doctors: 0. number_of_doctorscounts distinct doctors joined throughdoctor_specialties(anddoctor_citieswhencity_idis given), matching the publicGET /api/v1/doctors?specialty_id=&city_id=filter.
GET /api/v1/admin/specialties
List all specialties with pagination (admin view — includes inactive).
Permission: ROLE_ADMIN
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
page |
integer | ❌ | Default: 1 |
limit |
integer | ❌ | Default: 20 |
search |
string | ❌ | Matches name, slug, or the parent specialty's name (case-insensitive LIKE) |
sort / order |
string | ❌ | sort=id with order=asc|desc; otherwise ordered by weight then name |
Response 200
{
"success": true,
"data": [
{ "id": 12, "uuid": "…", "name": "لیزر درمانی", "slug": "laser", "status": 1, "weight": 0,
"parent_id": 3, "parent_name": "پوست و مو" }
],
"meta": { "totalRecords": 50, "totalPages": 3, "currentPage": 1 }
}
parent_nameis admin-list only — the publicGET /api/v1/specialtiesdoes not return it. It exists because searching by parent can return a child whose parent is not on the current page, so the client cannot resolve the name from its own list.
Errors
| Code | HTTP | Description |
|---|---|---|
ERR_AUTH_001 |
401 | Missing token |
ERR_AUTH_006 |
403 | Not admin |
POST /api/v1/admin/specialty
Create a new specialty.
Permission: ROLE_ADMIN
Request Body (application/json)
{
"name": "قلب و عروق",
"slug": "ghalb-va-oroug",
"parent_id": null,
"status": "active",
"weight": 10
}
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | ✅ | Specialty name |
slug |
string | ❌ | Auto-generated from name if omitted |
parent_id |
integer | ❌ | Parent specialty ID (for sub-specialties) |
status |
string | ❌ | "active" (default) or "inactive" |
weight |
integer | ❌ | Sort weight |
Response 201
Specialty object.
Errors
| Code | HTTP | Description |
|---|---|---|
ERR_AUTH_001 |
401 | Missing token |
ERR_AUTH_006 |
403 | Not admin |
ERR_VALIDATION_002 |
422 | Missing name |
PATCH /api/v1/admin/specialty/{id}
Update a specialty.
Permission: ROLE_ADMIN
Path Parameters
| Param | Type | Description |
|---|---|---|
id |
integer | Specialty ID |
Request Body (all optional)
{
"name": "قلب و عروق ویرایششده",
"status": "inactive",
"weight": 20,
"parent_id": null,
"slug": "new-slug"
}
Response 200
Updated specialty object.
Errors
| Code | HTTP | Description |
|---|---|---|
ERR_AUTH_001 |
401 | Missing token |
ERR_AUTH_006 |
403 | Not admin |
ERR_NOT_FOUND_001 |
404 | Specialty not found |
DELETE /api/v1/admin/specialty/{id}
Delete a specialty.
Permission: ROLE_ADMIN
Response 200
{ "success": true, "data": { "message": "تخصص حذف شد" } }
Errors
| Code | HTTP | Description |
|---|---|---|
ERR_AUTH_001 |
401 | Missing token |
ERR_AUTH_006 |
403 | Not admin |
ERR_NOT_FOUND_001 |
404 | Specialty not found |
Bulk import / export
Full-table JSON export and strict wipe+replace import for this category live under
/api/v1/admin/categories/{bundle}/{export|import} — see category-import.md.
Sorting by id
The admin list endpoint accepts sort=id&order=asc|desc to order by id
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
Without sort, the default ordering (weight/name) is unchanged.