Перейти к содержимому
СервисАпп API
На этой странице

Оборудование клиентов

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Карточки оборудования с клиентом, объектом, паспортом, гарантией и эксплуатационными параметрами.

Доступные возможности и ограничения

Нужны equipment:read, «ТОиР — Оборудование → Просмотр» и доступ к ТОиР. GET не создаёт историю, чек-листы или заявки. Для GET /equipment/{id}/history используйте filter[kind]=maintenance-schedules или acts; по умолчанию возвращаются заявки ТО. Каждый вид использует пагинацию по идентификатору и требует разрешения на чтение соответствующего ресурса и прав сотрудника. Календарные даты возвращаются как Y-m-d без перевода часового пояса. Дополнительные поля следуют правилам типов. technical_specs принимает JSON-объект или null: до 32 КиБ, не более восьми уровней вложенности. Типы значений сохраняются. GET возвращает объект, а для старых текстовых паспортов — прежнюю строку или null.

data.version — строка Unix-секунд из updated_at. Два изменения в одну секунду могут иметь одинаковую версию. Для проверки изменений используйте правила синхронизации. Карточка также возвращает отдельный ETag своего представления. Изменение установленного оснащения обновляет также версию оборудования.

updated_since и updated_before выбирают записи по updated_at: нижняя граница включается (>=), верхняя исключается (<). Эти фильтры не гарантируют обнаружение всех изменений наработки, обслуживания и связанных данных. Используйте события и полную сверку по правилам синхронизации.

Поля и назначение

Публичное поле Формат и смысл Доступ
id, name id и название только чтение / чтение и запись
customer_id, customer_site_id обязательный клиент и необязательный объект чтение и запись
equipment_model_id UUID/null модели оборудования чтение и запись
manufacturer_id, device_type_id доступные справочники чтение и запись
model_name, serial_number, inventory_number строки/null чтение и запись
manufacture_date, installation_date, warranty_expires_at календарные даты/null чтение и запись
catalog_product_id, location, technical_specs товар, местоположение и структурированный паспорт чтение и запись
status active / inactive / decommissioned / repair / pending_install отдельная команда
last_maintenance_date, next_maintenance_date календарные даты, вычисляются жизненным циклом ТО только чтение
usage_reading целое число, запись через equipment-usage только чтение
usage_unit_id id единицы/null; первичная настройка счётчика чтение и запись
maintenance_interval положительное целое число/null; интервал по умолчанию ТО без индивидуальных планов чтение и запись
links edit/portal/public, строка либо null; GET не выпускает новый токен только чтение
note, custom_fields, external_id явные значения чтение и запись

Обязательность и null указаны в схемах каждой операции ниже.

Доступ и выборка

Карточка содержит ссылки только для чтения: links.edit, links.portal, links.public: редактирование в панели, карточку клиентского кабинета и существующий QR-паспорт. У старой записи без public_token публичная ссылка равна null; GET не генерирует токен. Для pending_install ссылки в портал и на публичный паспорт равны null. Отключённый раздел портала возвращает links.portal=null.

equipment:read/write и «ТОиР — Оборудование → Просмотр, Изменение»; тариф модуля; для истории актов также право их чтения.

Фильтры: customer_id, customer_site_id, equipment_model_id, manufacturer_id, device_type_id, status, serial_number, external_id, updated_since, updated_before.

Настройка счётчика

usage_unit_id можно задать при создании и при первом изменении. При создании обязательны customer_id и name. По умолчанию status=active, usage_reading=0; usage_unit_id и maintenance_interval равны null, если не настроены. Для ненулевого maintenance_interval нужна единица наработки. После создания показания записываются отдельной командой наработки. Поле usage_reading не принимается при создании и обычном изменении.

Смена или очистка единицы разрешена только пока usage_current=0, usage_at_last_service=0 и нет связанных usage/hybrid-планов, регламентов или истории выполнения с наработкой. Иначе 409 USAGE_UNIT_IN_USE; API не меняет смысл прежние показания. Возврат той же единицы допустим. maintenance_interval относится к существующему механизму обслуживания по умолчанию; интервалы индивидуальных планов настраиваются через maintenance-plans, и ответ usage показывает их отдельно.

