Контракт REST API курьерского приложения «Блинчик». Отдельный гвард courier (Laravel Sanctum). Регистрация выполняется по коду подтверждения в WhatsApp; доступ к заказам открывается только после подтверждения курьера администратором. Все ответы в формате JSON, денежные значения — в тенге (целые числа).
1АвторизацияРегистрация, вход, профиль, токен устройства
1.1
POST
/courier/register/send-code
Публичный
Шаг 1 регистрации — выслать код в WhatsApp
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| phone | string | обязательно | пример: +7 707 123 45 67 |
Ответы
| 200 | Код отправлен |
| 409 | Курьер с таким номером уже есть |
| 422 | Ошибка валидации |
| 502 | WhatsApp-шлюз недоступен |
1.2
POST
/courier/register
Публичный
Шаг 2 регистрации — проверить код и создать курьера (status=pending)
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| phone | string | обязательно | пример: +7 707 123 45 67 |
| name | string | обязательно | пример: Асхат |
| code | string | обязательно | пример: 4821 |
| car_number | string | опционально | пример: 777 ABC 02 |
| password | string | опционально | Опционально — чтобы потом входить по паролю |
| fcm_token | string | опционально | |
| platform | android | ios | опционально |
Ответы
| 200 | Заявка создана, выдан токен (но заказы недоступны до подтверждения) |
| 409 | Дубликат телефона |
| 422 | Неверный код / валидация |
1.3
POST
/courier/login/send-code
Публичный
Выслать код для входа (если у курьера не задан пароль)
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| phone | string | обязательно |
Ответы
| 200 | Код отправлен |
| 404 | Курьер не найден |
1.4
POST
/courier/login
Публичный
Вход по телефону + пароль ИЛИ код WhatsApp
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| phone | string | обязательно | |
| password | string | опционально | Если у курьера задан пароль |
| code | string | опционально | Если входит по коду |
| fcm_token | string | опционально | |
| platform | android | ios | опционально |
Ответы
| 200 | Успешный вход |
| 401 | Неверный пароль/код |
| 404 | Курьер не найден |
1.5
GET
/courier/me
Требует токен
Профиль + статус модерации
Ответы
| 200 | Профиль |
| 401 | Не авторизован |
1.6
POST
/courier/device-token
Требует токен
Сохранить/обновить FCM-токен устройства
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| fcm_token | string | обязательно | |
| platform | android | ios | опционально |
Ответы
| 200 | Сохранено |
1.7
POST
/courier/logout
Требует токен
Выход (удаляет токен устройства и access-токен)
Тело запроса
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| fcm_token | string | опционально |
Ответы
| 200 | Выход выполнен |
2СменаСмена курьера и инкассация
2.1
POST
/courier/shift/start
Требует токен
Выйти на смену (стать онлайн)
Ответы
| 200 | Смена открыта |
| 403 | Курьер не подтверждён / заблокирован |
2.2
POST
/courier/shift/end
Требует токен
Завершить смену (офлайн + фиксация итогов)
Ответы
| 200 | Смена закрыта |
2.3
GET
/courier/shift/summary
Требует токен
Сводка смены (экран «Смена и инкассация»)
Ответы
| 200 | Сводка |
3ЗаказыЛента заказов и развоз
3.1
GET
/courier/orders/available
Требует токен
Лента «Доступные» — заказы на доставку, ещё не взятые
Ответы
| 200 | Список |
| 403 | Не подтверждён |
3.2
GET
/courier/orders/my
Требует токен
Мои активные заказы (взятые, не закрытые)
Ответы
| 200 | Список |
3.3
POST
/courier/orders/{id}/take
Требует токен
Взять заказ (атомарно — двое не заберут один)
Параметры пути
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | путь |
Ответы
| 200 | Заказ взят |
| 409 | Заказ уже взят другим |
3.4
POST
/courier/orders/{id}/status
Требует токен
Сменить статус развоза
Допустимые переходы: accepted→picked_up→on_way→delivered; отмена (canceled) доступна до вручения. На on_way/delivered/canceled клиенту уходит пуш.
Параметры пути
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | путь |
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| status | picked_up | on_way | delivered | canceled | обязательно |
Ответы
| 200 | Статус обновлён |
| 404 | Заказ не найден/не ваш |
| 422 | Недопустимый переход |
3.5
POST
/courier/orders/{id}/cash
Требует токен
Подтвердить приём наличных (для инкассации)
Параметры пути
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | путь |
Тело запроса
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| amount | integer | опционально | Если не передан — берётся сумма заказа |
Ответы
| 200 | Наличные зафиксированы |
3.6
POST
/courier/location
Требует токен
Обновить координаты курьера (когда в пути)
Тело запроса (обязательно)
| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| lat | number (float) | обязательно | пример: 42.3151 |
| lon | number (float) | обязательно | пример: 69.5871 |
Ответы
| 200 | Принято |
Модели данных
M1
SimpleOk| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| success | boolean | опционально | пример: True |
| message | string | опционально |
M2
Error| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| success | boolean | опционально | пример: False |
| message | string | опционально | пример: Текст ошибки |
| status | string | опционально | Для 403 — статус модерации (pending/blocked) |
M3
Courier| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | опционально | пример: 12 |
| name | string | опционально | пример: Асхат |
| phone | string | опционально | пример: 77071234567 |
| avatar | string | опционально | |
| car_number | string | опционально | пример: 777 ABC 02 |
| status | pending | approved | blocked | опционально | пример: approved |
| is_online | boolean | опционально | пример: True |
M4
Shift| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | опционально | |
| started_at | string (date-time) | опционально | |
| ended_at | string (date-time) | опционально | |
| is_online | boolean | опционально |
M5
ShiftSummary| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| orders_count | integer | опционально | Доставлено за смену пример: 7 |
| cash_total | integer | опционально | Собрано наличными (к сдаче), ₸ пример: 18400 |
| is_online | boolean | опционально |
M6
OrderCard| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| id | integer | опционально | пример: 827 |
| delivery_address | string | опционально | пример: мкр Нурсат, д. 12, кв. 34 |
| lat | string | опционально | пример: 42.3151 |
| lon | string | опционально | пример: 69.5871 |
| price | integer | опционально | пример: 4200 |
| delivery_price | integer | опционально | пример: 700 |
| payment_type | string | опционально | пример: cash |
| payment_status | string | опционально | пример: pending |
| is_cash | boolean | опционально | пример: True |
| enterprise_id | integer | опционально | пример: 1 |
| courier_status | string | опционально | |
| special_instruction | string | опционально | пример: Домофон 34, 3 этаж |
| created_at | string (date-time) | опционально |
M7
OrderFullнаследует OrderCard| Поле | Тип | Наличие | Описание |
|---|---|---|---|
| phone | string | опционально | пример: 77011112233 |
| cash_collected | boolean | опционально | пример: False |
| cash_amount | integer | опционально | |
| items | object[] | опционально |