{"openapi":"3.1.0","info":{"title":"pdfapi","version":"1","description":"HTML, страница по адресу, Markdown и документы Office в PDF одним запросом."},"servers":[{"url":"https://pdfapi.ru/api"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Ключ из кабинета: Authorization: Bearer pdf_live_…"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Тот же ключ в отдельном заголовке."}},"schemas":{"PageOptions":{"type":"object","title":"PageOptions","description":"Параметры страницы. Все необязательные; другие ключи — ошибка 400.","properties":{"landscape":{"type":"boolean","description":"Альбомная ориентация.","default":false},"paperWidth":{"type":"string","description":"Ширина листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"8.27in"},"paperHeight":{"type":"string","description":"Высота листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"11.7in"},"marginTop":{"type":"string","description":"Верхнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginBottom":{"type":"string","description":"Нижнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginLeft":{"type":"string","description":"Левое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"marginRight":{"type":"string","description":"Правое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"waitDelay":{"type":"string","description":"Подождать перед печатью, пока скрипт на странице дорисует содержимое: график, шрифт с CDN, данные по fetch.","pattern":"^\\d+(\\.\\d+)?(ms|s)$","x-format-hint":"число и s или ms, не больше 10 секунд: «2s», «500ms»","default":"0s","example":"1s"}}},"Error":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}},"paths":{"/v1/convert":{"post":{"operationId":"convert","summary":"Создать PDF","tags":["Конвертация"],"description":"Превращает HTML, страницу по адресу, Markdown или документ Office в PDF. Ответ — сам PDF, а расход страниц — в заголовках. Страницы списываются один раз при сохранении готового PDF. Тот же Idempotency-Key и запрос повторно выдают результат без списания 24 часа.","security":[{"bearer":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Случайный ключ одного документа; повторы используют то же тело и ключ в течение 24 часов.","schema":{"type":"string","pattern":"^[A-Za-z0-9._~-]{1,128}$"}}],"requestBody":{"required":true,"description":"JSON до 5 МБ. Поле source выбирает вид источника и остальные поля.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"HTML","description":"Разметка HTML со стилями. Доступно на всех тарифах.","required":["source","html"],"properties":{"source":{"type":"string","const":"html","description":"Тип источника."},"html":{"type":"string","description":"HTML-документ или фрагмент. Не пустой.","example":"<h1>Счёт №42</h1>"},"options":{"type":"object","title":"PageOptions","description":"Параметры страницы. Все необязательные; другие ключи — ошибка 400.","properties":{"landscape":{"type":"boolean","description":"Альбомная ориентация.","default":false},"paperWidth":{"type":"string","description":"Ширина листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"8.27in"},"paperHeight":{"type":"string","description":"Высота листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"11.7in"},"marginTop":{"type":"string","description":"Верхнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginBottom":{"type":"string","description":"Нижнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginLeft":{"type":"string","description":"Левое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"marginRight":{"type":"string","description":"Правое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"waitDelay":{"type":"string","description":"Подождать перед печатью, пока скрипт на странице дорисует содержимое: график, шрифт с CDN, данные по fetch.","pattern":"^\\d+(\\.\\d+)?(ms|s)$","x-format-hint":"число и s или ms, не больше 10 секунд: «2s», «500ms»","default":"0s","example":"1s"}}}}},{"type":"object","title":"URL","description":"Публичная страница по адресу. Тариф premium и выше.","required":["source","url"],"properties":{"source":{"type":"string","const":"url","description":"Тип источника."},"url":{"type":"string","format":"uri","description":"Адрес с http:// или https://. Пробелы по краям срезаются. Адреса во внутренних сетях (127.0.0.1, 10.x, 192.168.x, 169.254.169.254) отклоняются с url_not_allowed — в том числе если в них разрешается ваш домен.","example":"https://example.com"},"options":{"type":"object","title":"PageOptions","description":"Параметры страницы. Все необязательные; другие ключи — ошибка 400.","properties":{"landscape":{"type":"boolean","description":"Альбомная ориентация.","default":false},"paperWidth":{"type":"string","description":"Ширина листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"8.27in"},"paperHeight":{"type":"string","description":"Высота листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"11.7in"},"marginTop":{"type":"string","description":"Верхнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginBottom":{"type":"string","description":"Нижнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginLeft":{"type":"string","description":"Левое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"marginRight":{"type":"string","description":"Правое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"waitDelay":{"type":"string","description":"Подождать перед печатью, пока скрипт на странице дорисует содержимое: график, шрифт с CDN, данные по fetch.","pattern":"^\\d+(\\.\\d+)?(ms|s)$","x-format-hint":"число и s или ms, не больше 10 секунд: «2s», «500ms»","default":"0s","example":"1s"}}}}},{"type":"object","title":"Markdown","description":"Текст в Markdown. Тариф premium и выше.","required":["source","markdown"],"properties":{"source":{"type":"string","const":"markdown","description":"Тип источника."},"markdown":{"type":"string","description":"Текст в Markdown. Не пустой.","example":"# Отчёт\n\n- пункт один"},"options":{"type":"object","title":"PageOptions","description":"Параметры страницы. Все необязательные; другие ключи — ошибка 400.","properties":{"landscape":{"type":"boolean","description":"Альбомная ориентация.","default":false},"paperWidth":{"type":"string","description":"Ширина листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"8.27in"},"paperHeight":{"type":"string","description":"Высота листа. По умолчанию A4.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"11.7in"},"marginTop":{"type":"string","description":"Верхнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginBottom":{"type":"string","description":"Нижнее поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"20mm"},"marginLeft":{"type":"string","description":"Левое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"marginRight":{"type":"string","description":"Правое поле.","pattern":"^(\\d+(\\.\\d*)?|\\.\\d+)(pt|px|in|mm|cm|pc)?$","x-format-hint":"число и единица pt, px, in, mm, cm или pc без пробела: «20mm», «1.5cm», «.5in»; без единицы — дюймы","example":"0.39in"},"waitDelay":{"type":"string","description":"Подождать перед печатью, пока скрипт на странице дорисует содержимое: график, шрифт с CDN, данные по fetch.","pattern":"^\\d+(\\.\\d+)?(ms|s)$","x-format-hint":"число и s или ms, не больше 10 секунд: «2s», «500ms»","default":"0s","example":"1s"}}}}},{"type":"object","title":"Office","description":"Документ docx, xlsx или pptx. Тариф premium и выше.","required":["source","filename","fileBase64"],"properties":{"source":{"type":"string","const":"office","description":"Тип источника."},"filename":{"type":"string","description":"Имя файла с расширением .docx, .xlsx или .pptx — по нему выбирается конвертер.","pattern":"\\.(docx|xlsx|pptx)$","example":"report.docx"},"fileBase64":{"type":"string","format":"byte","description":"Файл в base64. Это ZIP-архив (начинается с «PK»), не больше 3,7 МБ до кодирования — тело запроса ограничено 5 МБ."},"options":{"type":"object","title":"OfficeOptions","description":"Для документов Office работает только ориентация — остальное задано в самом файле.","properties":{"landscape":{"type":"boolean","description":"Альбомная ориентация."}}}}}]}}}},"responses":{"200":{"description":"Готовый PDF.","headers":{"Idempotency-Key":{"description":"Ключ одного документа. Сохраните до запроса для восстановления после таймаута.","schema":{"type":"string"}},"Idempotency-Replayed":{"description":"true при повторной выдаче без списания.","schema":{"type":"string"}},"X-Result-Expires-At":{"description":"Конец 24-часового срока повторной выдачи (UTC).","schema":{"type":"string"}},"X-Pages-Rendered":{"description":"Сколько страниц списано за этот документ.","schema":{"type":"integer","example":2}},"X-Quota-Limit":{"description":"Лимит страниц текущего периода.","schema":{"type":"integer","example":10000}},"X-Quota-Used":{"description":"Использовано в периоде, включая этот документ.","schema":{"type":"integer","example":145}},"X-Quota-Remaining":{"description":"Осталось в периоде.","schema":{"type":"integer","example":9855}}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Неверный запрос. Коды: `invalid_request` — нет source или содержимого, лишний или неверный параметр в options — имя поля в message; `url_not_allowed` — адрес без http(s) или ведёт во внутреннюю сеть.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"401":{"description":"Ключа нет или он не подходит. Коды: `missing_api_key` — нет заголовка Authorization: Bearer … и X-API-Key; `invalid_api_key` — ключ неверный или отозван.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"402":{"description":"Не хватает страниц в периоде. Коды: `quota_exceeded` — лимит исчерпан или документ больше остатка; страницы не списываются.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"403":{"description":"Нет доступа. Коды: `email_not_verified` — почта аккаунта не подтверждена; `source_not_allowed` — источник недоступен на тарифе: на Free — только HTML.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"409":{"description":"Ключ уже используется. Коды: `idempotency_in_progress` — ещё выполняется, повторите через Retry-After с тем же ключом; `idempotency_conflict` — тело запроса отличается от исходного.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"410":{"description":"Срок хранения PDF истёк. Коды: `result_expired` — новый рендер требует нового ключа.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"413":{"description":"Тело запроса больше 5 МБ. Коды: `payload_too_large` — вынесите картинки по ссылкам или уменьшите файл.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"429":{"description":"Слишком частые запросы с этим ключом. Коды: `rate_limit_exceeded` — запросы чаще лимита тарифа; повторите через Retry-After секунд.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}},"headers":{"Retry-After":{"description":"Через сколько секунд можно повторить.","schema":{"type":"integer","example":3}}}},"502":{"description":"Документ не отрендерился. Коды: `render_failed` — обычно дело в разметке или недоступной странице.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"503":{"description":"Рендер временно недоступен. Коды: `unavailable` — очередь заполнена или рендер перезапускается; повторите позже.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"504":{"description":"Рендер не уложился в 30 секунд. Коды: `render_timeout` — документ слишком тяжёлый или страница грузится долго.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}}}}},"/v1/me":{"get":{"operationId":"me","summary":"Тариф и остаток","tags":["Аккаунт"],"description":"Тариф, расход и остаток страниц в текущем периоде, лимит частоты и границы периода. Страниц не тратит — подходит для мониторинга и cron.","security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Сведения об аккаунте.","content":{"application/json":{"schema":{"type":"object","title":"Account","properties":{"user_id":{"type":"string","format":"uuid","description":"Идентификатор аккаунта."},"plan":{"type":"string","enum":["free","premium","business"],"description":"Действующий тариф: истёкший платный — уже free."},"period":{"type":"string","format":"date","description":"Дата начала периода. Устарело — используйте period_start."},"period_start":{"type":"string","format":"date-time","description":"Начало периода, UTC."},"period_end":{"type":"string","format":"date-time","description":"Когда счётчик страниц начнётся с нуля, UTC."},"usage":{"type":"object","description":"Расход в текущем периоде.","properties":{"pages_used":{"type":"integer","description":"Использовано страниц."},"pages_limit":{"type":"integer","description":"Лимит страниц."},"pages_remaining":{"type":"integer","description":"Осталось страниц."}}},"limits":{"type":"object","description":"Лимит частоты ключа.","properties":{"requests_per_second":{"type":"integer","description":"Запросов в секунду."},"burst":{"type":"integer","description":"Сколько запросов можно подряд, разом."}}}}},"example":{"user_id":"4051d4cc-4ed2-494d-812b-088fc3ac23d3","plan":"premium","period":"2026-10-10","period_start":"2026-10-10T08:30:00.000Z","period_end":"2026-11-10T08:30:00.000Z","usage":{"pages_used":1250,"pages_limit":10000,"pages_remaining":8750},"limits":{"requests_per_second":10,"burst":30}}}}},"401":{"description":"Ключа нет или он не подходит. Коды: `missing_api_key` — нет заголовка Authorization: Bearer … и X-API-Key; `invalid_api_key` — ключ неверный или отозван.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}}},"429":{"description":"Слишком частые запросы с этим ключом. Коды: `rate_limit_exceeded` — запросы чаще лимита тарифа; повторите через Retry-After секунд.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string","description":"Код ошибки — по нему стоит ветвиться в коде.","example":"quota_exceeded"},"message":{"type":"string","description":"Текст по-русски — для журнала и человека.","example":"Лимит страниц исчерпан"}}}}},"headers":{"Retry-After":{"description":"Через сколько секунд можно повторить.","schema":{"type":"integer","example":3}}}}}}},"/health":{"get":{"operationId":"health","summary":"Состояние сервиса","tags":["Сервис"],"description":"Работают ли база, кеш и рендер. Без ключа и без лимита частоты — для мониторинга и страниц статуса.","responses":{"200":{"description":"Всё работает.","content":{"application/json":{"schema":{"type":"object","title":"Health","properties":{"status":{"type":"string","enum":["ok","degraded"],"description":"ok — всё работает."},"postgresOk":{"type":"boolean","description":"База данных отвечает."},"redisOk":{"type":"boolean","description":"Кеш и очередь отвечают."},"renderOk":{"type":"boolean","description":"Рендер (Gotenberg) отвечает."}}},"example":{"status":"ok","postgresOk":true,"redisOk":true,"renderOk":true}}}},"503":{"description":"Что-то из трёх не работает — какое именно, видно по полям *Ok.","content":{"application/json":{"schema":{"type":"object","title":"Health"},"example":{"status":"degraded","postgresOk":true,"redisOk":true,"renderOk":false}}}}}}}}}