Пятый фактор

Документация · v2

API сертификатов
и деклараций

HTTPS, POST, JSON в UTF-8. Авторизация: Authorization: Bearer ВАШ_ТОКЕН.

Для интеграции с 1С и сайтом

API принимает один поисковый запрос или запрос одной карточки документа за обращение. Загрузка прайса и пакетная обработка не поддерживаются. Поиск на сайте и API используют общий поисковый обработчик. Прежние search/ и document/ продолжают работать без изменения формата.

По одному поисковому запросу может быть найдено несколько документов-кандидатов. Карточки запрашиваются по одной; совпадение не подтверждает применимость документа автоматически.

Полный справочник интегратора · OpenAPI 3.1 · Пример Python · Шаблон для 1С

В поиске также доступны проверенные СГР — свидетельства о государственной регистрации. Они передаются отдельно в additional_documents, с типом state_registration, строковым ID, объяснением совпадения и ссылкой на официальный реестр. Это пока подборка проверенных источников, не полный реестр СГР. Старые методы document/* эти ID не принимают.

У СГР status_verified означает сверку официальной записи не старше 7 дней; дата передана в status_checked_at. Неизвестные и аннулированные документы не попадают в «Только действующие». СГР не входят в прежние state и pagination.total: проверяйте отдельный массив даже при пустом results. Полный формат, ограничения и ссылки на проверенные PDF/JPG/PNG описаны в справочнике.

В поисковый query можно вставить официальную ссылку NSI на СГР: поиск проверит её в локальной подборке. Отсутствие совпадения не означает отсутствия документа в реестре. Если сохранённый статус СС/ДС противоречит датам, это отдельно отмечается в status_date_check; исходный status сохраняется.

В additional_documents также бывают information_letter и voluntary_certificate с ролью supporting_only и ID support:…. Это отдельные вспомогательные источники, не замена СС/ДС/СГР и не доказательство отсутствия требований. У них не утверждается действующий статус. Они показываются отдельно при «Только действующие», но исключаются явным фильтром status. Неизвестные дата и изготовитель остаются null.

Подбор объясняет matched_patterns — совпадение с явно указанной серией, маской или диапазоном. Это не точное присутствие артикула. match_confidence отражает силу совпадения текста, а не вероятность, официальный статус или применимость к поставке.

Получить документ

Для части документов доступен массив attachment_evidence: ссылка на внешний PDF, номер проверенной страницы, SHA-256 файла и дата сверки. В режиме product_match вручную проверенные товарные фрагменты PDF участвуют в подборе; источник совпадения — reviewed_attachment. Полный OCR и оригиналы API не выдаёт. Сверенная страница не подтверждает текущий статус или применимость к вашей поставке.

curl 'https://app.deteml.ru/api/v2/registry/document/' \
  -H 'Authorization: Bearer ВАШ_ТОКЕН' \
  -H 'Content-Type: application/json' \
  -d '{"number":"ЕАЭС N RU Д-CN.РА08.В.23691/23","registry":"rds"}'

number — номер документа. Необязательный registry: rss — сертификаты РФ, rds — декларации РФ, reaeu — ЕАЭС.

Тип реестра по номеру угадывать не нужно: без registry проверяются все три. Вместо номера можно передать официальную ссылку, ID результата поиска или ID записи вместе с реестром:

{"url":"https://pub.fsa.gov.ru/rds/declaration/view/10234567"}
{"id":12345}
{"registry":"rds","external_id":"10234567"}

ID в примерах условные. Указывайте только один способ: number, url, id или external_id. Ссылки разбираются локально, без обращения к Росаккредитации.

Поле ответаСодержание
catalogНомер, статус, даты, продукция, изготовитель, коды. Статус находится в catalog.status.
detailsПодробная карточка в структуре соответствующего реестра либо null.
coverage.leveldetailed — есть подробная карточка; basic — только каталог.
catalog.updated_atДата изменения записи, переданная источником. Не дата онлайн-проверки статуса.
coverage.details_fetched_atДата получения подробной карточки.
request_idИдентификатор запроса для поддержки.

Если подробной карточки ещё нет, ответ остаётся успешным: details: null, coverage.level: basic. Это не ошибка.

Персональные поля и содержимое вложений исключены. Наличие остальных полей зависит от исходного документа. Подробная карточка — сохранённый снимок, а не запрос в реестр в момент обращения.

Найти документы

POST https://app.deteml.ru/api/v2/registry/search/

{"query":"насос водяной","current_documents_only":true}

Либо несколько отдельных полей, без query:

{"article":"AB-123","manufacturer":"Название завода"}

Если известны несколько признаков товара, их можно передать одной строкой. Поиск проверяет слова в названии, артикуле, модели, бренде и GTIN одной товарной позиции:

{"product_query":"MANN WK8205"}

product_query работает по доступным подробным карточкам. Для строго заданного артикула используйте article; он также проверяется в основном каталоге. Поиск не подбирает «похожий» артикул и не подтверждает применимость документа автоматически.

Подобрать варианты по названию товара

{"mode":"product_match","product_query":"Масло моторное ARECA F7003 5W-30 5л"}
{"mode":"product_match","product_query":"MANN WK8205","category":"fuel_filter"}

Этот режим разбирает одну строку прайса, ищет по коду, бренду, серии и виду товара и возвращает до 20 вариантов за запрос. Поле brand уточняет бренд; article передаёт отдельный артикул из прайса, category — вид товара (полный справочник в OpenAPI). Можно использовать фильтры реестра, статуса и дат. Другие точные поля с этим режимом не сочетаются. Обычный поиск mode: fields сохраняет строгие условия.

Для более глубокого поиска повторите те же поля с cursor: pagination.next_cursor. Найденное сохраняйте у себя, объединяя ответы по id: более точное совпадение может обновить ранее выданный документ. Пустой results при наличии курсора не означает отсутствие вариантов. Курсор действует час, привязан к условиям, версии алгоритма и индекса. Продолжение — обычный запрос с обычным списанием лимита; загрузки прайса и пакетного API нет.

{"mode":"product_match","product_query":"Valvoline SYNPOWER XL-III SAE 5W-30 4л","article":"842359","cursor":"ЗНАЧЕНИЕ_NEXT_CURSOR_ИЗ_ОТВЕТА"}

results[].product_match содержит tier: identifier — найден код или модель, brand_series — совпали бренд и серия, type_brand — бренд и вид товара, type — только вид товара, catalog — дополнительная подсказка по каталожной записи. labels объясняет совпадение, unverified перечисляет несверенные признаки; source_path и evidence_source указывают источник. Каталожная подсказка не подтверждает связь модели с отдельной товарной позицией. Код в описании не равнозначен явному полю артикула: проверяйте match_basis и explicit_identifiers.

search.retrieval_complete означает завершение предусмотренных веток подбора, но не доказательство полноты всей базы или применимости документа: scope_complete остаётся false, total — null. retrieval_channels показывает продолжение, ограничения, тайм-ауты и счётчики причин отсева. Не интерпретируйте отсутствие результата как «сертификат не нужен».

Это подборка кандидатов, а не доказательство полноты: scope_complete: false, total: null, total_is_exact: false. Продолжайте тот же запрос с next_cursor, пока он есть, в том числе после пустой страницы. Не ограничивайте поиск тремя шагами. completed_channels, remaining_channels, failed_channels и total_channels показывают ход проверки. Даже без курсора при retrieval_complete: false поиск не завершён: его следует повторить позже. Пустая подборка не доказывает отсутствие документа или обязанности подтверждения соответствия. Применимость, изготовитель и область действия проверяются перед привязкой; applicability_verified всегда false. Векторный поиск в рабочей версии не включён. Один запрос — один товар, загрузка списков через API не поддерживается.

identifier_unverified — дополнительный уровень кандидата: специфичный код совпал, но в товарной позиции не указан бренд. Сверьте бренд и изготовителя отдельно; явно чужой бренд или противоречащий вид товара не допускаются. search.input_issues содержит подсказки о сомнительных или противоречивых данных прайса, не меняя исходных значений.

Пробелы и дефисы в кодах сопоставляются без потери ведущих нулей: WK8205, WK 8205, WK-8205. Буква O и цифра 0 не заменяются. Для названий товаров учитываются русские словоформы в подробном индексе; краткий каталог остаётся отдельным каналом с более ограниченными данными.

Для компании с неизвестной ролью: organization — название изготовителя или заявителя, organization_inn — точный ИНН организации. При совместной передаче названия и ИНН они должны совпасть в одной роли. Эти поля не объединяют юридические лица с похожими названиями.

{"organization_inn":"7701234567","current_documents_only":false}
{"external_id":"10234567","registry":"rds","current_documents_only":false}

ID в реестре требует registry и не сочетается с другими поисковыми полями. Для поиска по номеру или ссылке старого документа явно передайте current_documents_only: false: значение API по умолчанию — true.

Поля: number, product, article, gtin, model, brand, manufacturer, applicant, manufacturer_inn, applicant_inn, production_address, tnved, regulation. Все заполненные поля учитываются вместе.

Дополнительно: authority — орган по сертификации, laboratory — лаборатория, protocol — номер протокола, protocol_date — дата протокола, standard — стандарт, scheme — схема ЕАЭС, country — страна изготовителя или площадки, related_document — заменяемый документ, supporting_document — подтверждающие документы. Внутренние числовые ID справочников не преобразуются в названия без подтверждённого соответствия.

gtin передавайте строкой, чтобы сохранить начальные нули. Ищутся только коды, явно указанные в подробной карточке; артикул не преобразуется в штрихкод.

Фильтры: registry, document_type (certificate, declaration), status (active, expired, suspended, terminated, cancelled, archived). Для недействующих документов укажите current_documents_only: false. Даты в формате YYYY-MM-DD: registered_from, registered_to, expires_from, expires_to.

До 20 документов на страницу. Для следующей страницы повторите те же поля и добавьте cursor из pagination.next_cursor. Ограничения в пять страниц нет. Курсор действует час и привязан к запросу и версии индекса; при invalid_cursor начните поиск заново.

{"article":"AB-123","manufacturer":"Название завода","cursor":"ЗНАЧЕНИЕ_NEXT_CURSOR_ИЗ_ОТВЕТА"}

results — краткие карточки, evidence — поле и фрагмент совпадения. Полную сохранённую структуру получите методом document/ по ID результата. pagination.total равно null, пока полный итог не известен. Окончательное число сопровождается total_is_exact: true.

matched_products показывает до трёх совпавших товарных позиций. Несколько условий на товар проверяются в пределах одной позиции, если источник содержит такую структуру. related_searches содержит поля для нового поиска по организации, бренду или площадке; только exact_organization: true указывает на переход по ИНН. Это подсказки поиска, не доказательство применимости документа.

match_basis: "explicit_identifier" — код указан в поле артикула, модели или GTIN; "description_code" — найден только в описании позиции. suggestions — варианты нового запроса, которые не выполняются автоматически. Семантический эксперимент не включён в публичную выдачу: search.vector_used остаётся false.

matched_product_evidence соответствует позициям в matched_products: source_path указывает место в исходной структуре, matched_fields — совпавшие поля. applicability_verified: false означает, что поиск не подтверждает применимость документа к товару.

Размеры вроде 3×2,5 проверяются целиком. Бренд учитывается также при явном указании торговой марки в описании той же товарной позиции. Нормализация не заменяет буквы артикула цифрами.

search.interpretation поясняет распознанный номер документа или тип продукции, search.algorithm_version указывает версию поиска. Подсказки в suggestions не выполняются автоматически. Если подсказка предлагает убрать объём или массу, её notice нужно показать пользователю: этот признак при повторном запросе не проверяется.

relationships содержит только явно указанные связи источника. kind: "replaces" означает, что найденный документ выпущен взамен указанного номера. Пустой список не доказывает отсутствие замены. Внутренние ID источника не преобразуются в неподтверждённые ссылки.

Подсказки suggestions могут расширять поиск: например, искать артикул также в модели и описании. Для выбранной подсказки примените remove_fields, затем fields; сохраните фильтры, уберите старый cursor. Это отдельный запрос с обычным списанием лимита. Значимые окончания кодов автоматически не отбрасываются.

Сначала возвращаются совпадения подробной базы, затем дополнительные совпадения краткого каталога без повторов. Пустая страница с next_cursor и состоянием continuing означает продолжение просмотра, а не отсутствие документов. search.degraded: true означает неполную проверку: уточните запрос или повторите позже; такую выдачу нельзя считать окончательной.

search.catalog_snapshot_at — дата снимка каталога для индекса, search.index_built_at — дата построения индекса. Они не подтверждают свежую проверку статуса в Росаккредитации. search.status_checked_at: null означает, что подтверждённой даты такой проверки нет.

Расширенный поиск работает по загруженной подробной активной базе. Основные поля ищутся также в каталоге, включая архив, если передать current_documents_only: false. Совпадение текста само по себе не подтверждает применимость документа к товару.

Ошибки и лимиты

HTTPЧто делать
400Проверить поля запроса.
401Проверить токен.
404Документ не найден в каталоге.
409Номер неоднозначен. Выбрать id из списка candidates либо уточнить реестр.
429Повторить через число секунд из заголовка Retry-After.
503Временная недоступность. Повторить позже, передать поддержке request_id.

X-RateLimit-Remaining показывает остаток. Авторизованные запросы, включая ошибочные, расходуют лимит. При 429 не делайте частые повторные попытки.

При нулевом остатке X-RateLimit-Next-Request содержит время освобождения ближайшего запроса — Unix timestamp в секундах. Пока лимит не исчерпан, это время текущего запроса. Новые обращения с общего IP могут увеличить ожидание.

Токен

Храните его на сервере вашей системы, не в браузерном коде. Для замены подтвердите прежнюю почту: ID сохранится, старый токен отключится.

Существующие интеграции по API v1 продолжают работать отдельно, со своими ключами и условиями.