# deldaste.com — јавен каталог на третмани

Ажурирано 08.10.2026: поправена е валидацијата на дозволените `data` полиња за јавните барања без `authentication`.

Production endpoint: `POST https://vps.xnet.mk:50443/api/commands`

Exact client identifier: `client.appId: "deldaste.com"`

Operation: `catalog.treatment.list`

Операцијата е јавна и само за читање. Не испраќајте `authentication`, cookie,
access token, session token, корисничко име или лозинка. `clientSessionId` и
`conversation.id` се случајни UUID вредности за корелација на v1 envelope; тие не
создаваат корисничка или серверска сесија и може да бидат нови за секое барање.

Од browser е дозволен CORS пристап само од `https://deldaste.com` и
`https://www.deldaste.com`. Серверска интеграција може да го повика истиот endpoint.

## Барање

`data`:

- `gender` — задолжително: `"female"` или `"male"`;
- `limit` — опционален integer од 1 до 200; default 50;
- `offset` — опционален ненегативен integer; default 0.

Пример:

```json
{
  "schemaVersion": 1,
  "messageId": "11111111-1111-4111-8111-111111111111",
  "client": {
    "appId": "deldaste.com",
    "appVersion": "1.0.0",
    "clientSessionId": "22222222-2222-4222-8222-222222222222"
  },
  "conversation": {
    "id": "33333333-3333-4333-8333-333333333333",
    "turn": 1
  },
  "operation": "catalog.treatment.list",
  "sentAtUtc": "2026-10-08T18:00:00Z",
  "expiresAtUtc": "2026-10-08T18:05:00Z",
  "data": {
    "gender": "female",
    "limit": 50,
    "offset": 0
  }
}
```

Не додавајте непознати полиња во `data`. Секое барање треба да има нов
`messageId`; `turn` е позитивен integer.

## Успешен одговор

Се враќаат само активни, неархивирани третмани од активни, неархивирани
категории. За `female` се враќаат `female` и `both`; за `male` се враќаат
`male` и `both`. Маркерот со кој deldaste го чува полот не се враќа во
`description`.

```json
{
  "schemaVersion": 1,
  "messageId": "44444444-4444-4444-8444-444444444444",
  "replyToMessageId": "11111111-1111-4111-8111-111111111111",
  "conversation": {
    "id": "33333333-3333-4333-8333-333333333333",
    "turn": 1,
    "nextExpectedTurn": 2,
    "state": "completed"
  },
  "operation": "catalog.treatment.list",
  "status": "completed",
  "serverTimeUtc": "2026-10-08T18:00:00Z",
  "data": {
    "gender": "female",
    "items": [
      {
        "id": 17,
        "name": "Пример третман",
        "description": "Јавен опис на третманот.",
        "gender": "both",
        "categoryId": 4,
        "categoryName": "Пример категорија",
        "durationMinutes": 45,
        "regularPrice": 1800.00,
        "onlinePrice": 1500.00,
        "categoryPosition": 2,
        "position": 1
      }
    ],
    "limit": 50,
    "offset": 0,
    "hasMore": false,
    "nextOffset": null
  },
  "error": null
}
```

`onlinePrice` може да биде `null`. Редоследот е стабилен:
`categoryPosition`, `categoryId`, `position`, `id`. Клиентот не треба сам да го
прередува резултатот ако сака да го задржи административно зададениот редослед.
Одговорот не содржи корисници, телефони, е-пошта, резервации, интерни белешки,
credentials или име на база.

## Пагинација

Почнете со `offset:0`. Ако `hasMore:true`, испратете ново read барање со истиот
`gender` и `offset` еднаков на `nextOffset`. Крајот е `hasMore:false` и
`nextOffset:null`. Ако каталогот се менува додека се читаат повеќе страници,
почнете повторно од offset 0 за целосно усогласена листа.

## Грешки

- HTTP 400 `unsupported-version`, `invalid-client`, `invalid-conversation`,
  `message-expired` или `client-operation-not-configured` — невалиден envelope,
  истечено барање или погрешен appId/operation.
- HTTP 422 `invalid-operation-data` — недостига/невалиден `gender`, `limit`,
  `offset` или е испратено непознато поле.
- HTTP 429 `rate-limit-exceeded` — над 120 барања во 60 секунди од истиот извор;
  почитувајте го `Retry-After` header-от.
- HTTP 503 `catalog-unavailable`, `retryable:true` — каталогот/базата моментално
  не е достапен; повторете read со backoff.

Грешката го користи стандардниот XNet v1 envelope:

```json
{
  "status": "rejected",
  "data": null,
  "error": {
    "code": "invalid-operation-data",
    "message": "gender мора да биде female или male.",
    "details": null,
    "retryable": false
  }
}
```

## Безбедносна граница

За `client.appId:"deldaste.com"` е дозволена само
`catalog.treatment.list`. Резервациите остануваат на постојниот автентициран
KIKI договор и бараат проверени credentials. `kiki.category.save/delete/reorder`
и `kiki.treatment.save/delete/reorder` остануваат со постојната серверска
проверка на Kiki Manager/admin дозвола. Оваа јавна операција не менува ниту еден
запис и не повикува серверска процедура.