POST /equipment/{id}/status принимает { "status": "inactive" } с If-Resource-Version. Допустимы active/inactive/decommissioned/repair с доменными проверками; pending_install доступен только через монтаж. Ответ 200 — актуальная карточка. При конфликте открытых процессов — 409 EQUIPMENT_STATE_CONFLICT.

Правила и связи

  • Объект принадлежит клиенту; новое назначение проверяет актуальную неархивированную запись под блокировкой. Прежняя связь с архивным объектом сохраняется при изменении других полей. Каталожная модель и экземпляр оборудования остаются разными сущностями.
  • Смена клиента/объекта оборудования не может нарушить уже согласованный состав договора обслуживания: конфликт возвращает 422 с полем customer_id или customer_site_id. Штатная запись проверяет то же правило. Перенос самой площадки к другому клиенту разрешён только без оборудования и остальных зависимостей, с текущей блокировкой площадки; правила описаны в customer-sites.md.
  • pending_install создаётся доменным путём монтажа, а не произвольным изменением status.
  • Списание/деактивация оборудования не удаляет планы и историю обслуживания.
  • scenario_state, act_product_id, производные даты и сохранённый снимок не принимаются командой изменения.
  • Запись показаний и дата завершения ТО проходят свои операции; нельзя обойти их через technical_specs.

Операции

Метод Путь Назначение
GET /equipment/{id}/history История обслуживания и связанных актов
POST /equipment Создание
GET /equipment Список с фильтрами и пагинацией
POST /equipment/{id}/update Изменение разрешённых полей
POST /equipment/{id}/status Смена эксплуатационного состояния
GET /equipment/{id} Карточка

GET /equipment/{id}/history

История обслуживания и связанных актов.

Доступ. Разрешения подключения: equipment:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
filter[kind] параметр запроса строка нет нет Допустимо: "maintenance-schedules", "acts"; По умолчанию: "maintenance-schedules"
sort параметр запроса строка нет нет Допустимо: "id", "-id"
page[size] параметр запроса целое число нет нет ≥ 1.0; ≤ 100.0
page[cursor] параметр запроса строка нет нет не более 4096 символов

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
406 Недопустимое кодирование ответа. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Cache-Control строка
400 Cache-Control строка
401 Cache-Control строка
403 Cache-Control строка
404 Cache-Control строка
406 Cache-Control строка
409 Cache-Control строка
422 Cache-Control строка
429 Cache-Control строка
429 Retry-After строка
500 Cache-Control строка
503 Cache-Control строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment/101/history" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment

Создание.

Доступ. Разрешения подключения: equipment:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
customer_id целое число да нет ≥ 1
name строка да нет не более 255 символов
customer_site_id целое число / null нет да ≥ 1
equipment_model_id строка / null (uuid) нет да —
manufacturer_id целое число / null нет да ≥ 1
device_type_id целое число / null нет да ≥ 1
model_name строка / null нет да не более 255 символов
serial_number строка / null нет да не более 255 символов
inventory_number строка / null нет да не более 255 символов
manufacture_date строка / null (дата) нет да —
installation_date строка / null (дата) нет да —
warranty_expires_at строка / null (дата) нет да —
catalog_product_id целое число / null нет да ≥ 1
location строка / null нет да не более 2000 символов
technical_specs массив / null нет да —
technical_specs[] строка да нет —
usage_unit_id целое число / null нет да ≥ 1
maintenance_interval целое число / null нет да ≥ 1; ≤ 4294967295
note строка / null нет да не более 10000 символов
external_id строка / null нет да не менее 1 символов; не более 255 символов
custom_fields массив нет нет не более 100 элементов
custom_fields[] строка да нет —

Ответы

HTTP Назначение и схема
201 Создано. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
406 Недопустимое кодирование ответа. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
201 Cache-Control строка
201 Location строка
201 Idempotency-Replayed строка
400 Cache-Control строка
401 Cache-Control строка
403 Cache-Control строка
404 Cache-Control строка
406 Cache-Control строка
409 Cache-Control строка
413 Cache-Control строка
415 Cache-Control строка
422 Cache-Control строка
429 Cache-Control строка
429 Retry-After строка
500 Cache-Control строка
503 Cache-Control строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-store:001" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment.store.json'

