{
  "info": {
    "_postman_id": "bd845844-7dd1-43d4-a65c-138e0f1d5b9b",
    "name": "MkPDF API",
    "description": {
      "content": "# MkPDF API\n\nHTTP API для работы с PDF: конвертация в PDF и из PDF, объединение, разделение, сжатие, защита, водяные знаки, OCR. Документация: https://mkpdf.ru/docs. Спецификация: https://mkpdf.ru/openapi.json.\n\n## Быстрый старт\n\n1. Импортируйте эту коллекцию и одно из окружений (**основной** `api.mkpdf.ru` или **резервный** `api.lt.mkpdf.ru`).\n\n2. Выберите окружение справа вверху и впишите в переменную `api_key` свой API-ключ (создаётся в личном кабинете: https://mkpdf.ru/dashboard). Ключ хранится как секрет.\n\n3. В нужном запросе на вкладке **Body** выберите файл в полях типа File и нажмите **Send**. Необязательные параметры отключены — включайте галочкой.\n\n## Основной и резервный хост\n\n`api.lt.mkpdf.ru` — тот же API через прокси в Латвии, на случай недоступности основного хоста. Пути, параметры и ключ те же; чтобы переключиться, выберите другое окружение.\n\n## Переменные окружения\n\n- `base_url` — хост API;\n- `api_key` — Bearer-ключ (секрет);\n- `pdf_password` — пароль для «Защитить PDF» и «Снять пароль» (секрет);\n- `job_id` — подставляется автоматически после «Распознать текст в документе».\n\n## Лимиты\n\nФайл до 50 МБ, до 100 страниц для конвертаций и 500 для правок; 5 запросов в секунду на ключ (всплеск до 20). Учитываются только успешные операции.",
      "type": "text/markdown"
    },
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Ловим самую частую ошибку до запроса: пустой ключ даёт непонятный 401.",
          "if (!pm.variables.get('api_key')) {",
          "  throw new Error('Не задана переменная api_key: выберите окружение MkPDF и впишите API-ключ (https://mkpdf.ru/dashboard).');",
          "}"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.mkpdf.ru",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Конвертация в PDF",
      "description": {
        "content": "HTML, страницы сайтов, офисные документы и изображения → PDF.",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "HTML → PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf | application/json', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\",\"application/json\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"html\": \"<h1>Счёт №482</h1><p>Итого: 14 300 ₽</p>\",\n  \"options\": {\n    \"format\": \"A4\",\n    \"margin\": \"16mm\",\n    \"landscape\": false\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/convert/html",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "convert",
                "html"
              ]
            },
            "description": {
              "content": "**POST /v1/convert/html**\n\nКонвертирует HTML-разметку в PDF через Chromium — CSS, кастомные шрифты, кириллица из коробки.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "URL → PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf | application/json', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\",\"application/json\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"options\": {\n    \"format\": \"A4\",\n    \"margin\": \"16mm\",\n    \"landscape\": false\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/convert/url",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "convert",
                "url"
              ]
            },
            "description": {
              "content": "**POST /v1/convert/url**\n\nРендерит реальную веб-страницу (вместе с JS и динамическим контентом) в PDF.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "DOCX / XLSX / PPTX → PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": ".docx, .xlsx или .pptx"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/convert/office",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "convert",
                "office"
              ]
            },
            "description": {
              "content": "**POST /v1/convert/office**\n\nКонвертирует офисные документы (docx/doc, xlsx/xls, pptx/ppt, odt/ods/odp, rtf, txt, csv) в PDF через LibreOffice. Лимит 50 МБ.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Изображения → PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "files",
                  "type": "file",
                  "src": [],
                  "description": "До 30 файлов — добавьте ещё строки с ключом `files`."
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/convert/image",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "convert",
                "image"
              ]
            },
            "description": {
              "content": "**POST /v1/convert/image**\n\nJPG/PNG/GIF/BMP/TIFF в один PDF, по странице на изображение, в порядке загрузки. До 30 файлов, до 50 МБ суммарно.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        }
      ]
    },
    {
      "name": "Конвертация из PDF",
      "description": {
        "content": "PDF → Word, PNG, JPG, HTML и текст.",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "PDF → Word",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-word",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-word"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-word**\n\nРедактируемый .docx. Для PDF с текстовым слоем; до 100 страниц.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "PDF → PNG",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: image/png | application/zip', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"image/png\",\"application/zip\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "dpi",
                  "type": "text",
                  "value": "150",
                  "description": "Диапазон: 72–300. По умолчанию: 150.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-png",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-png"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-png**\n\nСтраницы как PNG. Одна страница — image/png, несколько — ZIP (page-1.png, …).\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "PDF → JPG",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: image/jpeg | application/zip', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"image/jpeg\",\"application/zip\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "dpi",
                  "type": "text",
                  "value": "150",
                  "description": "Диапазон: 72–300. По умолчанию: 150.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-jpg",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-jpg"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-jpg**\n\nСтраницы как JPG (качество 90%). Одна страница — image/jpeg, несколько — ZIP.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "PDF → HTML",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: text/html', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"text/html\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-html",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-html"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-html**\n\nОдин самодостаточный HTML-файл с встроенными изображениями.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "PDF → TXT",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: text/plain', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"text/plain\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-text",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-text"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-text**\n\nТекст из документа (UTF-8) с сохранением расположения. Для сканов используйте OCR.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        }
      ]
    },
    {
      "name": "Организация",
      "description": {
        "content": "Объединение, разделение, поворот и сжатие.",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "Объединить PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "files",
                  "type": "file",
                  "src": [],
                  "description": "Повторяющееся поле `files`, минимум 2 PDF Добавьте ещё строки с ключом `files` для остальных файлов."
                },
                {
                  "key": "files",
                  "type": "file",
                  "src": [],
                  "description": "Повторяющееся поле `files`, минимум 2 PDF Добавьте ещё строки с ключом `files` для остальных файлов."
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/merge",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "merge"
              ]
            },
            "description": {
              "content": "**POST /v1/merge**\n\nСклеивает 2 и более PDF в один, в порядке загрузки. Лимит 50 МБ суммарно.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Разделить PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf | application/zip', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\",\"application/zip\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "mode",
                  "type": "text",
                  "value": "pages",
                  "description": "Значения: pages, intervals. По умолчанию: pages.",
                  "disabled": true
                },
                {
                  "key": "span",
                  "type": "text",
                  "value": "1-3, 7",
                  "description": "pages: диапазоны 1-3, 7; intervals: число страниц в части"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/split",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "split"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/split**\n\nmode=pages — извлечь страницы (span, например 1-3, 7) в один PDF; mode=intervals — разделить на части по span страниц (ZIP).\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Повернуть PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "angle",
                  "type": "text",
                  "value": "90",
                  "description": "Значения: 90, 180, 270. По умолчанию: 90.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/rotate",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "rotate"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/rotate**\n\nПоворот всех страниц по часовой стрелке.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Сжать PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "quality",
                  "type": "text",
                  "value": "70",
                  "description": "Диапазон: 10–95. По умолчанию: 70.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/compress",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "compress"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/compress**\n\nПересохраняет изображения внутри PDF как JPEG; текст и вектор не меняются.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        }
      ]
    },
    {
      "name": "Редактирование",
      "description": {
        "content": "Водяные знаки, номера страниц, обрезка, наложение текста и изображений.",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "Водяной знак",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "text",
                  "type": "text",
                  "value": "КОНФИДЕНЦИАЛЬНО",
                  "description": "До 60 символов."
                },
                {
                  "key": "opacity",
                  "type": "text",
                  "value": "0.3",
                  "description": "Диапазон: 0.05–1. По умолчанию: 0.3.",
                  "disabled": true
                },
                {
                  "key": "orientation",
                  "type": "text",
                  "value": "diagonal",
                  "description": "Направление надписи: под 45°, горизонтально, вертикально Значения: diagonal, horizontal, vertical. По умолчанию: diagonal.",
                  "disabled": true
                },
                {
                  "key": "layout",
                  "type": "text",
                  "value": "single",
                  "description": "single — одна крупная надпись по центру; tiled — много маленьких по всей странице Значения: single, tiled. По умолчанию: single.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/watermark",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "watermark"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/watermark**\n\nТекст на каждой странице (латиница и кириллица) — одной крупной надписью или мозаикой, под 45°, горизонтально или вертикально.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Номера страниц",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "position",
                  "type": "text",
                  "value": "bc",
                  "description": "Значения: bl, bc, br, tl, tc, tr. По умолчанию: bc.",
                  "disabled": true
                },
                {
                  "key": "format",
                  "type": "text",
                  "value": "n",
                  "description": "Значения: n, n_of_total, page_n, page_n_ru, dash_n. По умолчанию: n.",
                  "disabled": true
                },
                {
                  "key": "skip_first",
                  "type": "text",
                  "value": "false",
                  "description": "По умолчанию: false.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/page-numbers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "page-numbers"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/page-numbers**\n\nПроставляет номера страниц.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Обрезать PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "top",
                  "type": "text",
                  "value": "0",
                  "description": "процент от высоты страницы Диапазон: 0–90. По умолчанию: 0.",
                  "disabled": true
                },
                {
                  "key": "right",
                  "type": "text",
                  "value": "0",
                  "description": "Диапазон: 0–90. По умолчанию: 0.",
                  "disabled": true
                },
                {
                  "key": "bottom",
                  "type": "text",
                  "value": "0",
                  "description": "Диапазон: 0–90. По умолчанию: 0.",
                  "disabled": true
                },
                {
                  "key": "left",
                  "type": "text",
                  "value": "0",
                  "description": "Диапазон: 0–90. По умолчанию: 0.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/crop",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "crop"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/crop**\n\nОбрезает видимую область; содержимое за границей остаётся в файле.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Наложить текст, изображения и прямоугольники",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "ops",
                  "type": "text",
                  "value": "[{\"type\":\"text\",\"page\":1,\"x\":0.1,\"y\":0.1,\"text\":\"Одобрено\",\"size\":18,\"color\":\"#0a7d33\"}]",
                  "description": "JSON: [{type: text|image|rect, page, x, y, w, h, text, size, bold, color, opacity, image}]"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/edit",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "edit"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/edit**\n\nJSON-массив `ops` до 300 элементов; координаты — доли страницы от левого верхнего угла. Графическое наложение, не электронная подпись.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        }
      ]
    },
    {
      "name": "Защита и архив",
      "description": {
        "content": "Пароль на PDF, снятие пароля, PDF/A.",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "Защитить PDF паролем",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "password",
                  "type": "text",
                  "value": "{{pdf_password}}",
                  "description": "До 128 символов."
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/protect",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "protect"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/protect**\n\nШифрует PDF; пароль не сохраняется и не логируется.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "Снять пароль с PDF",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "password",
                  "type": "text",
                  "value": "{{pdf_password}}",
                  "description": "До 128 символов.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/unlock",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "unlock"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/unlock**\n\nСнимает пароль с файла, который вы можете открыть; пароль владельца (ограничения на копирование/печать) снимается и без пароля. Пароли не подбираются.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        },
        {
          "name": "PDF → PDF/A",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/pdf', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/pdf\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF, до 50 МБ"
                },
                {
                  "key": "level",
                  "type": "text",
                  "value": "2b",
                  "description": "Значения: 1b, 2b, 3b. По умолчанию: 2b.",
                  "disabled": true
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/pdf/to-pdfa",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "pdf",
                "to-pdfa"
              ]
            },
            "description": {
              "content": "**POST /v1/pdf/to-pdfa**\n\nФормат долговременного хранения.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          }
        }
      ]
    },
    {
      "name": "OCR",
      "description": {
        "content": "Распознавание текста: синхронно для одного изображения и асинхронно для документов (после постановки задачи `job_id` сохраняется в переменную окружения).",
        "type": "text/markdown"
      },
      "item": [
        {
          "name": "Распознать текст с изображения (синхронно)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/json', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/json\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PNG, JPEG, WEBP или PDF, до 10 МБ"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/ocr/image",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "ocr",
                "image"
              ]
            },
            "description": {
              "content": "**POST /v1/ocr/image**\n\nОдно изображение или PDF ≤10 МБ — ответ сразу. Для больших/многостраничных файлов см. `/v1/ocr/document`.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": [],
                      "description": "PNG, JPEG, WEBP или PDF, до 10 МБ"
                    }
                  ]
                },
                "url": {
                  "raw": "{{base_url}}/v1/ocr/image",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "ocr",
                    "image"
                  ]
                },
                "description": {
                  "content": "**POST /v1/ocr/image**\n\nОдно изображение или PDF ≤10 МБ — ответ сразу. Для больших/многостраничных файлов см. `/v1/ocr/document`.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
                  "type": "text/markdown"
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"text\": \"Распознанный текст\",\n  \"lines\": [\n    {\n      \"text\": \"Распознанный текст\",\n      \"score\": 0.98,\n      \"box\": [\n        2,\n        0,\n        320,\n        23\n      ]\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Распознать текст в документе (асинхронно)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 202', () => pm.response.to.have.status(202));",
                  "pm.test('Content-Type: application/json', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/json\"].some((t) => type.includes(t))).to.be.true;",
                  "});",
                  "// Запоминаем задачу для запроса «Статус и результат…»",
                  "if (pm.response.code === 202) pm.environment.set('job_id', pm.response.json().job_id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "PDF или изображение, до 50 МБ"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/v1/ocr/document",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "ocr",
                "document"
              ]
            },
            "description": {
              "content": "**POST /v1/ocr/document**\n\nМногостраничный PDF, набор изображений или файл больше 10 МБ — асинхронно: сразу возвращается `job_id`, результат забирается через `GET /v1/jobs/{id}`. Лимит 50 МБ. Квота списывается только при успешном завершении задачи, не при постановке в очередь.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": [],
                      "description": "PDF или изображение, до 50 МБ"
                    }
                  ]
                },
                "url": {
                  "raw": "{{base_url}}/v1/ocr/document",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "ocr",
                    "document"
                  ]
                },
                "description": {
                  "content": "**POST /v1/ocr/document**\n\nМногостраничный PDF, набор изображений или файл больше 10 МБ — асинхронно: сразу возвращается `job_id`, результат забирается через `GET /v1/jobs/{id}`. Лимит 50 МБ. Квота списывается только при успешном завершении задачи, не при постановке в очередь.\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
                  "type": "text/markdown"
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"job_id\": \"b3f1...\",\n  \"status\": \"queued\"\n}"
            }
          ]
        },
        {
          "name": "Статус и результат асинхронной OCR-задачи",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Статус 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type: application/json', () => {",
                  "  const type = pm.response.headers.get('Content-Type') || '';",
                  "  pm.expect([\"application/json\"].some((t) => type.includes(t))).to.be.true;",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/jobs/{{job_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "jobs",
                "{{job_id}}"
              ]
            },
            "description": {
              "content": "**GET /v1/jobs/{id}**\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
              "type": "text/markdown"
            }
          },
          "response": [
            {
              "name": "200 OK (done)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{base_url}}/v1/jobs/{{job_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "jobs",
                    "{{job_id}}"
                  ]
                },
                "description": {
                  "content": "**GET /v1/jobs/{id}**\n\nОшибки: `400` некорректный запрос, `401` нет или неверен ключ, `413` слишком много страниц, `422` PDF защищён паролем или повреждён, `429` rate limit или квота, `502` сбой движка.",
                  "type": "text/markdown"
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"b3f1...\",\n  \"status\": \"done\",\n  \"result\": {\n    \"pages\": [\n      {\n        \"page\": 1,\n        \"text\": \"...\",\n        \"lines\": [\n          {\n            \"text\": \"...\",\n            \"score\": 0.97,\n            \"box\": [\n              0,\n              0,\n              100,\n              20\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}"
            }
          ]
        }
      ]
    }
  ]
}
