API генератора QR-кодов
Один POST-запрос принимает список ссылок и параметры листа, в ответ приходит готовый файл: PDF с сеткой кодов, векторные листы SVG или архив с кодами поштучно. Без регистрации, ключей и оплаты. Ядро то же, что у формы на главной, поэтому файл из API совпадает с файлом из браузера байт в байт при одинаковых параметрах.
Быстрый старт
Эндпоинт один: POST https://qqkod.ru/api/v1/sheets, тело запроса в формате JSON. Успешный ответ сразу отдает файл, ошибки приходят в JSON с кодом и пояснением на русском. Пример: лист A4 с тремя кодами в PDF.
curl -X POST https://qqkod.ru/api/v1/sheets \
-H "Content-Type: application/json" \
-d '{"lines": ["https://example.com/1 Стол 1", "https://example.com/2 Стол 2", "https://example.com/3 Стол 3"], "output": "pdf"}' \
-o qqkod.pdf
Второй пример: коды поштучно в PNG по шаблону ссылки. В поле lines только артикулы, а адрес собирается шаблоном с {value}.
curl -X POST https://qqkod.ru/api/v1/sheets \
-H "Content-Type: application/json" \
-d '{"lines": ["A-101", "A-102", "A-103"], "url_template": "https://example.com/item/{value}", "output": "png"}' \
-o qqkod-png.zip
Параметры
Обязательное поле одно: lines, массив строк или строка с переносами. Каждая строка устроена как строка списка в форме: значение кода, затем через пробел необязательная подпись, которая будет напечатана под кодом. Остальные поля опциональны и совпадают с настройками формы.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
lines |
массив строк или строка | обязательное |
Список кодов. Одна строка это один код: значение, дальше через пробел необязательная подпись. |
content_type |
строка | url |
Тип содержимого: url, text, phone, sms, wifi, vcard, email, ean13. |
url_template |
строка | нет |
Шаблон адреса с {value}: строка списка подставляется на место метки. Работает только при content_type равном url. |
output |
строка | svg |
Формат ответа: pdf, svg, svg_files, png. |
qr_size_cm |
число | 2 |
Сторона кода в сантиметрах, от 1 до 15. У ean13 это ширина штрих-кода: по умолчанию 3.7, от 2.9 до 7.5. |
margin_edge |
число | 1.7 |
Поле от края листа в сантиметрах, от 0 до 9. |
margin_between |
число | 0.6 |
Промежуток между соседними кодами в сантиметрах, от 0.1 до 5. |
frame_margin |
число | 0.3 |
Отступ от кода до рамки в сантиметрах, от 0 до 10. |
border_width |
число | 0.2 |
Толщина рамки в миллиметрах, от 0 до 2. Ноль убирает рамку совсем. |
border_radius |
число | 0.8 |
Скругление углов рамки в миллиметрах, от 0 до 5. |
qr_color |
строка | #000000 |
Цвет кода в HEX. Код должен быть заметно темнее фона, иначе запрос вернет ошибку контраста. |
bg_color |
строка | #ffffff |
Цвет фона в HEX. |
bg_transparent |
логическое | false |
Прозрачный фон вместо цвета. Принимает true и false, а также 1 и 0. |
page_format |
строка | a4 |
Формат листа: a4, a3, letter. |
page_orientation |
строка | portrait |
Ориентация листа: portrait, landscape. |
Типы содержимого те же, что на сайте: url, text, phone, sms, wifi, vcard, email и ean13. Формат строк для каждого типа совпадает с формой, подробности и примеры есть в базе знаний.
Форматы ответа
- pdf: один документ со всеми листами, готов к печати.
- svg: листы с сеткой кодов. Один лист приходит файлом qqkod.svg, несколько собираются в архив qqkod.zip.
- svg_files: каждый код отдельным векторным файлом. Один код приходит файлом, несколько собираются в архив qqkod-svg.zip.
- png: каждый код отдельной картинкой. Один код приходит файлом, несколько собираются в архив qqkod-png.zip.
В успешном ответе есть служебные заголовки X-QQkod-Total-Sheets, X-QQkod-Grid, X-QQkod-Per-Sheet и X-QQkod-Items: по ним видно раскладку тиража без разбора файла.
Ошибки
Ошибки приходят в JSON: поле ok равно false, в error.code машиночитаемый код, в error.message пояснение, в error.fields построчные ошибки списка и полей. При типовых проблемах списка в error.hint лежит диагноз с советом, тот же, что показывает форма на сайте.
| HTTP | Код | Когда |
|---|---|---|
404 |
NOT_FOUND |
Путь внутри /api/v1/ не равен /api/v1/sheets. |
405 |
METHOD_NOT_ALLOWED |
Метод запроса не POST. |
415 |
UNSUPPORTED_MEDIA_TYPE |
Заголовок Content-Type без application/json. |
413 |
PAYLOAD_TOO_LARGE |
Тело запроса больше 2 МБ. |
400 |
BAD_JSON |
Тело не разобралось как JSON или верхний уровень не объект. |
422 |
VALIDATION_ERROR |
Неизвестное поле, ошибка в параметре или в строках списка. |
413 |
BATCH_LIMIT_EXCEEDED |
Список длиннее лимита: 1500 строк или 256 КБ. |
429 |
RATE_LIMITED |
Превышен лимит запросов с одного IP, в ответе есть Retry-After. |
500 |
INTERNAL_ERROR |
Все прочее. |
Лимиты
- до 1500 строк в одном запросе, строка до 2048 символов, список целиком до 256 КБ;
- тело запроса до 2 МБ;
- 10 запросов в минуту и 300 в сутки с одного IP, при превышении вернется 429 с заголовком Retry-After.
Лимиты общие для всех и подобраны так, чтобы их не замечать при штатной работе. Если вашей задаче тесно в этих рамках, напишите нам на info@qqkod.ru: обсудим.
Честные условия
API бесплатный, без регистрации, ключей и водяных знаков. Сгенерированные файлы не хранятся: временный файл удаляется сразу после отдачи ответа. Содержимое кодов в логи не пишется. Логотип в центре кода и живое превью пока доступны только в форме на сайте. Спецификация в формате OpenAPI: /api/openapi.json.