docs: убрать типографское тире и невидимый Unicode из текстов API

Made-with: Cursor
This commit is contained in:
Denozordec committed 2026-04-04 00:31:56 +07:00
1 parent a754e1d9f2
commit fbe9cd3f3c
4 files changed
+50 -50

No files matched your search

+2 -2
View File
@@ -1,6 +1,6 @@
# Как смотреть API-документацию (Gitea без встроенного OpenAPI)
В веб-интерфейсе Gitea файлы из репозитория показываются **как исходный текст** (в т.ч. HTML) — это нормально: страница в браузере **не выполняется** из просмотра кода.
В веб-интерфейсе Gitea файлы из репозитория показываются **как исходный текст** (в т.ч. HTML) - это нормально: страница в браузере **не выполняется** из просмотра кода.
## Самый простой способ
@@ -31,4 +31,4 @@
Или вручную: `npx @redocly/cli@1 build-docs docs/openapi.yaml -o docs/openapi.html`, затем встроить `redoc.standalone.js` по аналогии со скриптом.
Источник правды по контракту API — **`docs/openapi.yaml`** (OpenAPI 3.1).
Источник правды по контракту API - **`docs/openapi.yaml`** (OpenAPI 3.1).
+11 -11
View File
@@ -1,6 +1,6 @@
# EvoBGP — наброски HTTP API
# EvoBGP - наброски HTTP API
**Статус:** черновик для согласования; не спецификация реализации. Базовый префикс: **`/v1`**. Модель данных и термины — в архитектурном плане (модули, `bgp_speaker`, `config_revision`, `job_audit`).
**Статус:** черновик для согласования; не спецификация реализации. Базовый префикс: **`/v1`**. Модель данных и термины - в архитектурном плане (модули, `bgp_speaker`, `config_revision`, `job_audit`).
---
@@ -10,13 +10,13 @@
|------|---------------------|
| **Аутентификация** | Заголовок `Authorization: Bearer <api_key>` или mTLS на edge; ключи привязаны к tenant и роли. |
| **Multi-tenant** | Все сущности в скоупе tenant: либо из ключа, либо явный префикс `X-Tenant-Id` (только для супер-ролей). |
| **Идентификаторы** | UUID v7 или ULID в URL; в JSON — строки. |
| **Идентификаторы** | UUID v7 или ULID в URL; в JSON - строки. |
| **Время** | ISO 8601 UTC (`2026-04-03T12:00:00Z`). |
| **Ошибки** | Тело `application/problem+json` (RFC 9457): `type`, `title`, `status`, `detail`, `instance`, опционально `errors[]` по полям. |
| **Идемпотентность** | Для мутаций, создающих задачи или побочные эффекты: заголовок `Idempotency-Key` (опционально обязателен для `POST` apply/refresh). |
| **Пагинация** | `?cursor=<opaque>&limit=50` (cursor-based); ответ: `items`, `next_cursor`, `has_more`. |
| **Асинхронные операции** | `202 Accepted`, заголовок `Location: /v1/jobs/{job_id}`; тело `{ "job_id", "status": "queued" }`. |
| **Версионирование** | Несовместимые изменения — новый префикс `/v2`. |
| **Версионирование** | Несовместимые изменения - новый префикс `/v2`. |
---
@@ -34,7 +34,7 @@
### Связь с продуктом
**ASN / CDN / DOMAINS / IP-диапазоны** в продуктовой формулировке — это **четыре вида модулей**. Поле **`type`** в `POST /v1/modules` выбирает вид: `AS_PREFIXES`, `CDN_CIDRS`, `DOMAINS` или **`IP_RANGES`**. Дочерние ресурсы: **`as-entries`**, **`cdn-sources`**, **`domain-entries`** — как раньше; **`ip-range-entries`** — статические **CIDR + `community_id`** (без ASN и без URL). **`module_id`** в пути — идентификатор **конкретного экземпляра** модуля, а не имя типа.
**ASN / CDN / DOMAINS / IP-диапазоны** в продуктовой формулировке - это **четыре вида модулей**. Поле **`type`** в `POST /v1/modules` выбирает вид: `AS_PREFIXES`, `CDN_CIDRS`, `DOMAINS` или **`IP_RANGES`**. Дочерние ресурсы: **`as-entries`**, **`cdn-sources`**, **`domain-entries`** - как раньше; **`ip-range-entries`** - статические **CIDR + `community_id`** (без ASN и без URL). **`module_id`** в пути - идентификатор **конкретного экземпляра** модуля, а не имя типа.
Типы: `AS_PREFIXES`, `CDN_CIDRS`, `DOMAINS`, `IP_RANGES` (как в плане).
@@ -44,7 +44,7 @@
| `POST` | `/v1/modules` | Создать модуль. |
| `GET` | `/v1/modules/{module_id}` | Детали модуля. |
| `PATCH` | `/v1/modules/{module_id}` | Частичное обновление (расписание, DoH, приоритет, `enabled`). |
| `DELETE` | `/v1/modules/{module_id}` | Мягкое удаление или `enabled=false` — зафиксировать в плане реализации. |
| `DELETE` | `/v1/modules/{module_id}` | Мягкое удаление или `enabled=false` - зафиксировать в плане реализации. |
**CDN-источники модуля**
@@ -81,7 +81,7 @@
| Метод | Путь | Описание |
|-------|------|----------|
| `POST` | `/v1/modules/{module_id}/refresh` | Запуск ingest для модуля (CDN / DoH / AS по типу). Для **`IP_RANGES`** обычно **не требуется** (данные только в БД); возможен **`204`** / no-op или отказ **`400`**, если тип не поддерживает refresh — зафиксировать в реализации. |
| `POST` | `/v1/modules/{module_id}/refresh` | Запуск ingest для модуля (CDN / DoH / AS по типу). Для **`IP_RANGES`** обычно **не требуется** (данные только в БД); возможен **`204`** / no-op или отказ **`400`**, если тип не поддерживает refresh - зафиксировать в реализации. |
**Пример тела создания модуля (набросок)**
@@ -107,7 +107,7 @@
| Метод | Путь | Описание |
|-------|------|----------|
| `GET` | `/v1/doh-profiles` | Список. |
| `POST` | `/v1/doh-profiles` | Создать (URL, таймауты; секрет — ссылка на vault id или отдельный `POST .../secret`). |
| `POST` | `/v1/doh-profiles` | Создать (URL, таймауты; секрет - ссылка на vault id или отдельный `POST .../secret`). |
| `GET` | `/v1/doh-profiles/{id}` | Детали (без раскрытия секрета). |
| `PATCH` | `/v1/doh-profiles/{id}` | Обновить. |
| `DELETE` | `/v1/doh-profiles/{id}` | Удалить, если не используется модулями. |
@@ -163,7 +163,7 @@
| Метод | Путь | Описание |
|-------|------|----------|
| `GET` | `/v1/revisions/{a}/diff/{b}` | Diff префиксов / метаданных (формат — зафиксировать: JSON patch или табличный). |
| `GET` | `/v1/revisions/{a}/diff/{b}` | Diff префиксов / метаданных (формат - зафиксировать: JSON patch или табличный). |
---
@@ -221,7 +221,7 @@
|-------|------|----------|
| `GET` | `/v1/speakers/{speaker_id}/revisions/latest` | Указатель на последнюю опубликованную ревизию для ноды. |
| `GET` | `/v1/speakers/{speaker_id}/bundle/{revision_id}` | Скачивание подписанного бандла (архив + `manifest.json` + подпись). |
| `POST` | `/v1/nodes/enroll` | Регистрация ноды (обмен ключами, привязка к `speaker_id`) — детали протокола отдельно. |
| `POST` | `/v1/nodes/enroll` | Регистрация ноды (обмен ключами, привязка к `speaker_id`) - детали протокола отдельно. |
Заголовки для бандла: `Content-Type: application/octet-stream` или multipart; контроль целостности по `manifest` (SHA-256) и подписи (например Ed25519).
@@ -264,7 +264,7 @@
|------------|----------------|
| REST, jobs | §1, §10 |
| refresh, apply, rollback, preview, `IP_RANGES` | §3, §8, §9 |
| peers, speakers, communities, DoH | §4–§7 |
| peers, speakers, communities, DoH | §4 - §7 |
| bundle API, нода | §11 |
Файл плана: `.cursor/plans/evobgp_архитектура_0e73ef02.plan.md` (§6 REST API).
+23 -23
View File
@@ -2275,15 +2275,15 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
-231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688,
-104.0616 -231.873,-231.248 z
" fill="currentColor"></path></g></svg></div></div><div class="sc-juTflS gfWNtA api-content"><div class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG api-info"><h1 class="sc-fsQipe sc-crPCXn ePkAIL bSStQp">EvoBGP Control Plane API<!-- --> <span>(<!-- -->0.1.0<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><div class="sc-gHbYXW gUaytm"><div class="sc-etAVuf cNLDQk"> <!-- --> <span class="sc-bqWVmJ dfuuzt">License:<!-- --> <!-- -->LicenseRef-Proprietary</span> </div></div></div><div data-role="redoc-summary" html="" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"></div><div data-role="redoc-description" html="&lt;p&gt;REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Соглашения:&lt;/strong&gt; префикс &lt;code&gt;/v1&lt;/code&gt;; идентификаторы — UUID v7 или ULID (строки); время — ISO 8601 UTC.
Ошибки — &lt;code&gt;application/problem+json&lt;/code&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot;&gt;RFC 9457&lt;/a&gt;).
Пагинация списков — &lt;code&gt;cursor&lt;/code&gt; + &lt;code&gt;limit&lt;/code&gt;; ответ содержит &lt;code&gt;items&lt;/code&gt;, &lt;code&gt;next_cursor&lt;/code&gt;, &lt;code&gt;has_more&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Соглашения:&lt;/strong&gt; префикс &lt;code&gt;/v1&lt;/code&gt;; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.
Ошибки - &lt;code&gt;application/problem+json&lt;/code&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot;&gt;RFC 9457&lt;/a&gt;).
Пагинация списков - &lt;code&gt;cursor&lt;/code&gt; + &lt;code&gt;limit&lt;/code&gt;; ответ содержит &lt;code&gt;items&lt;/code&gt;, &lt;code&gt;next_cursor&lt;/code&gt;, &lt;code&gt;has_more&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Роли&lt;/strong&gt; (матрица доступа): &lt;code&gt;viewer&lt;/code&gt;, &lt;code&gt;editor&lt;/code&gt;, &lt;code&gt;operator&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;. Нода использует отдельные пути и ключ с ролью &lt;code&gt;node&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Заголовок &lt;code&gt;X-Tenant-Id&lt;/code&gt; допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).</p>
<p><strong>Соглашения:</strong> префикс <code>/v1</code>; идентификаторы — UUID v7 или ULID (строки); время — ISO 8601 UTC.
Ошибки — <code>application/problem+json</code> (<a href="https://www.rfc-editor.org/rfc/rfc9457">RFC 9457</a>).
Пагинация списков — <code>cursor</code> + <code>limit</code>; ответ содержит <code>items</code>, <code>next_cursor</code>, <code>has_more</code>.</p>
<p><strong>Соглашения:</strong> префикс <code>/v1</code>; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.
Ошибки - <code>application/problem+json</code> (<a href="https://www.rfc-editor.org/rfc/rfc9457">RFC 9457</a>).
Пагинация списков - <code>cursor</code> + <code>limit</code>; ответ содержит <code>items</code>, <code>next_cursor</code>, <code>has_more</code>.</p>
<p><strong>Роли</strong> (матрица доступа): <code>viewer</code>, <code>editor</code>, <code>operator</code>, <code>node</code>. Нода использует отдельные пути и ключ с ролью <code>node</code>.</p>
<p>Заголовок <code>X-Tenant-Id</code> допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.</p>
</div><div class="sc-FeKFA iKRmMF"><a href="./evobgp-api-sketches.md">Черновик и контекст API</a></div></div></div></div><div id="tag/System" data-section-id="tag/System" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/System" aria-label="tag/System"></a>System</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире.&lt;/p&gt;
@@ -2314,8 +2314,8 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ошибка (см. тело Problem).</p>
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="get" class="sc-eGFuAY kCsPwr http-verb get">get</span><span class="sc-GJyyy dkiPkt">/v1/version</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/version</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177gq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177gq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177gq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177gq_1" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177gq_0" aria-labelledby="tab_R_177gq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"api_version"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"git_sha"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"build_time"</span>: <span class="token string">&quot;2019-08-24T14:15:22Z&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177gq_1" aria-labelledby="tab_R_177gq_1"></div></div></div></div></div></div><div id="tag/Modules" data-section-id="tag/Modules" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Modules" aria-label="tag/Modules"></a>Modules</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение — viewer+; изменение — editor+.&lt;/p&gt;
"><p>Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение — viewer+; изменение — editor+.</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/version</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177gq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177gq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177gq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177gq_1" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177gq_0" aria-labelledby="tab_R_177gq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"api_version"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"git_sha"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"build_time"</span>: <span class="token string">&quot;2019-08-24T14:15:22Z&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177gq_1" aria-labelledby="tab_R_177gq_1"></div></div></div></div></div></div><div id="tag/Modules" data-section-id="tag/Modules" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Modules" aria-label="tag/Modules"></a>Modules</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+.&lt;/p&gt;
"><p>Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+.</p>
</div></div></div><div id="tag/Modules/operation/listModules" data-section-id="tag/Modules/operation/listModules" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/listModules" id="operation/listModules" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Modules/operation/listModules" aria-label="tag/Modules/operation/listModules"></a>Список модулей<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;Модули tenant с опциональными фильтрами по типу и флагу &lt;code&gt;enabled&lt;/code&gt;.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Модули tenant с опциональными фильтрами по типу и флагу <code>enabled</code>.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">query<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="cursor" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">cursor</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span></div> <div><div html="&lt;p&gt;Непрозрачный курсор из предыдущего ответа.&lt;/p&gt;
@@ -2333,9 +2333,9 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="get" class="sc-eGFuAY kCsPwr http-verb get">get</span><span class="sc-GJyyy dkiPkt">/v1/modules</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/modules</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_9p1ha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_9p1ha_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_9p1ha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p1ha_1" data-rttab="true">401</li><li class="tab-error" role="tab" id="tab_R_9p1ha_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p1ha_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_9p1ha_0" aria-labelledby="tab_R_9p1ha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"items"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><button class="collapser" aria-label="expand"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"type"</span>: <span class="token string">&quot;AS_PREFIXES&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"name"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"enabled"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"priority"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"doh_profile_id"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"refresh_interval_sec"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"cron_expr"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"default_community_id"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"next_cursor"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"has_more"</span>: <span class="token boolean">true</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_9p1ha_1" aria-labelledby="tab_R_9p1ha_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_9p1ha_2" aria-labelledby="tab_R_9p1ha_2"></div></div></div></div></div></div><div id="tag/Modules/operation/createModule" data-section-id="tag/Modules/operation/createModule" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/createModule" id="operation/createModule" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Modules/operation/createModule" aria-label="tag/Modules/operation/createModule"></a>Создать модуль<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&ltLine truncated
&lt;code&gt;module_id&lt;/code&gt; в других путях — идентификатор экземпляра, не имя типа.&lt;/p&gt;
&lt;code&gt;module_id&lt;/code&gt; в других путях - идентификатор экземпляра, не имя типа.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Создаёт экземпляр модуля. Поле <code>type</code> задаёт вид (<code>AS_PREFIXES</code>, <code>CDN_CIDRS</code>, <code>DOMAINS</code>, <code>IP_RANGES</code>).
<code>module_id</code> в других путях — идентификатор экземпляра, не имя типа.</p>
<code>module_id</code> в других путях - идентификатор экземпляра, не имя типа.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">header<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="X-Tenant-Id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">X-Tenant-Id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.</p>
</div></div></div></td></tr><tr class="last "><td kind="field" title="Idempotency-Key" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">Idempotency-Key</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span> <span class="sc-gUrTyB sc-cmEaii bPAaet iWTprB"> <!-- -->&lt;= 256 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Идемпотентность мутаций. Для &lt;code&gt;POST&lt;/code&gt; apply и части refresh рекомендуется или обязателен по политике продукта.&lt;/p&gt;
@@ -2388,8 +2388,8 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ошибка (см. тело Problem).</p>
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="patch" class="sc-eGFuAY kKOcuP http-verb patch">patch</span><span class="sc-GJyyy dkiPkt">/v1/modules/{module_id}</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/modules/{module_id}</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_994ha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_994ha_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_994ha_0" aria-labelledby="tab_R_994ha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"name"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"enabled"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"priority"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"doh_profile_id"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"refresh_interval_sec"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"cron_expr"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"default_community_id"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_9p4ha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_9p4ha_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_9p4ha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_1" data-rttab="true">401</li><li class="tab-error" role="tab" id="tab_R_9p4ha_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_2" data-rttab="true">403</li><li class="tab-error" role="tab" id="tab_R_9p4ha_3" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_3" data-rttab="true">404</li><li class="tab-error" role="tab" id="tab_R_9p4ha_4" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_4" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_9p4ha_5" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_5" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_9p4ha_0" aria-labelledby="tab_R_9p4ha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"type"</span>: <span class="token string">&quot;AS_PREFIXES&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"name"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token strLine truncated
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Мягкое удаление или перевод в <code>enabled=false</code> — конкретное поведение задаётся реализацией.</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/modules/{module_id}</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_994ha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_994ha_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_994ha_0" aria-labelledby="tab_R_994ha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"name"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"enabled"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"priority"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"doh_profile_id"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"refresh_interval_sec"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"cron_expr"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"default_community_id"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_9p4ha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_9p4ha_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_9p4ha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_1" data-rttab="true">401</li><li class="tab-error" role="tab" id="tab_R_9p4ha_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_2" data-rttab="true">403</li><li class="tab-error" role="tab" id="tab_R_9p4ha_3" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_3" data-rttab="true">404</li><li class="tab-error" role="tab" id="tab_R_9p4ha_4" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_4" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_9p4ha_5" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9p4ha_5" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_9p4ha_0" aria-labelledby="tab_R_9p4ha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"type"</span>: <span class="token string">&quot;AS_PREFIXES&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"name"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token strLine truncated
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Мягкое удаление или перевод в <code>enabled=false</code> - конкретное поведение задаётся реализацией.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">path<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class="last "><td kind="field" title="module_id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">module_id</span><div class="sc-gUrTyB sc-eKYjSU bPAaet boAHLn">required</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;UUID v7 или ULID.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>UUID v7 или ULID.</p>
</div></div></div></td></tr></tbody></table></div><div><h5 class="sc-irTswZ fA-dGxt">header<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="X-Tenant-Id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">X-Tenant-Id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.&lt;/p&gt;
@@ -2679,10 +2679,10 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="delete" class="sc-eGFuAY kKFqOf http-verb delete">delete</span><span class="sc-GJyyy dkiPkt">/v1/modules/{module_id}/ip-range-entries/{entry_id}</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/modules/{module_id}/ip-range-entries/{entry_id}</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-error react-tabs__tab--selected" role="tab" id="tab_R_9plha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_9plha_0" tabindex="0" data-rttab="true">404</li><li class="tab-error" role="tab" id="tab_R_9plha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_9plha_1" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_9plha_0" aria-labelledby="tab_R_9plha_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/problem+json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"type"</span>: <span class="token string">&quot;../dictionary&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"status"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"detail"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"instance"</span>: <span class="token string">&quot;../dictionary&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"errors"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><button class="collapser" aria-label="expand"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"field"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"pointer"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"message"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></div></li></ul><span class="token punctuation">]</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_9plha_1" aria-labelledby="tab_R_9plha_1"></div></div></div></div></div></div><div id="tag/Modules/operation/postModuleRefresh" data-section-id="tag/Modules/operation/postModuleRefresh" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/postModuleRefresh" id="operation/postModuleRefresh" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Modules/operation/postModuleRefresh" aria-label="tag/Modules/operation/postModuleRefresh"></a>Запустить ingest<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;Запуск обновления данных модуля (CDN / DoH / AS в зависимости от типа).
Для &lt;code&gt;IP_RANGES&lt;/code&gt; данные обычно только в БД: сервер может вернуть &lt;strong&gt;204&lt;/strong&gt; (no-op) или &lt;strong&gt;400&lt;/strong&gt;, если refresh не поддерживается — поведение фиксируется в реализации.
Для &lt;code&gt;IP_RANGES&lt;/code&gt; данные обычно только в БД: сервер может вернуть &lt;strong&gt;204&lt;/strong&gt; (no-op) или &lt;strong&gt;400&lt;/strong&gt;, если refresh не поддерживается - поведение фиксируется в реализации.
Рекомендуется передавать &lt;code&gt;Idempotency-Key&lt;/code&gt;.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Запуск обновления данных модуля (CDN / DoH / AS в зависимости от типа).
Для <code>IP_RANGES</code> данные обычно только в БД: сервер может вернуть <strong>204</strong> (no-op) или <strong>400</strong>, если refresh не поддерживается — поведение фиксируется в реализации.
Для <code>IP_RANGES</code> данные обычно только в БД: сервер может вернуть <strong>204</strong> (no-op) или <strong>400</strong>, если refresh не поддерживается - поведение фиксируется в реализации.
Рекомендуется передавать <code>Idempotency-Key</code>.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">path<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class="last "><td kind="field" title="module_id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">module_id</span><div class="sc-gUrTyB sc-eKYjSU bPAaet boAHLn">required</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;UUID v7 или ULID.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>UUID v7 или ULID.</p>
@@ -2718,8 +2718,8 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ошибка (см. тело Problem).</p>
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="get" class="sc-eGFuAY kCsPwr http-verb get">get</span><span class="sc-GJyyy dkiPkt">/v1/doh-profiles</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/doh-profiles</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2e9hq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2e9hq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_2e9hq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2e9hq_1" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2e9hq_0" aria-labelledby="tab_R_2e9hq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"items"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><button class="collapser" aria-label="expand"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"timeout_ms"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"vault_secret_ref"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"next_cursor"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"has_more"</span>: <span class="token boolean">true</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2e9hq_1" aria-labelledby="tab_R_2e9hq_1"></div></div></div></div></div></div><div id="tag/DoH-profiles/operation/createDohProfile" data-section-id="tag/DoH-profiles/operation/createDohProfile" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/createDohProfile" id="operation/createDohProfile" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/DoH-profiles/operation/createDohProfile" aria-label="tag/DoH-profiles/operation/createDohProfile"></a>Создать DoH-профиль<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;URL и таймауты; секрет — через vault id или отдельный вызов установки секрета.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>URL и таймауты; секрет — через vault id или отдельный вызов установки секрета.</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/doh-profiles</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2e9hq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2e9hq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_2e9hq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2e9hq_1" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2e9hq_0" aria-labelledby="tab_R_2e9hq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"items"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><button class="collapser" aria-label="expand"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"timeout_ms"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"vault_secret_ref"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"next_cursor"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"has_more"</span>: <span class="token boolean">true</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2e9hq_1" aria-labelledby="tab_R_2e9hq_1"></div></div></div></div></div></div><div id="tag/DoH-profiles/operation/createDohProfile" data-section-id="tag/DoH-profiles/operation/createDohProfile" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/createDohProfile" id="operation/createDohProfile" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/DoH-profiles/operation/createDohProfile" aria-label="tag/DoH-profiles/operation/createDohProfile"></a>Создать DoH-профиль<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;URL и таймауты; секрет - через vault id или отдельный вызов установки секрета.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>URL и таймауты; секрет - через vault id или отдельный вызов установки секрета.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">header<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="X-Tenant-Id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">X-Tenant-Id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.</p>
</div></div></div></td></tr><tr class="last "><td kind="field" title="Idempotency-Key" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">Idempotency-Key</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span> <span class="sc-gUrTyB sc-cmEaii bPAaet iWTprB"> <!-- -->&lt;= 256 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Идемпотентность мутаций. Для &lt;code&gt;POST&lt;/code&gt; apply и части refresh рекомендуется или обязателен по политике продукта.&lt;/p&gt;
@@ -3022,8 +3022,8 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>UUID v7 или ULID.</p>
</div></div></div></td></tr></tbody></table></div><div><h5 class="sc-irTswZ fA-dGxt">header<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class="last "><td kind="field" title="X-Tenant-Id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">X-Tenant-Id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.</p>
</div></div></div></td></tr></tbody></table></div><div><h3 class="sc-fJjTez hsJdXF">Responses</h3><div><button class="sc-caslwi brztng"><svg class="sc-fbJfz iZiZiV" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">200<!-- --> </strong><div html="&lt;p&gt;Текст или структурированное представление — формат задаётся реализацией.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Текст или структурированное представление — формат задаётся реализацией.</p>
</div></div></div></td></tr></tbody></table></div><div><h3 class="sc-fJjTez hsJdXF">Responses</h3><div><button class="sc-caslwi brztng"><svg class="sc-fbJfz iZiZiV" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">200<!-- --> </strong><div html="&lt;p&gt;Текст или структурированное представление - формат задаётся реализацией.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Текст или структурированное представление - формат задаётся реализацией.</p>
</div></button></div><div><button class="sc-caslwi fvWYOy"><svg class="sc-fbJfz kiMFkB" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">404<!-- --> </strong><div html="&lt;p&gt;Ресурс не найден в скоупе tenant.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ресурс не найден в скоупе tenant.</p>
</div></button></div><div><button class="sc-caslwi fvWYOy"><svg class="sc-fbJfz kiMFkB" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">default<!-- --> </strong><div html="&lt;p&gt;Ошибка (см. тело Problem).&lt;/p&gt;
@@ -3191,9 +3191,9 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="get" class="sc-eGFuAY kCsPwr http-verb get">get</span><span class="sc-GJyyy dkiPkt">/v1/speakers/{speaker_id}/revisions/latest</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/speakers/{speaker_id}/revisions/latest</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_175la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_175la_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_175la_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_175la_1" data-rttab="true">404</li><li class="tab-error" role="tab" id="tab_R_175la_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_175la_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_175la_0" aria-labelledby="tab_R_175la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"revision_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"published_at"</span>: <span class="token string">&quot;2019-08-24T14:15:22Z&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_175la_1" aria-labelledby="tab_R_175la_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_175la_2" aria-labelledby="tab_R_175la_2"></div></div></div></div></div></div><div id="tag/Node/operation/getSpeakerBundle" data-section-id="tag/Node/operation/getSpeakerBundle" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/getSpeakerBundle" id="operation/getSpeakerBundle" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Node/operation/getSpeakerBundle" aria-label="tag/Node/operation/getSpeakerBundle"></a>Скачать подписанный бандл<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;Архив с &lt;code&gt;manifest.json&lt;/code&gt; и подписью (например Ed25519). Целостность по SHA-256 в манифесте.
&lt;code&gt;Content-Type&lt;/code&gt; — &lt;code&gt;application/octet-stream&lt;/code&gt; или multipart; детали — в реализации.&lt;/p&gt;
&lt;code&gt;Content-Type&lt;/code&gt; - &lt;code&gt;application/octet-stream&lt;/code&gt; или multipart; детали - в реализации.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Архив с <code>manifest.json</code> и подписью (например Ed25519). Целостность по SHA-256 в манифесте.
<code>Content-Type</code> — <code>application/octet-stream</code> или multipart; детали — в реализации.</p>
<code>Content-Type</code> - <code>application/octet-stream</code> или multipart; детали - в реализации.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">path<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="speaker_id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">speaker_id</span><div class="sc-gUrTyB sc-eKYjSU bPAaet boAHLn">required</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;UUID v7 или ULID.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>UUID v7 или ULID.</p>
</div></div></div></td></tr><tr class="last "><td kind="field" title="revision_id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">revision_id</span><div class="sc-gUrTyB sc-eKYjSU bPAaet boAHLn">required</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;UUID v7 или ULID.&lt;/p&gt;
@@ -3218,8 +3218,8 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ошибка (см. тело Problem).</p>
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="post" class="sc-eGFuAY ejslkd http-verb post">post</span><span class="sc-GJyyy dkiPkt">/v1/nodes/enroll</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/nodes/enroll</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_157la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_157la_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_157la_0" aria-labelledby="tab_R_157la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"public_key"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"speaker_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177la_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177la_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_1" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_177la_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177la_0" aria-labelledby="tab_R_177la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_1" aria-labelledby="tab_R_177la_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_2" aria-labelledby="tab_R_177la_2"></div></div></div></div></div></div><div id="tag/Settings" data-section-id="tag/Settings" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings" aria-label="tag/Settings"></a>Settings</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Глобальные настройки и feature flags; изменение — только operator.&lt;/p&gt;
"><p>Глобальные настройки и feature flags; изменение — только operator.</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/nodes/enroll</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_157la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_157la_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_157la_0" aria-labelledby="tab_R_157la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"public_key"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"speaker_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177la_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177la_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_1" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_177la_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177la_0" aria-labelledby="tab_R_177la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_1" aria-labelledby="tab_R_177la_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_2" aria-labelledby="tab_R_177la_2"></div></div></div></div></div></div><div id="tag/Settings" data-section-id="tag/Settings" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings" aria-label="tag/Settings"></a>Settings</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Глобальные настройки и feature flags; изменение - только operator.&lt;/p&gt;
"><p>Глобальные настройки и feature flags; изменение - только operator.</p>
</div></div></div><div id="tag/Settings/operation/getSettings" data-section-id="tag/Settings/operation/getSettings" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/getSettings" id="operation/getSettings" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings/operation/getSettings" aria-label="tag/Settings/operation/getSettings"></a>Получить настройки<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;KV (лимиты CDN, feature flags и т.д.).&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>KV (лимиты CDN, feature flags и т.д.).</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><div><h5 class="sc-irTswZ fA-dGxt">header<!-- --> Parameters</h5><table class="sc-hIqOWV dybric"><tbody><tr class="last "><td kind="field" title="X-Tenant-Id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">X-Tenant-Id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <span class="sc-gUrTyB bPAaet"> <!-- -->Examples<!-- -->: </span><span class="sc-gUrTyB sc-ldFCYc bPAaet eShQxX">01JQXYZABCDEFGHIJKLMNOPQRS</span> <div><div html="&lt;p&gt;Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу.&lt;/p&gt;
@@ -3246,7 +3246,7 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/settings</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_156lq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_156lq_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_156lq_0" aria-labelledby="tab_R_156lq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_176lq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_176lq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_176lq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_176lq_1" data-rttab="true">403</li><li class="tab-error" role="tab" id="tab_R_176lq_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_176lq_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_176lq_0" aria-labelledby="tab_R_176lq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_176lq_1" aria-labelledby="tab_R_176lq_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_176lq_2" aria-labelledby="tab_R_176lq_2"></div></div></div></div></div></div></div><div class="sc-emEvRt jYOHCb"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"EvoBGP Control Plane API","version":"0.1.0","description":"REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).\n\n**Соглашения:** префикс `/v1`; идентификаторы — UUID v7 или ULID (строки); время — ISO 8601 UTC.\nОшибки — `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).\nПагинация списков — `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.\n\n**Роли** (матрица доступа): `viewer`, `editor`, `operator`, `node`. Нода использует отдельные пути и ключ с ролью `node`.\n\nЗаголовок `X-Tenant-Id` допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.\n","license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://api.example.com","description":"Базовый URL инсталляции (замените на свой)"}],"tags":[{"name":"System","description":"Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире."},{"name":"Modules","description":"Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение — viewer+; изменение — editor+."},{"name":"DoH profiles","description":"Профили DNS-over-HTTPS для модулей типа домены. Секрет в ответах не возвращается."},{"name":"Communities","description":"Справочник BGP community в скоупе tenant."},{"name":"Peers","description":"BGP-пиры и политики; привязка к спикеру или ко всем спикерам."},{"name":"Speakers","description":"Регистрация и метаданные экземпляров BIRD (master/replica/canary)."},{"name":"Revisions","description":"История ревизий конфигурации, снимки префиксов, превью и откат (часто асинхронно)."},{"name":"Deploy","description":"Применение ревизий на спикерах и опциональный reload BIRD. Требуется роль operator."},{"name":"Jobs","description":"Асинхронные задачи; статус и отмена (best-effort)."},{"name":"Node","description":"API для evobgp-node (бандлы ревизий и enrollment). Отдельный ключ или mTLS, роль node."},{"name":"Settings","description":"Глобальные настройки и feature flags; изменение — только operator."}],"security":[{"bearerAuth":[]}],"externalDocs":{"description":"Черновик и контекст API","url":"./evobgp-api-sketches.md"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-ключ в формате `Bearer <token>`. На edge может заменяться или дополняться mTLS."}},"parameters":{"TenantId":{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/ResourceId"},"description":"Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":256},"description":"Идемпотентность мутаций. Для `POST` apply и части refresh рекомендуется или обязателен по политике продукта."},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Непрозрачный курсор из предыдущего ответа."},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"description":"Размер страницы (по умолчанию 50)."},"ModuleId":{"name":"module_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"SpeakerId":{"name":"speaker_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"RevisionId":{"name":"revision_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"JobId":{"name":"job_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"PeerId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"DohProfileId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResouLine truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"EvoBGP Control Plane API","version":"0.1.0","description":"REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).\n\n**Соглашения:** префикс `/v1`; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.\nОшибки - `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).\nПагинация списков - `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.\n\n**Роли** (матрица доступа): `viewer`, `editor`, `operator`, `node`. Нода использует отдельные пути и ключ с ролью `node`.\n\nЗаголовок `X-Tenant-Id` допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.\n","license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://api.example.com","description":"Базовый URL инсталляции (замените на свой)"}],"tags":[{"name":"System","description":"Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире."},{"name":"Modules","description":"Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+."},{"name":"DoH profiles","description":"Профили DNS-over-HTTPS для модулей типа домены. Секрет в ответах не возвращается."},{"name":"Communities","description":"Справочник BGP community в скоупе tenant."},{"name":"Peers","description":"BGP-пиры и политики; привязка к спикеру или ко всем спикерам."},{"name":"Speakers","description":"Регистрация и метаданные экземпляров BIRD (master/replica/canary)."},{"name":"Revisions","description":"История ревизий конфигурации, снимки префиксов, превью и откат (часто асинхронно)."},{"name":"Deploy","description":"Применение ревизий на спикерах и опциональный reload BIRD. Требуется роль operator."},{"name":"Jobs","description":"Асинхронные задачи; статус и отмена (best-effort)."},{"name":"Node","description":"API для evobgp-node (бандлы ревизий и enrollment). Отдельный ключ или mTLS, роль node."},{"name":"Settings","description":"Глобальные настройки и feature flags; изменение - только operator."}],"security":[{"bearerAuth":[]}],"externalDocs":{"description":"Черновик и контекст API","url":"./evobgp-api-sketches.md"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-ключ в формате `Bearer <token>`. На edge может заменяться или дополняться mTLS."}},"parameters":{"TenantId":{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/ResourceId"},"description":"Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":256},"description":"Идемпотентность мутаций. Для `POST` apply и части refresh рекомендуется или обязателен по политике продукта."},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Непрозрачный курсор из предыдущего ответа."},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"description":"Размер страницы (по умолчанию 50)."},"ModuleId":{"name":"module_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"SpeakerId":{"name":"speaker_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"RevisionId":{"name":"revision_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"JobId":{"name":"job_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"PeerId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"DohProfileId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"CommLine truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);
+14 -14
View File
@@ -5,9 +5,9 @@ info:
description: |
REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).
**Соглашения:** префикс `/v1`; идентификаторы — UUID v7 или ULID (строки); время — ISO 8601 UTC.
Ошибки — `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).
Пагинация списков — `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.
**Соглашения:** префикс `/v1`; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.
Ошибки - `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).
Пагинация списков - `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.
**Роли** (матрица доступа): `viewer`, `editor`, `operator`, `node`. Нода использует отдельные пути и ключ с ролью `node`.
@@ -24,7 +24,7 @@ tags:
- name: System
description: Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире.
- name: Modules
description: Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение — viewer+; изменение — editor+.
description: Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+.
- name: DoH profiles
description: Профили DNS-over-HTTPS для модулей типа домены. Секрет в ответах не возвращается.
- name: Communities
@@ -42,7 +42,7 @@ tags:
- name: Node
description: "API для evobgp-node (бандлы ревизий и enrollment). Отдельный ключ или mTLS, роль node."
- name: Settings
description: Глобальные настройки и feature flags; изменение — только operator.
description: Глобальные настройки и feature flags; изменение - только operator.
security:
- bearerAuth: []
@@ -563,7 +563,7 @@ components:
type: integer
bgp_speaker_id:
type: ["string", "null"]
description: "`null` — политика для всех спикеров."
description: "`null` - политика для всех спикеров."
additionalProperties: true
BgpSpeaker:
@@ -600,7 +600,7 @@ components:
PrefixSnapshotItem:
type: object
description: Элемент материализованного снимка префиксов (детали — по реализации).
description: Элемент материализованного снимка префиксов (детали - по реализации).
additionalProperties: true
Job:
@@ -684,7 +684,7 @@ components:
RevisionDiff:
type: object
description: |
Сравнение двух ревизий. Конкретный формат (JSON Patch, табличный diff и т.д.) задаётся реализацией — контракт может уточняться.
Сравнение двух ревизий. Конкретный формат (JSON Patch, табличный diff и т.д.) задаётся реализацией - контракт может уточняться.
additionalProperties: true
NodeEnrollRequest:
@@ -878,7 +878,7 @@ paths:
summary: Создать модуль
description: |
Создаёт экземпляр модуля. Поле `type` задаёт вид (`AS_PREFIXES`, `CDN_CIDRS`, `DOMAINS`, `IP_RANGES`).
`module_id` в других путях — идентификатор экземпляра, не имя типа.
`module_id` в других путях - идентификатор экземпляра, не имя типа.
operationId: createModule
parameters:
- $ref: "#/components/parameters/TenantId"
@@ -959,7 +959,7 @@ paths:
delete:
tags: [Modules]
summary: Удалить модуль
description: Мягкое удаление или перевод в `enabled=false` — конкретное поведение задаётся реализацией.
description: Мягкое удаление или перевод в `enabled=false` - конкретное поведение задаётся реализацией.
operationId: deleteModule
parameters:
- $ref: "#/components/parameters/IdempotencyKey"
@@ -1391,7 +1391,7 @@ paths:
summary: Запустить ingest
description: |
Запуск обновления данных модуля (CDN / DoH / AS в зависимости от типа).
Для `IP_RANGES` данные обычно только в БД: сервер может вернуть **204** (no-op) или **400**, если refresh не поддерживается — поведение фиксируется в реализации.
Для `IP_RANGES` данные обычно только в БД: сервер может вернуть **204** (no-op) или **400**, если refresh не поддерживается - поведение фиксируется в реализации.
Рекомендуется передавать `Idempotency-Key`.
operationId: postModuleRefresh
parameters:
@@ -1454,7 +1454,7 @@ paths:
post:
tags: [DoH profiles]
summary: Создать DoH-профиль
description: URL и таймауты; секрет — через vault id или отдельный вызов установки секрета.
description: URL и таймауты; секрет - через vault id или отдельный вызов установки секрета.
operationId: createDohProfile
parameters:
- $ref: "#/components/parameters/TenantId"
@@ -1948,7 +1948,7 @@ paths:
operationId: getRevisionPreview
responses:
"200":
description: Текст или структурированное представление — формат задаётся реализацией.
description: Текст или структурированное представление - формат задаётся реализацией.
content:
application/json:
schema:
@@ -2222,7 +2222,7 @@ paths:
summary: Скачать подписанный бандл
description: |
Архив с `manifest.json` и подписью (например Ed25519). Целостность по SHA-256 в манифесте.
`Content-Type` — `application/octet-stream` или multipart; детали — в реализации.
`Content-Type` - `application/octet-stream` или multipart; детали - в реализации.
operationId: getSpeakerBundle
security:
- bearerAuth: []