GET /equipment

Список с фильтрами и пагинацией.

Доступ. Разрешения подключения: equipment:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
sort параметр запроса строка нет нет Допустимо: "id", "-id", "updated_at,id", "-updated_at,-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов
filter[customer_id] параметр запроса целое число нет нет ≥ 1
filter[customer_site_id] параметр запроса целое число нет нет ≥ 1
filter[equipment_model_id] параметр запроса строка (uuid) нет нет —
filter[manufacturer_id] параметр запроса целое число нет нет ≥ 1
filter[device_type_id] параметр запроса целое число нет нет ≥ 1
filter[status] параметр запроса строка нет нет Допустимо: "active", "inactive", "decommissioned", "repair", "pending_install"
filter[serial_number] параметр запроса строка нет нет не более 255 символов
filter[external_id] параметр запроса строка нет нет не более 255 символов
filter[updated_since] параметр запроса строка (дата и время) нет нет Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
filter[updated_before] параметр запроса строка (дата и время) нет нет Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /equipment/{id}/update

Изменение разрешённых полей.

Доступ. Разрешения подключения: equipment:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет Unix-секунды updated_at выбранного ресурса.; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
customer_id целое число нет нет ≥ 1
name строка нет нет не более 255 символов
customer_site_id целое число / null нет да ≥ 1
equipment_model_id строка / null (uuid) нет да —
manufacturer_id целое число / null нет да ≥ 1
device_type_id целое число / null нет да ≥ 1
model_name строка / null нет да не более 255 символов
serial_number строка / null нет да не более 255 символов
inventory_number строка / null нет да не более 255 символов
manufacture_date строка / null (дата) нет да —
installation_date строка / null (дата) нет да —
warranty_expires_at строка / null (дата) нет да —
catalog_product_id целое число / null нет да ≥ 1
location строка / null нет да не более 2000 символов
technical_specs массив / null нет да —
technical_specs[] строка да нет —
usage_unit_id целое число / null нет да ≥ 1
maintenance_interval целое число / null нет да ≥ 1; ≤ 4294967295
note строка / null нет да не более 10000 символов
external_id строка / null нет да не менее 1 символов; не более 255 символов
custom_fields массив нет нет не более 100 элементов
custom_fields[] строка да нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
406 Недопустимое кодирование ответа. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Cache-Control строка
200 Location строка
200 Idempotency-Replayed строка
400 Cache-Control строка
401 Cache-Control строка
403 Cache-Control строка
404 Cache-Control строка
406 Cache-Control строка
409 Cache-Control строка
412 Cache-Control строка
413 Cache-Control строка
415 Cache-Control строка
422 Cache-Control строка
428 Cache-Control строка
429 Cache-Control строка
429 Retry-After строка
500 Cache-Control строка
503 Cache-Control строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment/101/update" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-update:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment.update.json'

POST /equipment/{id}/status

Смена эксплуатационного состояния.

Доступ. Разрешения подключения: equipment:write. Права сотрудника: «ТОиР — Оборудование → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет Unix-секунды updated_at выбранного ресурса.; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
status строка да нет Допустимо: "active", "inactive", "decommissioned", "repair"

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
400 Некорректный запрос. Коды и формат ошибки
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
406 Недопустимое кодирование ответа. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
413 Превышен размер. Коды и формат ошибки
415 Неподдерживаемый Content-Type. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
500 Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Cache-Control строка
200 Location строка
200 Idempotency-Replayed строка
400 Cache-Control строка
401 Cache-Control строка
403 Cache-Control строка
404 Cache-Control строка
406 Cache-Control строка
409 Cache-Control строка
412 Cache-Control строка
413 Cache-Control строка
415 Cache-Control строка
422 Cache-Control строка
428 Cache-Control строка
429 Cache-Control строка
429 Retry-After строка
500 Cache-Control строка
503 Cache-Control строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/equipment/101/status" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-equipment-status:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.equipment.status.json'

GET /equipment/{id}

Карточка.

Доступ. Разрешения подключения: equipment:read. Права сотрудника: «ТОиР — Оборудование → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/equipment/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"