---
title: "Прочитать собственную установку приложения"
method: GET
path: "/api/v1/app/installation"
tags: ["App runtime"]
---

# Прочитать собственную установку приложения

`GET /api/v1/app/installation`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/app/installation`
- Auth: HTTP bearer

Отвечает предъявителю, кто он: кабинет, идентичность приложения, действующий набор прав и срок собственного токена. Зовёт эту операцию установка своим токеном, а не человек сессией; людям она отвечает 403.

Кабинета в адресе нет ни одним сегментом. Он берётся из токена, поэтому назвать чужой нечем: заголовок X-Tenant обязателен, но участвует лишь в том, чтобы проверка шла кабинетом, который предъявитель назвал сам, — не совпал с установкой, и ответ тот же, что на неизвестный токен.

Права в ответе — ДЕЙСТВУЮЩИЕ: пересечение одобренного кабинетом, объявленного манифестом текущей версии и записанного в токен при выдаче. Не то, что приложение просило, и не то, на что кабинет когда-то согласился: сужение согласия и обновление приложения действуют на уже выданные токены.

Ради token_expires_at операция и существует в первую очередь: без него рантайм узнаёт об истечении токена только по 401 посреди работы. Людей кабинета ответ не называет — ни того, кто поставил приложение, ни его роли: на доступ установки они не влияют, и знать их приложению незачем.

delivery_endpoint_url — куда Akeda везёт события этой установки. Адрес — свойство установки, а не манифеста, и приложение вправе его прочитать: иначе после переезда сервера оно узнало бы о приёмнике только по тишине. Сменить адрес через этот контур нельзя.

## Headers

- `X-Tenant` string, required

## Response `200`

Личность установки, её права и срок токена

- AppRuntimeInstallation
  - `tenant` AppRuntimeTenant, required
    - `id` string, uuid, required
    - `slug` string, required: Канонический slug кабинета из справочника, а не строка заголовка; его же ставят в X-Tenant следующего запроса
  - `installation_id` string, uuid, required
  - `status` 'pending' | 'active' | 'suspended' | 'revoked', required
  - `namespace` string, required: Пространство имён приложения app.<издатель>.<ключ> — единственное, в котором оно вправе объявлять свои справочники
  - `publisher` string, required
  - `key` string, required
  - `version` string, required: Версия, которая стоит у кабинета сейчас; её манифест и режет права
  - `scopes` string[], required: Действующий набор: пересечение одобренного кабинетом, объявленного версией и записанного в токен
  - `delivery_endpoint_url` string, required: Куда Akeda везёт события этой установки. Только чтение: сменить адрес через внешний контур нельзя, это делает персонал платформы по заявке издателя
  - `token_id` string, uuid, required
  - `token_expires_at` string, date-time, required: Когда предъявленный токен перестанет работать

## Other responses

- `400`: Кабинет не назван в заголовке X-Tenant
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/a99574d597cc?raw)
