API для Codex-публикации документов
Публичная справка по реестру КП, счетов и закрывашек. Здесь нет секретов: API-ключи хранятся только локально у Codex.
Скачать helper
Эти файлы публичные и не содержат рабочего API-ключа. Ключ нужно добавить локально отдельным файлом или через переменную окружения.
Быстрый старт с нуля
- Скачай helper выше или скопируй готовый
codex_document_sync.py. Путь может быть любым: дальше он обозначается как<helper>. - Создай локальный файл ключа рядом с helper-проектом или укажи путь через
ONEDESK_API_KEY_FILE. Формат файла ниже; настоящий ключ не показывать в ответах. - Проверь, что helper запускается:
python <helper> ping. - Если
pingвернулok=trueиdocuments_schema_ready=true, можно смотреть список карточек, читать карточки, скачивать файлы, резервировать номера, публиковать и делатьpatch-metadata.
source_code=codex_docs
api_base=https://za.a-rial.ru
api_key=ВСТАВИТЬ_СЮДА_API_КЛЮЧ
База и авторизация
- Base URL
https://za.a-rial.ru- API v1
/api/v1/documents/...- Legacy
/api/documents/...пока остается совместимым алиасом- Auth
Authorization: Bearer <api_key>- Source
source_code=codex_docsв JSON payload
Ключ берется из переменной ONEDESK_API_KEY, файла ONEDESK_API_KEY_FILE или локального файла helper-проекта secrets/codex-documents-api-key.txt.
Типы документов
kp- коммерческие предложения, номера строгоКП-YYYYMMDD-NN.invoice- счета, номером служит локальныйinvoice_id.closing- закрывающие комплекты, номером служит локальныйclosing_id.
Для КП сервер проверяет настоящие кириллические буквы КП. Если префикс похожий, но не русский, API вернет kp_number_invalid.
Endpoint: ping
Безопасная проверка подключения. Не создает резерв, не публикует файлы и не меняет карточки.
POST /api/v1/documents/ping
{
"source_code": "codex_docs"
}
Успешный ответ содержит ok=true, documents_schema_ready, список типов документов, время сервера и лимиты загрузки.
{
"ok": true,
"request_id": "req_20260704130303_ab12cd34ef56ab78",
"service": "onedesk_documents",
"source_code": "codex_docs",
"documents_schema_ready": true,
"document_types": ["kp", "invoice", "closing"],
"server_time": "2026-07-04 13:03:03"
}
Endpoint: list
Возвращает список карточек текущего source_code с фильтрами и пагинацией. По умолчанию файлы и события не включаются, чтобы список был легким.
POST /api/v1/documents/list
{
"source_code": "codex_docs",
"document_type": "kp",
"q": "client",
"status": "issued",
"date_from": "2026-07-01",
"date_to": "2026-07-04",
"page": 1,
"per_page": 25,
"include_files": false
}
{
"ok": true,
"request_id": "req_...",
"total": 41,
"page": 1,
"per_page": 25,
"pages": 2,
"documents": [
{
"document_uid": "KP-client_subject_20260704",
"document_type": "kp",
"local_id": "client_subject_20260704",
"document_no": "КП-20260704-01",
"title": "КП для клиента",
"client_name": "ООО Клиент",
"files_count": 6,
"files_total_bytes": 1234567,
"card_url": "https://za.a-rial.ru/documents/KP-client_subject_20260704"
}
]
}
Endpoint: get
Возвращает карточку документа, метаданные и список файлов без скачивания содержимого.
POST /api/v1/documents/get
{
"source_code": "codex_docs",
"document_uid": "KP-client_subject_20260704",
"include_files": true,
"include_events": false
}
{
"ok": true,
"request_id": "req_...",
"document": {
"document_uid": "KP-client_subject_20260704",
"document_type": "kp",
"local_id": "client_subject_20260704",
"document_no": "КП-20260704-01",
"metadata": {},
"files": [
{
"id": 123,
"label": "КП.pdf",
"original_name": "КП.pdf",
"relative_path": "КП.pdf",
"mime_type": "application/pdf",
"size_bytes": 123456,
"sha256": "...",
"preview_kind": "pdf"
}
]
}
}
Endpoint: download-file
Скачивает конкретный файл документа по file_id. Ответ бинарный; request_id возвращается в заголовке X-Request-ID.
POST /api/v1/documents/download-file
{
"source_code": "codex_docs",
"document_uid": "KP-client_subject_20260704",
"file_id": 123
}
Если файл найден и доступен этому source_code, сервер отдает Content-Type, Content-Disposition, X-OneDesk-SHA256 и содержимое файла. Для ошибок ответ остается JSON.
Endpoint: reserve-number
Резервирует номер перед выпуском финального комплекта и ловит гонки между несколькими Codex.
POST /api/v1/documents/reserve-number
{
"source_code": "codex_docs",
"document_type": "kp",
"document_no": "КП-20260704-01",
"local_id": "client_subject_20260704",
"ttl_seconds": 3600
}
Успешный ответ содержит reservation_token. Его можно передать в publish, но обычно helper делает это сам.
{
"ok": true,
"request_id": "req_...",
"reserved": true,
"document_type": "kp",
"document_no": "КП-20260704-01",
"local_id": "client_subject_20260704",
"reservation_token": "...",
"expires_at": "2026-07-04 14:03:03"
}
Endpoint: publish
Создает или обновляет карточку документа и загружает финальные файлы. Повторная публикация идемпотентна по связке source_code + document_type + local_id.
POST /api/v1/documents/publish
{
"source_code": "codex_docs",
"reservation_token": "...",
"document": {
"document_type": "kp",
"local_id": "client_subject_20260704",
"document_no": "КП-20260704-01",
"title": "КП для клиента",
"client_name": "ООО Клиент",
"object_title": "Объект / предмет",
"amount_text": "7 500 руб. с НДС 5%",
"status": "issued",
"workspace_path": "D:\\Загрузки\\10_codex_Kp\\outputs\\client_subject_20260704",
"metadata": {
"contact_name": "Иван Иванов",
"contact_email": "client@example.ru"
}
},
"files": [
{
"group_code": "final",
"label": "КП.pdf",
"original_name": "КП.pdf",
"relative_path": "КП.pdf",
"mime": "application/pdf",
"size_bytes": 123456,
"sha256": "optional-client-side-sha256",
"content_base64": "..."
}
]
}
{
"ok": true,
"request_id": "req_...",
"created": true,
"document_uid": "KP-client_subject_20260704",
"document_no": "КП-20260704-01",
"local_id": "client_subject_20260704",
"card_url": "https://za.a-rial.ru/documents/KP-client_subject_20260704",
"files": {
"count": 6,
"total_bytes": 1234567,
"largest_bytes": 345678
}
}
Endpoint: patch-metadata
Используется для старых карточек, когда нужно добавить контакты или поправить метаданные без перезаливки файлов и без сдвига исторических дат.
POST /api/v1/documents/patch-metadata
{
"source_code": "codex_docs",
"document_uid": "KP-client_subject_20260704",
"metadata_patch": {
"contact_name": "Иван Иванов",
"contact_email": "client@example.ru",
"contact_source": "README.md"
},
"preserve_dates": true,
"dry_run": true
}
Сначала запускать с dry_run=true. Если ответ успешный, повторить без dry_run.
{
"ok": true,
"request_id": "req_...",
"dry_run": true,
"document_uid": "KP-client_subject_20260704",
"metadata_keys": ["contact_name", "contact_email", "contact_source"],
"preserve_dates": true,
"card_url": "https://za.a-rial.ru/documents/KP-client_subject_20260704"
}
Идемпотентность и retry
publishидемпотентен по связкеsource_code + document_type + local_id.- Повтор с тем же
local_idобновляет существующую карточку и заменяет/дополняет файловый комплект согласно payload helper. - Если тот же
document_noуже опубликован другимlocal_id, API возвращает409 number_taken. - Если номер зарезервирован другим выпуском, API возвращает
409 number_reserved. - После успешного
publishиспользованный резерв помечаетсяconsumed. Истекший или несовпадающий токен даетreservation_invalid. - При сетевой ошибке helper сохраняет JSON payload в локальную очередь;
retryпереотправляет payload и при необходимости обновляет reservation token.
Helper-команды
Путь к helper может быть любым. В командах ниже <helper> - это локальный путь к codex_document_sync.py.
python <helper> ping
python <helper> list --type kp --per-page 20
python <helper> get --document-uid KP-client_subject_20260704
python <helper> download-file --document-uid KP-client_subject_20260704 --file-id 123 --output D:\Temp
python <helper> reserve <folder> --type kp --document-no <номер>
python <helper> publish <folder> --type kp
python <helper> patch-metadata <folder> --from-metadata --dry-run
python <helper> patch-metadata <folder> --from-metadata
python <helper> retry
Если helper лежит не в стандартном месте, просто использовать фактический путь или задать переменные окружения ONEDESK_API_KEY_FILE и ONEDESK_API_BASE.
Файлы и очередь
- Публикуется финальный комплект, а не вся рабочая папка.
- Обычно нужны
PDF,DOCX,XLSX,TSV,README,notes,metadata.yml. - Служебные папки
tmp,cache,source,logs,_render,_previewне считать финальным комплектом. - Если сервер недоступен, helper кладет payload в локальную очередь и позже отправляет через
retry.
HTTP-статусы и ошибки
401 unauthorizedНет Bearer-ключа, неверный ключ или неверный source_code.405 method_not_allowedEndpoint принимает только POST.413 payload_too_largeJSON body или файловый комплект слишком большой.422 kp_number_invalidВ КП-номере не настоящие кириллические КП или формат не КП-YYYYMMDD-NN.422 files_invalidФайл слишком большой, битый base64, запрещенный MIME или превышены лимиты комплекта.422 file_id_requiredДля download-file не передан числовой file_id.409 number_takenНомер уже опубликован другим локальным документом.409 number_reservedНомер временно зарезервирован другим выпуском.409 reservation_invalidТокен резерва не совпал с номером или истек.404 document_not_foundКарточка не найдена или не принадлежит текущему source_code.404 file_not_foundФайл не найден в указанной карточке или отсутствует в storage.503 schema_not_readyДокументные таблицы OneDesk еще не развернуты или недоступны.Каждый JSON-ответ содержит request_id; тот же идентификатор отдается в заголовке X-Request-ID. При разборе ошибок сохранять его в сообщении пользователю.
{
"ok": false,
"error": "number_taken",
"request_id": "req_...",
"document_uid": "KP-existing_document"
}
Формат файлов
Текущий v1-контракт принимает файлы внутри JSON как content_base64. Это удобно для Codex/helper и небольших комплектов; multipart/chunk upload пока не используется.
{
"group_code": "final",
"label": "КП.pdf",
"original_name": "КП.pdf",
"relative_path": "КП.pdf",
"mime": "application/pdf",
"size_bytes": 123456,
"sha256": "optional-client-side-sha256",
"content_base64": "..."
}
Сервер сохраняет собственный sha256, размер и MIME. Клиентские size_bytes/sha256 можно передавать как ожидаемые значения для диагностики, но источник истины - серверная проверка сохраненного файла.
Правила безопасности
Не делать прямые SQL-правки, удаление карточек, чистку очереди и повторную отправку чужих payload без явного разрешения пользователя.