Страница для ИТ-специалистов, интеграторов и тех, кто проверяет нас на прочность: ключи, аттестация, что работает без сети, замеры независимости, код проверки, C2PA, данные и API.
Коротко и про бизнес — на странице «Как это работает». Всё, что здесь утверждается, можно повторить самому: файл проверяется в браузере, код проверки открыт.
Четыре разных ключа, которые не надо путать; защищённая область процессора, аттестация, порядок действий от кнопки до вердикта; что работает без сети, а что нет.
Перейти → 02Схема вердикта и границы защиты. Замеры: ноль обращений к сети, 42 мс до вердикта, перебор из 279 способов испортить съёмку. Код проверки, который можно прочитать, и как повторить замеры самому.
Перейти → 03Метка приложения, подпись издателя (C2PA) и подпись устройства — три разных ответа на три разных вопроса. Что уходит с телефона, куда попадает и кто это видит, байт за байтом.
Перейти → 04Выпуск кодов из своей системы, статусы заявок, проверка файла запросом, вебхуки. Примеры запросов и ответов, лимиты, документация.
Перейти →Дальше слово «ключ» встретится в четырёх смыслах, и это честно сбивает. Они не заменяют друг друга и живут в разных местах: один вы никогда не увидите, второй выдаёте человеку, третий вставляете в свою программу, четвёртый отдаёте нам сами.
| Что за ключ | Зачем он | Где живёт и кто его видит | Что будет, если потерять |
|---|---|---|---|
| Ключ внутри телефона | Им телефон подписывает кадр в момент съёмки. Это тот самый ключ, из-за которого подпись нельзя поставить задним числом | В защищённом чипе аппарата. Его не видит никто: ни вы, ни сотрудник, ни мы — он физически не может покинуть чип | Потерять нельзя. При сбросе телефона к заводским настройкам он уничтожается, и новая съёмка идёт с новым ключом |
| Ключ сотрудника | Строка вида TV-1234-5678, по которой приложение понимает, что съёмка ваша и на каком она тарифе | Выдаётся в кабинете и вводится в приложении один раз. Видите вы и тот сотрудник, которому он выдан | Отзываете в кабинете и выпускаете новый. Уже снятые файлы остаются подлинными: подпись в них ставил чип, а не этот ключ |
| Ключ API | Пароль вашей программы к нашему серверу: по нему CRM или 1С выпускает коды на съёмку и проверяет файлы | В настройках вашей системы. Человеку не выдаётся, в телефон не вводится | Отзываете в кабинете, раздел «Интеграции и API», и создаёте новый. На съёмку и на выданные ключи это не влияет |
| Ключ доступа к вашему хранилищу | Нужен, только если включена доставка файлов: им мы кладём готовые съёмки в ваш Яндекс.Диск | Вы выдаёте его нам сами в кабинете. Мы им только пишем в отведённую папку и ничего не читаем сверх этого | Отзываете на стороне Яндекса. Доставка остановится, съёмка и проверка — нет |
| Разовый код — не ключ | Одна съёмка для чужого человека: подрядчика, клиента, курьера. С условиями — что снять, в каком качестве и до какого часа | Отправляете ссылкой или сообщением. Приложение по нему работает без установки ключа | Выпускаете новый. Старый истечёт сам: у кода есть срок и он одноразовый |
Ключ внутри телефона ставит подпись, ключ сотрудника говорит, чья съёмка, ключ API пускает вашу программу, ключ хранилища — нас к вашей папке. Потерять непоправимо нельзя ни один: три отзываются и выпускаются заново, а первый и не покидает чип.
В электронике та же идея. Ключ, которым ставится печать, живёт в защищённой области процессора телефона и никогда её не покидает. А справку о том, что ключ действительно родился там, выдаёт производитель телефона или Google — не мы.
Эта справка называется аттестацией; слово встретится ниже не раз.
Защищённый чип — не наше изобретение, а часть Android, которая складывалась десять лет. Мы только пользуемся тем, что производители уже встроили в современные телефоны.
Android 4.3: у приложений появилось системное хранилище ключей. Ключ создаёт система, приложение может только попросить «подпиши вот это».
Android 7: чип научился выдавать справку о ключе — где он создан и каким приложением, — подписанную ключом производителя или Google. Через год такая справка стала обязательной для устройств с Google Play.
Android 9: отдельный защищённый чип — ещё одна ступень защиты, устойчивая и к атаке на само железо. Где он есть, наш ключ создаётся в нём.
С этой версии приложение работает на обычном смартфоне сотрудника — по данным Google, это более 95 % активных Android-устройств. Съёмка — только на Android; проверить файл можно и с iPhone, проверка идёт в браузере.
TrustVisor фиксирует ключевые данные прямо в момент съёмки и добавляет к файлу подпись устройства. Файл можно передавать как угодно — доказательство остаётся с ним навсегда.
Порядок тут важен. Сначала приложение берёт у нашего сервера разовое подтверждение момента, и только потом создаёт аппаратный ключ в защищённой области процессора — подтверждение вшивается прямо в справку об этом ключе, поэтому задним числом его туда не подставить. Ключ физически не покидает устройство: скопировать его или подписать что-то «от имени» чужого телефона нельзя.
Подпись покрывает содержимое файла (его отпечаток) и данные момента съёмки — время начала и конца, при включённой геолокации — координаты. Изменить хоть один байт после этого — подпись перестаёт сходиться.
В аттестацию встраивается разовое подтверждение от нашего сервера: ключ создан не раньше этого момента — иначе можно было бы заранее «наготовить» подписей впрок. Подтверждение действует срок, который задаёт компания, — по умолчанию 12 часов — и обновляется, пока есть связь. Вместе с ним телефон запоминает наше время и показание счётчика с момента загрузки, поэтому момент съёмки считается по серверным часам, а не берётся с часов телефона. Сам файл на сервер не уходит.
Файл можно отправить как угодно: мессенджер, почта, облако, кабель — доказательство едет внутри. Получатель пересчитывает отпечаток и сверяет подпись прямо в своём браузере, как калькулятор, которому не нужен интернет. В вычислении вердикта мы не участвуем.
Что написано в справке. Аттестация — цепочка сертификатов от корня производителя телефона (у большинства устройств — Google) до ключа съёмки. Из неё проверка читает четыре вещи: уровень защиты ключа (программный, защищённая область или отдельный чип), не разблокирован ли загрузчик, какое приложение создало ключ и разовое подтверждение момента от нашего сервера. Разблокированный загрузчик или ключ вне защищённой области понижают вердикт до «не аттестовано». Нарисовать такую справку со стороны приложения нельзя: подпись под ней ставит чип, а корень цепочки — сертификат Google или производителя — вшит в проверку, а не берётся из файла.
Изменить файл после съёмки незаметно не получится: подпись перестаёт сходиться, и проверка это покажет. Удалить подпись можно — но тогда останется обычный файл без доказательства, и проверка скажет, что подписи нет. Что подпись доказывает, а чего не доказывает никогда, — в разделе «Честные границы».
Что внутри файла. Файл .trustvisor — обычный ZIP-архив ровно из трёх записей для видео и двух для фото. Любая лишняя запись, вложенная папка или второй медиафайл внутри — отказ разбирать, а не вердикт.
| Запись | Что это | Кто создаёт |
|---|---|---|
| video.mp4 / photo.png | Медиафайл как его записала камера. Проверка считает его отпечаток SHA-256 и сверяет с манифестом. | Камера приложения |
| manifest_start.json | Манифест начала записи: время старта, координаты, устройство, публичный ключ, подтверждение момента от сервера, привязка к заявке. Подписан ключом устройства. | Приложение при нажатии «запись» |
| manifest_end.json | Манифест конца: время остановки, координаты в конце, отпечаток SHA-256 видео, отпечаток журнала датчиков, тот же идентификатор сессии. Подписан тем же ключом. У фото — один manifest.json, объединяющий оба. | Приложение при нажатии «стоп» |
Три «обычных» варианта того же самого: подписанный MP4 (оба манифеста лежат в служебном блоке в хвосте файла, плеер его не замечает), подписанный PNG (служебный блок перед концом изображения) и подписанный JPEG (блок после маркера конца). Медиа и манифест во всех вариантах байт-в-байт одинаковы, перепаковать из одного в другой можно без переподписи; проверка читает все четыре формы.
Подписываются не «поля», а байты файла манифеста: из него убирают пробелы и переводы строк вне строковых значений и три служебных поля (signature, signatureAlgorithm, attestationChain), остальное остаётся в том порядке, как записано. Поэтому добавленное, изменённое или переставленное поле ломает подпись — так же, как и любое переформатирование файла.
Как это выглядит. Ниже — настоящий manifest_start.json из демонстрационного пакета, который лежит на этой странице. Длинные значения обрезаны, остальное как есть.
{
"manifestVersion": "1.2",
"sessionId": "9addee93-8c6b-4f2c-b60a-235b863881f7",
"recordingStartedAt": 1787805891039,
"selectedCamera": "BACK",
"deviceModel": "V2425A",
"androidVersion": 36,
"deviceRooted": false,
"type": "recording_start",
"publicKey": "MFkwEwYHKoZIzj0CAQYIKoZI…",
"packageVersion": 1,
"appVersion": "1.2.1",
"trustLevel": "hardware",
"attestationChallengeExpiresAt": 1787809293916,
"attestationChallengeServerSig": "MEQCIHUKC/YbPV6IcXRRMfDx…",
"serverTimeCheckedAt": 1787805693753,
"serverTimeDeltaMs": 167,
выше — подписываемая часть; ниже три поля добавлены после подписи
"signature": "MEUCIQD…",
"signatureAlgorithm": "SHA256withECDSA",
"attestationChain": ["MIIC…", "MIIB…", "MIIF…", "MIIF…"]
}
Манифест конца записи добавляет к этому время остановки, отпечаток videoSha256, признак движения и координаты начала и конца — координат здесь нет, потому что съёмка велась без геолокации. Поле serverTimeDeltaMs — расхождение часов телефона с нашим сервером на момент последней связи, здесь 167 миллисекунд.
| Группа | Поля | Смысл |
|---|---|---|
| Время | recordingStartedAt, recordingEndedAt, capturedAt; gpsStartTime, gpsEndTime; serverTimeDeltaMs, serverTimeCheckedAt; anchorServerMs, anchorElapsedMs, anchorState, autoTimeEnabled | Часы телефона в начале и в конце; время спутникового приёмника; расхождение часов телефона с нашим сервером на момент последней связи. Привязка: серверное время при последней связи, сколько прошло по счётчику с момента загрузки телефона и цел ли счётчик (ok или reboot — была перезагрузка без связи). Момент съёмки по серверным часам — сумма первых двух. |
| Место | latitude, longitude, locationAccuracy и те же три для конца записи; locationProvider, locationMockSeen; netLatitude, netLongitude, netAccuracy; gnssUsed, gnssVisible, gnssConst, gnssCn0Mean, gnssCn0Std, gnssBands, gnssAgcDb | Координаты и точность в метрах в начале и в конце; чем получен фикс и не работало ли приложение подмены координат. Отдельно — координаты по сотовой сети и Wi-Fi, чтобы проверка могла сверить их со спутниковыми, и портрет спутникового сигнала: сколько спутников в решении и видно, какие созвездия, средняя сила сигнала и её разброс, диапазоны, уровень усиления приёмника. Без включённой геолокации полей нет. |
| Устройство | deviceModel, androidVersion, deviceRooted, selectedCamera, sensorLogSha256, trustLevel | Модель и версия системы, признак полных прав, какая камера снимала, отпечаток журнала датчиков (если он писался), уровень защиты ключа. В манифестах до 13 сентября 2026 на этом месте стояло одиночное motionDetected — «двигался или нет»; такие файлы проверяются по-прежнему. |
| Содержимое | videoSha256 / photoSha256, videoFileName | Отпечаток медиафайла — 32 байта. Изменение одного байта видео меняет отпечаток целиком. |
| Ключ и версия | publicKey, sessionId, sessionIdCheck, manifestVersion, appVersion | Публичный ключ устройства (91 байт), идентификатор записи, связывающий оба манифеста, версии формата и приложения. |
| Заявка | caseCompany, caseId, externalRef, pairId, pairRole, checklistItem, caseMaxDurationSeconds | Компания и номер заявки, реквизит (пломба, VIN, накладная), пара «до/после» и роль кадра в ней, пункт чек-листа, лимит длительности из условий кода. |
| Сервер | serverNonce, attestationChallengeExpiresAt, attestationChallengeServerSig | Разрешение на кадр и подтверждение момента: срок действия и подпись нашего сервера над токеном, который чип вшил в сертификат ключа. |
| Не подписаны | signature, signatureAlgorithm, attestationChain | Сама подпись, её алгоритм и цепочка сертификатов — добавляются после подписи и проверяются отдельно. |
Схему можно двигать пальцем влево-вправо.
Ключ и аттестация. Ключ подписи — ECDSA на кривой P-256, хеш SHA-256. Он создаётся внутри защищённой области процессора (TEE, а где есть — StrongBox) через Android Keystore, и закрытая половина никогда не покидает чип: приложение может попросить чип подписать данные, но не может прочитать ключ. Подпись — пара чисел по 32 байта; в файле она лежит в общепринятой обёртке DER, и вместе с ней выходит около 70 байт (в примере на этой странице — 71). Отпечаток — ровно 32.
Вместе с ключом чип выпускает для него сертификат и цепочку из четырёх сертификатов: сертификат ключа → промежуточные сертификаты производителя → корень производителя (для большинства устройств — Google, у части производителей — собственный корень). В сертификат ключа встроено расширение аттестации, и из него проверка читает четыре вещи: уровень защиты ключа (программный, TEE или StrongBox), состояние загрузчика (заблокирован ли и прошла ли загрузка проверку), какое приложение создало ключ — имя пакета ru.trustvisor.app и отпечаток подписи его сборки, так что ключ, созданный другим приложением, не пройдёт, — и серверный токен подтверждения момента. Публичный ключ из манифеста сверяется с ключом в сертификате байт в байт.
Роль сервера при съёмке. Перед кадром приложение получает у сервера разрешение — одноразовый нонс, действующий минуты; на нём держатся лимиты бесплатного тарифа и условий кода. Отдельно сервер выдаёт подтверждение момента: токен, подписанный ключом сервера, со сроком, который задаёт компания в кабинете — от часа до суток, по умолчанию 12 часов (до 5 сентября 2026 срок был часовым для всех). Длина срока вшита в сам токен префиксом h<часы>. и приходит в проверку подписанной. В том же ответе сервер сообщает своё время: приложение запоминает его вместе с показанием счётчика времени с загрузки телефона и номером загрузки, и по этой привязке проверка узнаёт момент съёмки по серверным часам даже после долгой работы без связи. Токен вшивается чипом в сертификат в момент создания ключа — поэтому при обновлении подтверждения приложение создаёт новый ключ, а само подтверждение проверяется потом без сети по публичному ключу сервера. В файл попадают только токен, срок и подпись; сам файл на сервер не уходит. В реестр отправляется только SHA-256 медиа, а публичная сверка по отпечатку отвечает «есть / нет» и дату.
| Проверка | Что сверяется | Если не сошлось |
|---|---|---|
| Сессия | Оба манифеста принадлежат одной записи: идентификатор сессии и его контрольное поле совпадают. | ИЗМЕНЁН |
| Ключ | Публичный ключ в манифестах начала и конца одинаков. | ИЗМЕНЁН |
| Отпечаток | SHA-256 медиафайла, посчитанный заново, равен записанному в манифесте. | ИЗМЕНЁН |
| Подписи | ECDSA-подпись каждого манифеста над его каноническими байтами сходится с публичным ключом. | ИЗМЕНЁН |
| Цепочка | Каждый сертификат подписан следующим, промежуточные — удостоверяющие, корень — известный корень производителя. | ИЗМЕНЁН |
| Привязка ключа | Публичный ключ манифеста равен ключу в сертификате аттестации байт в байт. | Не сходится — ИЗМЕНЁНПривязка нестрогая — НЕ АТТЕСТОВАНО |
| Расширение аттестации | Ключ создан приложением ru.trustvisor.app с известной подписью сборки; уровень — аппаратный. | Чужое приложение — ИЗМЕНЁНПрограммный уровень или неизвестная сборка — НЕ АТТЕСТОВАНО |
| Аттестация приложена | В пакете есть цепочка аппаратной аттестации. | Нет вовсе — НЕ АТТЕСТОВАНОПодпись и целостность при этом проверяются как обычно |
| Загрузчик | Загрузчик заблокирован и загрузка прошла проверку производителя. | НЕ АТТЕСТОВАНО |
| Ключ аттестации не отозван | Серийный номер сертификата не значится в списке отозванных ключей Google. | НЕ АТТЕСТОВАНОПонижение, а не отказ: отзыв — утверждение о ключе сегодня, а съёмка была тогда |
| Подтверждение момента | Подпись сервера над токеном и сроком; токен совпадает с вшитым в сертификат аттестации. | Нет или подделана — ИЗМЕНЁНПросрочено — МОМЕНТ НЕ ПОДТВЕРЖДЁН |
| Часы сервера | Расхождение часов телефона с сервером, снятое при последней связи, в допустимых пределах. | МОМЕНТ НЕ ПОДТВЕРЖДЁН |
| Часы телефона | Собственные часы телефона не разошлись с серверной привязкой больше чем на полчаса. | МОМЕНТ НЕ ПОДТВЕРЖДЁНРасхождение от двух минут показывается, но вердикт понижает от тридцати |
| Спутниковое время | Время спутникового приёмника против серверного момента, а при его отсутствии — против часов телефона. | Против часов телефона — МОМЕНТ НЕ ПОДТВЕРЖДЁНПротив целой серверной привязки — НЕ АТТЕСТОВАНО, причина «место» |
| Привязка к серверному времени | Счётчик с момента привязки правдоподобен: не больше 400 дней и не старше самого токена. | НЕ АТТЕСТОВАНО |
| Место по сети | Координаты по спутнику не спорят с местом, определённым по сотовым вышкам и Wi-Fi. | НЕ АТТЕСТОВАНО |
| Портрет спутникового сигнала | При шести и более спутниках: не одно созвездие, разброс мощности не подозрительно ровный, уровень не завышен. | НЕ АТТЕСТОВАНОТак выглядит сигнал с передатчика, а не с неба |
| Движение | Координаты начала и конца против длительности: невозможная скорость перемещения. | НЕ АТТЕСТОВАНО |
| Лимит длительности | Если код задал предел, длительность записи его не превышает. | НЕ АТТЕСТОВАНО |
| Журнал датчиков | Отпечаток записи sensors.bin сходится с записанным в манифесте, и её раскладка читается. | Отпечаток не сошёлся — ИЗМЕНЁНОтпечаток цел, раскладка не читается — отметка: доказательство цело, испорчена необязательная добавка |
| Подмена координат | Во время съёмки не работало приложение подмены местоположения. | отметкаДанные такого приложения отбрасываются, координаты не записываются вовсе |
| Время съёмки | Время съёмки не в будущем относительно проверяющего; очень старая съёмка отмечается. | отметкаЧасы могут отставать у того, кто проверяет, — это не свойство файла |
| Срок сертификатов | Сертификаты цепочки действовали на момент съёмки (не на день проверки). | отметкаФайл, снятый при действующих сертификатах, обязан остаться подлинным и через десять лет |
Правило вердикта. Проверка не останавливается на первой неудаче: она выполняет все строки таблицы и собирает все причины, а слово выбирает по худшей из них. Любой провал из помеченных в таблице как «ИЗМЕНЁН» даёт этот вердикт. Иначе смотрим на набор понижений: все они про время — «Момент не подтверждён»; есть хоть одно про устройство или место — «Не аттестовано». Понижений нет — «Подлинно». Строки, помеченные «отметка», в этот набор не входят вовсе и вердикт не меняют. Файл не нашего формата или с повреждённым архивом — отказ разбирать, без вердикта.
Это правило — не пересказ: оно живёт в открытом коде одной функцией verdictOf, а набор понижений собирает downgradeReasonsOf. Обе приведены ниже целиком.
Две проверки и перебор. Проверка написана дважды — для браузера и для сервера, разными людьми в разное время и на разных библиотеках чтения архивов (JSZip и yauzl): именно архив и есть то место, где реализации расходятся охотнее всего. Набор из 279 искажённых копий настоящей съёмки прогоняется через обе, ответы сравниваются посимвольно; расхождение считается дефектом, даже если каждый ответ по отдельности выглядит разумным.
Оговорки для эксперта. Отзыв сертификатов не проверяется сознательно — иначе проверка требовала бы связи с серверами производителя и переставала бы работать без сети; истёкший сертификат — предупреждение, срок сверяется со временем съёмки. Срок действия корневого сертификата производителя тоже не сверяется: Google перевыпускал корень с тем же серийным номером. Подтверждение момента есть в файлах, снятых текущей версией приложения; файлы старых версий проверяются без него. Полный перечень допущений и точные допуски — в спецификации формата, которая публикуется вместе с кодом проверки.
Подпись ставит сам телефон в момент съёмки — ключом, который физически не может покинуть чип. Меняете хоть один байт — подпись перестаёт сходиться, и проверка называет это вслух.
Съёмка случается в подвале, в поле, в контейнере и на подземной парковке. Поэтому отвечаем подробно, а не одной строкой «работает офлайн» — она была бы полуправдой.
Совсем без сети снимает только постоянный ключ сотрудника. По одноразовому коду связь нужна на старте, а если телефон не выходил в сеть дольше срока, заданного компанией, и у файла нет привязки к серверному времени, вердикт станет «Момент не подтверждён».
| Сценарий | Снимает без связи? | Что важно знать |
|---|---|---|
| Постоянный ключ сотрудника | ✓ Да, полностью | Ни одного сетевого запроса перед съёмкой. Хеш, сборка данных момента, подпись защищённым чипом, упаковка — всё происходит на устройстве. Связь не нужна ни на старте, ни во время записи, ни после. |
| Бесплатный тариф | ✗ Нет | Перед каждым кадром приложение берёт у сервера одноразовое разрешение — на нём же держатся суточные лимиты бесплатного тарифа. Нет сети — съёмка не начнётся, и приложение скажет об этом прямо. Пропала связь посреди записи — запись прерывается. Это осознанное ограничение, а не сбой: нужна съёмка без связи — нужен платный ключ. |
| Одноразовый код | ! Связь нужна на старте | Лимиты кода — сколько фото и видео разрешено — считает сервер, а не телефон, иначе их можно было бы обойти. Само по себе это занимает секунду. Дальше — как задала компания: по умолчанию обрыв связи по ходу записи её не прервёт; если включено требование постоянной связи, обрыв остановит запись — для случаев, где важно исключить длинную съёмку «в тени». |
| Без сети дольше 12 часов | Снимает | С приложением 1.4 и новее — «Подлинно»: момент съёмки держится на привязке к серверному времени, а не на сроке подтверждения. Вердикт опускается до «Момент не подтверждён» только у файлов без привязки — телефон перезагружался без связи или стоит старая версия приложения. Подтверждение того, что ключ создан под разовым вызовом нашего сервера, действует срок из кабинета — от часа до суток, и приложение обновляет его само, пока есть связь. Главное же — привязка к серверному времени: телефон помнит время сервера с последней связи, поэтому момент съёмки известен по серверным часам при любой длительности без сети, и файл остаётся подлинным. Срок из кабинета вступает в силу только для файлов без такой привязки — тогда проверка скажет «Момент не подтверждён»: подпись и содержимое сойдутся, а подтверждение момента будет просрочено. Как это устроено — под таблицей. |
| Координаты без связи | ✓ Только спутниковые | Приложение спрашивает местоположение двумя способами сразу: быстрым по вышкам и Wi-Fi и точным по спутникам. Без интернета остаётся только второй — он дольше и не берётся в помещении. Нет фикса — координат в подписи просто не будет, съёмку это не блокирует. Исключение: если компания в коде потребовала обязательную геометку, без свежего фикса кнопка съёмки заблокирована. Со связью годится любой из двух способов: свежим считается фикс не старше минуты, и сетевой подходит наравне со спутниковым, а спутниковый, если он есть, главнее и записывается первым. Поэтому в торговом зале, на складе и на подземной парковке съёмка с обязательной геометкой работает — блокирует её не помещение, а полное отсутствие фикса. |
При каждой связи телефон запоминает время нашего сервера и показание счётчика времени с момента загрузки. Счётчик идёт и во сне, часы и часовой пояс на него не влияют, перевести его без root нельзя. Момент съёмки получается сложением: серверное время последней связи плюс то, что натикал счётчик. Поэтому длительность без сети сама по себе ничего не портит.
Привязка пропадает в двух случаях: телефон перезагрузили и он с тех пор не выходил в сеть, либо на нём приложение старее 1.4. Тогда действует срок подтверждения из кабинета — по умолчанию 12 часов. Съёмки продолжаются и подписываются как обычно, но при проверке получат «Момент не подтверждён».
В отчёте проверки момент в таком случае показан двумя границами: не раньше выдачи подтверждения и не позже его срока. Практический вывод простой: дайте телефону выйти в сеть перед выездом — хватает минуты. Дальше привязка к серверному времени держит момент при любой длительности без сети; теряется она только если телефон перезагрузить, так и не выйдя в сеть.
Что доедет позже, когда связь появится, — а что не доедет никогда.
| Что | Доедет? | Как именно |
|---|---|---|
| Сам файл | ✓ Доедет | Если компания включила автоматическую доставку. Пакет кладётся в очередь на устройстве и уходит сам, как только появится связь: приложение для этого открывать не нужно, очередь переживает и перезагрузку телефона. Снимающий может попросить «только по Wi-Fi» — тогда очередь дождётся Wi-Fi. Очередь хранит до сотни пакетов. |
| Счётчики использования | ✓ Доедут | Копятся на устройстве и не теряются. |
| Отпечаток файла в реестр | ✗ Не доедет | Отправляется одной попыткой, без очереди. Офлайн-съёмка просто не попадёт в реестр, и при проверке будет написано «не найден — съёмка могла быть без связи». Это нейтральный факт, а не подозрение. |
| Отметка «снято» в панели и обновления настроек ключа | ! Не вовремя | Отзыв ключа, окончание оплаты, смена чек-листа — до первого выхода в сеть действует последняя известная телефону версия. |
Обычное возражение звучит так: «вы сами делаете подпись, сами её проверяете — почему я должен верить результату». Возражение справедливое, и ответ на него не словесный.
За время вердикта страница не делает ни одного обращения к сети. Отключите интернет и проверьте снова — ответ будет тот же.
Расхождение между двумя проверками считается дефектом, даже если каждый ответ по отдельности выглядит разумным: две реализации, дающие разные вердикты на один файл, — это спор, в котором нечего предъявить.
Формат описан, и проверку можно повторить без нас. Спецификация формата и код проверки открыты: github.com/Mikhail-Savkin/Trustvisor_verify_core, лицензия Apache-2.0. По ним специалист повторяет проверку своими средствами, не обращаясь к нашим серверам и не доверяя нашему сайту. Чтобы проверить уже снятый файл, наши серверы не нужны — ни сегодня, ни через годы.
Ноль обращений к сети. Откройте инструменты разработчика (F12 в Chrome), вкладку «Сеть», очистите список. Откройте страницу проверки, перетащите файл и дождитесь вердикта. За время вычисления вердикта не появится ни одной строки.
Сразу после вердикта появится ровно один запрос — страница спрашивает наш реестр отпечатков. Уходит только SHA-256, ответ — «есть / нет» и дата, на вердикт он не влияет. Проверить это можно грубее: отключите сеть совсем и проверьте файл снова. Вердикт будет тот же, а строка про реестр скажет, что сверка не выполнена. Мы так и проверяли.
Скорость. 42 мс — медиана двадцати прогонов видеофайла 3,7 МБ, разброс 37–56 мс, обычный ноутбук и обычный браузер; замер 6 сентября 2026, на живой странице проверки. У вас будет своё число того же порядка: считаются один SHA-256 по всему файлу, две подписи и цепочка из четырёх сертификатов. Файл размером с фотографию проверяется за единицы миллисекунд.
Перебор из 279 порч. Набор собирается из вашей собственной съёмки, а не из нашей: скрипт берёт настоящий файл и портит его всеми способами из набора — переворачивает байты, подменяет поля, ломает архив, подсовывает лишние записи. Дальше набор прогоняется через серверную проверку, а браузерную можно прогнать этой же страницей. Расхождений между ними быть не должно ни одного. Последний прогон — 5 сентября 2026 года, после смены срока подтверждения момента: расхождений ноль.
Скрипты перебора и стенд сверки лежат в том же открытом репозитории, в папке tools/ — набор искажений можно прогнать у себя.
Оговорка, чтобы обещание было точным: связь с нашим сервером нужна не в момент съёмки, а заранее и при случае. Приложение обновляет разовое подтверждение аппаратной аттестации, когда сеть есть: при подключении, при суточной перепроверке ключа и на старте съёмки. Не вышло — съёмка идёт как обычно и мгновенно, а на проверке это отразится только сроком подтверждения момента. Проверка готового файла не зависит от нас вообще.
Слово всегда одно, но не потому, что проверка бросает работу на первом «нет»: она доходит до конца, собирает все причины и называет худшую. Лесенка ниже — порядок рассказа, а не порядок остановки: так удобно читать, от целостности файла к моменту съёмки. Ниже неё — случаи, в которых мы честно называем цену своих решений.
Содержимое совпадает с тем, что подписано; подпись сделана ключом, который родился внутри аппаратного хранилища телефона; цепочка сертификатов ведёт к известному корню производителя; ключ создан под разовым вызовом нашего сервера, и этот вызов был действителен на момент съёмки; владельцем ключа в аттестации значится приложение TrustVisor с известным нам сертификатом сборки.
Причина может быть и безобидной — файл пересжали при пересылке, — и намеренной. Разницы проверка не делает и делать не должна: она отвечает на вопрос «те ли это байты», а не «зачем их поменяли».
Сюда же попадает случай, который легко спутать с соседним: цепочка аттестации приложена, но не прошла проверку. Приложить негодную цепочку — это не «не доказали», это попытка выдать одно за другое, и ответ соответствующий.
Аттестации нет вовсе, или ключ оказался в программном хранилище, или у телефона был разблокирован загрузчик. Истёкшее подтверждение момента и расхождение часов сюда не относятся — это «Момент не подтверждён». С приложения 1.4 сюда же попадает подмена места: спутниковые координаты не сошлись с координатами по сотовой сети и Wi-Fi, или спутниковое время не совпало с серверным.
«Изменён» — что-то не сошлось: подпись, содержимое, цепочка сертификатов или приложение, которому принадлежит ключ. «Не аттестовано» — всё сошлось, но аппаратного подтверждения не хватает или оно слабее ожидаемого. Первое означает «поймали на несоответствии», второе — «не доказали».
Часы телефона переведены. Момент съёмки известен по серверным часам и показан в отчёте, а собственная дата файла расходится с ним больше чем на полчаса — вперёд или назад. Такой файл целый и снят настоящим устройством, но его дате верить нельзя; верить нужно серверному моменту рядом. То же самое, если съёмка датирована раньше, чем сервер выдал ей подтверждение момента.
Подтверждение момента, которое телефон получает от нашего сервера, к моменту съёмки истекло: телефон был без связи дольше срока, заданного компанией, и привязки к серверному времени у файла нет — телефон перезагружался без связи или приложение старой версии. С целой привязкой момент известен точно при любой длительности офлайна. Сюда же попадают расхождение часов телефона с сервером и несовпадение спутникового времени с системным.
Пятый исход — «не удалось открыть файл» — это не вердикт, а отказ разбирать. Он означает, что файл не является пакетом TrustVisor: не тот формат, повреждена структура архива, дописаны посторонние данные. Мы намеренно отвечаем так, а не «изменён»: «доказательство испорчено» и «дайте, пожалуйста, исходный файл» — это разные разговоры.
Карта на сегодня. Список полный: мы держим его на своей странице и правим, когда что-то меняется, — последний раз 16 сентября, когда у файла появился журнал датчиков. Подробности каждого пункта — в карточках ниже.
Это первый вопрос, который задаёт любой технарь, и единственное число на этой странице, которого у нас нет. Вся остальная страница измерена: сорок два миллисекунды до вердикта, 279 способов испортить файл, ноль обращений к сети. А вот сколько честных съёмок получает вердикт ниже «подлинно» — не измерено.
Почему не измерено. Мерить не на чем: за всё время у нас 52 проверки, и почти все — наши собственные съёмки. Считать по ним долю было бы враньём с видом статистики. Кейсов у нас тоже пока нет, и мы об этом говорим на каждой странице.
Почему это важно именно вам. Кладовщик снимает приёмку в металлическом ангаре, спутники ловятся плохо, портрет сигнала выходит подозрительно ровным — и честная съёмка получает «не аттестовано». Файл настоящий, человек честный, а руководитель идёт разбираться. Разница между «одна съёмка из тысячи» и «одна из двадцати» — это разница между «внедрили» и «завалили поддержку».
Что с этим делать. Пилот на одной бригаде за две недели даёт эту цифру: портал пишет и вердикт, и причину понижения по каждому файлу, считать ничего не надо — выгрузка уже есть. Мы отдадим её как есть, вместе с разбором, какие причины оказались от условий, а не от обмана.
Что можно настроить уже сейчас. Часть порогов компания задаёт сама в кабинете: срок подтверждения момента — от часа до суток; требование постоянной связи во время записи — включено или нет; журнал датчиков — писать или нет; предел длительности — прямо в разовом коде. Пороги по месту и по расхождению часов сегодня общие для всех и в кабинет не вынесены; если пилот покажет, что они мешают именно вашим условиям, это первое, что мы будем менять.
Самый частый вопрос и самое честное ограничение. Камера, направленная на монитор или на распечатку, снимает настоящие лучи: содержимое не подменяли, ключ родился в чипе, время и место верны — проверка скажет «Подлинно» и будет права. Криптография отвечает на вопрос «этот ли телефон снял и не менялся ли файл», а не «что было перед объективом». Так устроена любая подобная система, и обещать здесь автоматический вердикт было бы обманом.
Что мы против этого делаем. Видео несёт рядом с собой журнал показаний собственных датчиков телефона за время съёмки: ускорение, поворот, магнитное поле и освещённость. Отпечаток журнала лежит внутри подписанного манифеста, поэтому подправить журнал под картинку нельзя — файл получит вердикт «Изменён». Проверка показывает журнал рядом с видео, и человек, разбирающий спор, сверяет одно с другим.
Что по нему видно глазами. Съёмка с экрана почти всегда выдаёт себя набором мелочей сразу: освещённость ровная и «комнатная» там, где в кадре улица или прожекторы; телефон поворачивается, а картинка не даёт параллакса — предметы на разном расстоянии смещаются одинаково; камера наклоняется, а горизонт в кадре стоит; яркая вспышка в кадре не отражается на датчике света. Ни один из этих признаков сам по себе не доказательство — вместе они дают эксперту опору, которой раньше не было вовсе.
Выводов проверка не делает. Она сверяет отпечаток журнала и показывает содержимое — и ни строчкой не пишет «похоже на настоящую съёмку» или «похоже на экран». Правдоподобие движения — вопрос к человеку, а не к программе; это решение записано в спецификацию, чтобы не отменилось молча.
Где журнал есть и где его нет. Сегодня — только у видео и только на платном тарифе; включает его компания в кабинете, иначе он выключен. У фотографий и на бесплатном тарифе журнала нет вовсе, и съёмка экрана там не отличается ничем. Это не оговорка мелким шрифтом, а точная граница: если журнала в файле нет, спор о пересъёмке придётся вести без него.
Как устроен журнал. Ускорение и поворот пишутся десять раз в секунду, магнитное поле — пять, освещённость — дважды; это около 154 байт на секунду записи, с потолком в 1 МиБ. Разбор даёт три разных исхода, и они не равны: отпечаток не сошёлся — вердикт «Изменён»; отпечаток цел, но раскладка не читается — предупреждение, вердикт не меняется; журнал приложен, а поля для него в манифесте нет — файл вообще не разбирается. Последнее правило закрывает обходной путь: иначе достаточно было бы стереть поле.
Между тем, как файл записан, и тем, как он посчитан и подписан, проходит несколько секунд — приложение в это время ждёт координаты остановки. На устройстве с полученными правами суперпользователя файл в этот промежуток можно подменить, и приложение подпишет подложенное.
Против массового случая это закрыто: чтобы получить такие права, на подавляющем большинстве телефонов нужно разблокировать загрузчик, а это состояние аппаратно фиксируется в самой аттестации и попадает в вердикт — файл получит «Не аттестовано». Мы не отвергаем такие файлы полностью: люди с нестандартной прошивкой бывают добросовестными. Но и подлинными их не называем.
Чего это не закрывает: получение таких прав в обход разблокировки загрузчика. Это существенно сложнее и заметно дороже, но возможно — и это уровень взлома, который стоит дороже любого спора, ради которого его делают. Если заказчик сомневается в конкретном устройстве, достаточно попросить снять на второй телефон; а устройство, с которого обман повторяется, видно в журнале и лишается ключа.
Часы телефона владелец переводит в настройках за десять секунд, поэтому время съёмки на них не опирается. Опора другая: при каждом выходе в сеть телефон запоминает наше серверное время и показание счётчика с момента загрузки. Этот счётчик идёт и во сне, часовой пояс и перевод часов на него не влияют, а сдвинуть его без полного доступа к системе нельзя. Момент съёмки — серверное время плюс то, что натикал счётчик; точность порядка секунд в сутки, сколько бы телефон ни оставался без связи. Переведённые часы видны в отчёте отдельной строкой. На сам момент съёмки они не влияют — он известен и без них, — но на вердикт влияют: расхождение собственных часов телефона с серверной привязкой больше получаса понижает его до «момент не подтверждён». Меньше получаса — показывается, но вердикт не меняет.
Где эта опора кончается: перезагрузка без связи. Счётчик обнуляется, привязка теряется, и файл проверяется по прежнему правилу — подтверждению момента, которое сервер выдаёт на заданный компанией срок (по умолчанию двенадцать часов, в кабинете от часа до суток). Если срок к моменту съёмки истёк, вердикт станет «момент не подтверждён»: подпись, файл и устройство целы, под вопросом только «когда». Честная съёмка на телефоне с уплывшими часами клейма подделки не получает — это разные вещи, и мы их различаем словом.
Приложение подмены координат — то, что ставят из магазина за минуту, — мы отбрасываем: Android помечает такие координаты, приложение их не берёт и записывает сам факт попытки. Подмена на уровне системы требует полного доступа к ней, а это ломает аттестацию раньше, чем координаты.
Сложнее случай — передатчик поддельных спутниковых сигналов. Такой прибор стоит десятки тысяч рублей, и телефон ему верит: признака «сигнал поддельный» в Android нет. Против него у нас три косвенных заслона. Время со спутника сверяется с нашим серверным — дешёвые передатчики транслируют выбранную дату, и она не сходится. Координаты со спутника сверяются с координатами по сотовым вышкам и Wi-Fi — их подделать на порядок сложнее, чем спутники. И портрет самого сигнала: сколько спутников, из каких созвездий, насколько ровная у них сила — у передатчика с одной антенны картина слишком гладкая.
Чего это не закрывает: аккуратный передатчик с верным временем, в месте без сотовой связи и Wi-Fi или с подделкой окружения, с правдоподобным разбросом сигнала — пройдёт. Поэтому место мы называем сильным признаком, а не доказательством, в отличие от времени, устройства и целостности файла. Каждый из этих заслонов срабатывает и у честной съёмки, и чаще всего это не обман, а плохие условия приёма. Но вердикт понижает любой из них поодиночке: одного расхождения спутниковых координат с местом по сети достаточно, чтобы вместо «подлинно» вышло «не аттестовано». Мы выбрали так сознательно — лучше лишний раз позвать человека посмотреть, чем промолчать, — и поэтому же не называем место доказательством.
Номер пломбы, VIN, накладной или заявки живёт внутри подписи, и дописать его задним числом нельзя. Но мы фиксируем ровно то, что этот текст был введён в момент этой съёмки на этом устройстве. Соответствует ли номер действительности — вопрос к тому, кто ведёт соответствующий реестр.
То же и с парой «до/после»: она доказывает, что оба кадра сняты этим устройством, в эти моменты и заявлены как одна пара. Что между ними выполнялась именно заявленная работа — она не доказывает.
Это две разные вещи, и их легко спутать. Список отозванных ключей аттестации Google публикует целиком, поэтому мы возим его с собой: снимок вшит в проверку, и ключ из этого списка понижает вердикт до «не аттестовано» — без единого обращения к сети. На сервере тот же список обновляется каждые шесть часов, у страницы обновляется вместе со страницей, и дата снимка видна в отчёте.
А вот отзыв самих сертификатов цепочки (OCSP, списки CRL) мы не проверяем — сознательно. Это означало бы обращение к серверам производителя при каждой проверке файла и сломало бы главное свойство: проверка работает без сети и без доверия к нам. Цену этого выбора называем вслух: сертификат, отозванный производителем, мы не увидим.
По той же логике истёкший сертификат в цепочке — предупреждение, а не отказ, и срок сверяется со временем съёмки, а не с сегодняшним днём. Файл, снятый при действующих сертификатах, обязан остаться подлинным и через десять лет.
Обещание «проверку можно повторить без нас» стоит ровно столько, сколько стоит возможность его проверить. Поэтому код, которым считается вердикт, открыт: его можно прочитать, запустить у себя и написать по нему собственный проверяльщик. Ниже — что именно открыто и что нет.
Ядро проверки целиком открыто на GitHub, два куска кода приведены прямо на этой странице. Обещание «проверьте сами» стоит ровно столько, сколько стоит возможность это сделать.
Что открыто. Ядро проверки целиком: разбор пакета, сверка подписи, разбор цепочки аппаратной аттестации и вычисление вердикта. Плюс спецификация формата — по ней можно написать свой проверяльщик с нуля, не заглядывая в наш код.
И то, что обычно не показывают. Проверка работает в двух местах — в браузере у получателя и на нашем сервере, на разных библиотеках разбора архивов. Любое расхождение между ними — ошибка, даже если оба ответа выглядят разумными. Мы проверяем это машиной: берём настоящую съёмку, портим её тем же перебором и сравниваем ответы обеих сторон посимвольно. Перебор лежит в репозитории рядом с кодом — не только результат, но и сам набор искажений.
Сервер лицензий, личный кабинет и само приложение закрыты: там вход, платежи и администрирование. Открывать их — значит выдать карту тому, кто пришёл искать слабости. Открыто ровно то, что нужно, чтобы повторить проверку и убедиться, что вердикт не подкручен.
Нашли слабость — напишите. Сообщение о найденном способе обмануть проверку для нас ценнее, чем неприятно. Пишите на info@trustvisor.ru.
Два куска — прямо здесь. Чтобы не уходить со страницы: вот код, которым решается вердикт. Он скопирован из ядра проверки без изменений.
Первый. Проверяющий не пересобирает манифест по списку полей, а берёт его сырые байты и выбрасывает ровно три поля, дописанные уже после подписания. Поэтому любое лишнее поле ломает подпись: оно попадёт в проверяемые байты, и они разойдутся с подписанными.
// три поля дописываются в манифест ПОСЛЕ подписания
const DROP = new Set(["signature", "signatureAlgorithm", "attestationChain"]);
let out = "{", first = true, j = 1;
while (j < flat.length && flat[j] !== "}") {
const ks = j;
j = _skipString(flat, j); // имя поля
const key = JSON.parse(flat.slice(ks, j));
j++; j = _skipValue(flat, j); // значение целиком
// всё, чего нет в DROP, остаётся в проверяемых байтах — как было
if (!DROP.has(key)) { if (!first) out += ","; out += flat.slice(ks, j); first = false; }
if (flat[j] === ",") j++;
}
Второй. Из чего складывается ответ, отличный от «подлинно». Ни одного скрытого условия: каждая строка — отдельная проверка, описанная выше на этой странице, и каждая называет свою причину вслух.
TIME_DOWNGRADE_REASONS = ["challengeFreshness", "serverClock", "gpstime", "deviceClock"];
downgradeReasonsOf(c) {
r = [];
if (c.attestation === "missing") r.push("attestation"); // аттестации нет вовсе
if (st(c, "oid") === "warn") r.push("oid"); // вопросы к владельцу ключа
if (st(c, "rootOfTrust") === "warn") r.push("rootOfTrust"); // загрузчик разблокирован
if (st(c, "revoked") === "warn") r.push("revoked"); // ключ аттестации отозван
if (st(c, "keybound") === "warn") r.push("keybound"); // ключ привязан не строго
if (st(c, "motion") === "warn") r.push("motion"); // движение не сходится
if (st(c, "challengeFreshness") === "warn") r.push("challengeFreshness");
if (st(c, "serverClock") === "warn") r.push("serverClock"); // часы разошлись с сервером
if (st(c, "deviceClock") === "warn" && c.deviceClock.downgrade)
r.push("deviceClock"); // часы против привязки
if (st(c, "gpstime") === "warn" || st(c, "gpstime") === "fail")
r.push(c.gpstime.vsAnchor ? "location" : "gpstime"); // спутник против сервера
if (st(c, "anchor") === "warn" && c.anchor.inconsistent)
r.push("anchor"); // привязка неправдоподобна
if (st(c, "locationNet") === "warn") r.push("location"); // спутник против сети
if (st(c, "gnssPortrait") === "warn") r.push("location"); // портрет как у передатчика
if (st(c, "durationCap") === "warn") r.push("durationCap"); // запись длиннее лимита
return r;
}
// слово выбирается по всему набору причин, а не по первой из них
verdictOf(result) {
if (!result.allPass) return "TAMPERED"; // ИЗМЕНЁН
if (!result.trustDowngrade) return "TRUSTED_CAPTURE"; // ПОДЛИННО
return isTimeOnlyDowngrade(result)
? "TIME_UNCONFIRMED" // МОМЕНТ НЕ ПОДТВЕРЖДЁН
: "UNVERIFIED_DEVICE"; // НЕ АТТЕСТОВАНО
}
// все причины про время — значит «момент не подтверждён», а не «не аттестовано»
isTimeOnlyDowngrade(result) {
r = result.downgradeReasons;
return r.length > 0 && r.every(x => TIME_DOWNGRADE_REASONS.includes(x));
}
Второй кусок сокращён по ширине: в исходнике вместо st(c, …) стоит внутренняя функция чтения состояния проверки, и объявлены типы. Логика не изменена — сравните построчно с verify-core.ts: функции называются так же.
Apache-2.0. В репозитории: ядро проверки, спецификация формата, набор искажений для перебора и две настоящие съёмки — фото и видео — чтобы было на чём проверять. Спецификацию и разбор по-прежнему высылаем по запросу судебному эксперту, аудитору или вашей ИТ-службе, если удобнее так.
А если вас не станет? Вопрос честный: поставщик маленький, а претензию предъявляют через год. Отвечаем устройством, а не обещанием. Ваши файлы уже подписаны, и подпись лежит внутри них; формат описан и опубликован; код, которым считается вердикт, лежит на GitHub под свободной лицензией. Проверка идёт в браузере и к нашим серверам не обращается — значит, работает и без нас. Мы не держим ваши файлы и не прячем их в свой формат: это обычные MP4 и JPEG с подписью внутри, они открываются любым плеером и просмотрщиком. Перестанет работать только то, что и должно: выпуск новых ключей и сверка по нашему реестру — а она и сегодня дополнительная опора, а не основание вердикта.
И ещё проверку можно прочитать, никуда не уходя: она выполняется у вас в браузере, а значит, приезжает вместе со страницей. Откройте на странице проверки исходный код — там весь разбор подписи, цепочки аттестации и правило вердикта, ровно то же, что в репозитории. Разница только в том, что в репозитории у этого есть история правок и тесты.
Подтвердить происхождение файла пытаются тремя разными способами, и они отвечают на разные вопросы. Ниже — чем они отличаются по существу, включая мировой стандарт C2PA (Content Credentials), который делают Adobe, Microsoft, BBC и другие.
Есть мировой стандарт C2PA — он отвечает, кто издал файл и что с ним делали в редакторе. Мы отвечаем на другой вопрос: каким устройством снято. У нас C2PA не внедрён, и мы не выдаём это за сделанное.
| Что сравниваем | Метка в приложениисервисы фотоотчётов | Подпись издателяC2PA / Content Credentials | Подпись устройстваTrustVisor |
|---|---|---|---|
| На какой вопрос отвечает | «Приложение записало вот такие дату и координаты» | «Кто издал этот файл и что с ним делали после» | «Каким устройством и когда снято, менялся ли файл после» |
| Кто ставит подпись | Само приложение, обычной записью в базу | Любая программа с сертификатом — включая графический редактор | Защищённый чип телефона; ключ не покидает устройство |
| Кто может проверить | Только сам сервис — он показывает то, что показал изначально | Любой инструмент, читающий стандарт — сильная сторона C2PA | Любой — в браузере, без нас; формат публикуется |
| Нужен ли поставщик при проверке | Да, целиком | Нет, но нужен список доверенных издателей | Нет; корни производителей телефонов вшиты в проверкуВшитое обновляется вместе со страницей. Копия, сохранённая на диск, замрёт на своей дате — для разбора старого файла этого достаточно, для новых устройств лучше открыть страницу заново. |
| Доказывает ли, что снято камерой | Нет | Сам по себе нет — подписать можно и отредактированный файл | Да — аппаратная аттестация до чипа |
| Чем подтверждается время | Часами сервиса | Отметкой времени удостоверяющего центра | Разовым подтверждением нашего сервера, вшитым чипом в сертификат ключа |
| Что происходит при пересылке через мессенджер | Метка остаётся у сервиса, файл к ней уже не привязан | Пересжатие убивает любую встроенную подпись — и стандартную, и нашу. Это свойство самих мессенджеров, а не изъян защиты: подпись удостоверяет конкретные байты, а площадка их меняет. Отправлять надо файлом, а не «как фото». | |
C2PA и мы отвечаем на разные вопросы и лежат в разных слоях. Стандарт удостоверяет цепочку авторства: кто снял, кто отредактировал, чем. Аппаратная аттестация удостоверяет физическое происхождение: этот чип, этот момент, эти байты. Одно не заменяет другое.
Технически наш манифест можно везти внутри C2PA как собственное дополнение: чужой инструмент увидит привычный стандартный манифест, а наша проверка — полный вердикт с аттестацией.
C2PA в TrustVisor не внедрён. У нас собственный формат с первого дня, и на странице выше описан именно он. Совместимость со стандартом — направление, которое мы разобрали и держим в планах, а не работающая функция.
Вторая честная оговорка: чтобы наша подпись считалась «зелёной» в чужих инструментах, нужен сертификат из их списка доверия. Российскому ИП такой сертификат западный удостоверяющий центр, скорее всего, не выдаст — и файл будет выглядеть как «подпись верна, издатель не в списке». Это ограничение среды, и обещать его обход мы не станем.
Сначала — куда девается сам файл и кто его проверяет. Потом всё остальное, что уходит с телефона, с честной причиной по каждому пункту. Сервис устроен так, чтобы собирать как можно меньше, и сверх этого списка приложение не отправляет ничего: ни рекламных трекеров, ни аналитики, ни сторонних библиотек, которые куда-то шлют данные.
С телефона уходит немногое: отпечаток файла, координаты, модель устройства и служебные метки — и по каждому пункту сказано зачем. Ни рекламных трекеров, ни аналитики, ни чужих библиотек в приложении нет.
Решает компания, а не тот, кто снимает. Режим один на все её ключи, меняется в кабинете за один клик и действует со следующей съёмки. По умолчанию включён первый — пока компания не решит иначе, ни один файл к нам не уходит. Во втором файл проходит через нас только ради проверки и не остаётся.
Файл остаётся на телефоне. К нам он не приходит вообще — ни целиком, ни частями.
В кабинете: видно, что съёмка состоялась, по какому коду и закрыт ли чек-лист. Самого файла нет.
Так же, как любой другой: почтой, мессенджером, ссылкой. Исполнитель отправляет его сам и сам решает кому — это осознанное действие, а не фон. На бесплатном тарифе других вариантов нет: автоматической отправки там не бывает.
Файл приезжает к нам, проверяется и тут же уходит в вашу папку — в /TrustVisor/ и дальше по номеру заявки. У нас он не остаётся.
В кабинете: вердикт, размер, заявка, путь в вашей папке. Кнопки «Скачать» нет — скачивать не с чего.
На нашем сервере файл живёт секунды: столько, сколько идёт проверка и отправка. Если ваш Диск недоступен — отозван ключ доступа или кончилось место, — файл ждёт у нас с повторными попытками, но не дольше недели, и в кабинете видно причину. Содержимое присланных файлов мы не просматриваем и не используем.
Честная оговорка: чтобы отправить файл в вашу папку, ключ доступа к вашему диску хранится у нас, зашифрованным. Сервер каждый раз просит у Яндекса одноразовый адрес для загрузки. Ключ выдаёте вы и в любой момент отзываете на стороне Яндекса.
Выбор из трёх, переключается в кабинете. По умолчанию — пакет: так было всегда, и так ничего нельзя испортить по неосторожности.
| Что кладём | Что это | Кому подходит |
|---|---|---|
| Пакет .trustvisorпо умолчанию | Один файл: видео или снимок, манифест, подпись и журнал датчиков. Открывается нашей проверкой или вашим кодом из открытого репозитория. Ни одна программа его не пересохраняет, а значит, и не портит подпись. | Тем, кто складывает доказательства в архив и смотреть их не собирается |
| Подписанное видео или снимок | Обычный MP4, PNG или JPEG: открывается любым плеером и просмотрщиком, а манифест, подпись и журнал датчиков лежат внутри него — проверку он проходит так же, как пакет. Это тот же файл, который приложение отдаёт по кнопке «Поделиться». | Тем, кому съёмку нужно смотреть, а не только хранить |
| Оба рядом | В папке заявки оказываются два файла. Места занимают примерно вдвое больше. | Большинству: смотреть удобно, нерушимая копия лежит рядом |
Разница между первым и вторым — не в доказательстве, а в хрупкости. Подписанное медиа теряет подпись, если его пересохранить: редактором, конвертером или пересылкой через мессенджер, который пережимает вложения. Пакет так испортить нельзя — его никто не пересохраняет. Поэтому по умолчанию стоит пакет.
Так работает доставка. Всё это занимает секунды и не задерживает съёмку: к моменту отправки файл уже подписан и лежит на телефоне.
Приложение не знает и не решает этого само: оно называет ключ, а сервер по ключу находит компанию и её режим.
Ссылка живёт час и годится ровно для одного файла. Больше двадцати выданных, но не использованных адресов компания не накопит — иначе можно держать наготове пачку действительных ссылок на запись.
Нет сети — не беда: пакет ложится в очередь на телефоне, и её разгребает фоновая задача — приложение для этого открывать не нужно, очередь переживает перезагрузку. Снимающий может включить «только по Wi-Fi» — тогда она дождётся Wi-Fi.
Подпись, отпечаток, цепочка аттестации, момент съёмки — тот же вердикт, который получил бы любой, перетащив файл на страницу проверки.
Запись появляется в «Проверках», письмо уходит по настройке тревог, событие — в вашу CRM. Файл уходит в ваш Яндекс.Диск и у нас удаляется.
Если доставка выключена, вердикт появится, когда файл проверят: перетащат в кабинете, отправят через API или откроют на странице проверки. Ещё один путь — проверка по коду: исполнитель, снявший по одноразовому коду, сам загружает файл на отдельную страницу без входа и ключей, пропуском служит сам код; вердикт с привязкой к заявке уходит в ваш журнал, а файл не хранится дольше самой проверки.
| Что | Сколько | Откуда это число |
|---|---|---|
| Обычно | секунды | Пока идёт проверка и отправка в ваш Диск. Как только Яндекс подтвердил приём — файл у нас удаляется. |
| Если ваш Диск недоступен | не дольше 7 дней | Отозван ключ, нет места, Яндекс не отвечает — повторяем по нарастающим интервалам, от 5 минут до 12 часов. Через 12 попыток или 7 дней сдаёмся и удаляем; причина видна в кабинете. |
| Очередь на отправку у компании | 5 ГБ | Столько может ждать у нас одновременно. Заполнилась — новые загрузки не принимаются, пока не уедут старые. |
| Ссылка на скачивание | нет | Файл в вашей папке, а не у нас. Удалить застрявший досрочно — кнопка «Удалить» в кабинете. |
После удаления остаётся только строка в журнале: когда файл был, какого размера и с каким вердиктом. Ни содержимого, ни координат в ней нет. Отдельной базы координат у нас не существует вовсе: они живут только внутри подписанного файла. При включённой доставке файл с координатами внутри проходит через нас и удаляется вместе с отправкой в ваш Диск.
| Что уходит с телефона | Зачем | Где остаётся и кто видит |
|---|---|---|
| Идентификатор устройстваAndroid ID, при активации | Чтобы ключ нельзя было передать: лицензия привязывается к конкретному устройству — один ключ, одно устройство, чужой телефон по нему не снимет. | Это не IMEI, не серийный номер, не номер телефона — идентификатор Android; сам по себе он личность не устанавливает и меняется при сбросе устройства к заводским настройкам. Но в кабинете он показан рядом с именем держателя ключа, и там же видно, когда телефон первый и последний раз выходил на связь. Связь эта — не чаще раза в сутки при открытии камеры, так что компания видит день, а не время съёмок и не их число. |
| Лицензионный ключ или код заявки | Чтобы отличить, кому что можно: ключ определяет тариф и права — качество, геометку, лимиты, доставку. Для одноразового кода сервер же считает, сколько уже снято, — иначе лимит «пять кадров по заявке» можно было бы обойти. | В кабинете компании — только по её собственным ключам. |
| Разрешение на съёмкутолько по разовому коду и на бесплатном тарифе | Одноразовое число, которое чип вплетает в свою справку, — чтобы справку нельзя было переиспользовать от старой съёмки. Им же держится лимит: «по этому коду три видео» иначе обходился бы прямо на телефоне. | В журнале съёмок кабинета: время, «фото» или «видео», код и заявка. Ни координат, ни содержимого. Съёмка постоянным ключом сюда не попадает — приложение вообще не спрашивает разрешения, поэтому когда и сколько снимал сотрудник, компания в кабинете не видит. Что она видит — день последнего выхода телефона на связь, строкой выше. |
| Отпечаток файлатолько SHA-256, сразу после съёмки | Вторая опора, отдельная от файла: позже, в споре, можно показать, что отпечаток лёг в реестр в такой-то момент — значит файл существовал уже тогда, его не могли собрать вчера под нужный ответ. | В реестре отпечатков. По отпечатку нельзя восстановить ни картинку, ни звук, ни координаты — это односторонняя свёртка. |
| Счётчикиесли компания включила отчётность | Раз в период — два числа: сколько фото и сколько видео. Начало периода считает сервер, а не телефон, чтобы цифры нельзя было подкрутить переводом часов. | В этом отчёте — только суммы: ни содержимого, ни координат, ни времени отдельных съёмок, ни имён файлов. Это и есть всё, что компания узнаёт о работе постоянного ключа: журнал съёмок ведётся только по разовым кодам, строка выше. |
| Координаты | Часть доказательства — отвечают на вопрос «где снято». | Вшиваются внутрь подписанного файла и на наши серверы сами по себе не отправляются. В нашей базе их нет нигде — ни в журнале съёмок, ни в реестре, ни в логах. Уходят к нам только вместе с самим файлом и только если компания включила доставку. На бесплатном тарифе координат не бывает вовсе. |
| Сам файлтолько при включённой доставке | Включает доставку владелец ключа в панели управления, не тот, кто снимает. Сразу после съёмки пакет целиком — с геометкой, временем и моделью устройства — уходит через нас в хранилище компании. Разбор режимов — выше. | В Яндекс.Диске компании. У нас — запись о файле: имя, размер, отпечаток, вердикт, путь в её папке. |
| Чего мы не собираем вообще | Содержимое съёмок по умолчанию — оно остаётся на телефоне. Номера банковских карт — при оплате они вырезаются до записи в лог и в базу. IMEI, серийный номер, номер телефона, список контактов, список установленных приложений — приложение их даже не запрашивает: у него всего восемь разрешений, и все по делу. Шесть — камера, микрофон, интернет, состояние сети и две геолокации. Ещё два нужны фоновой доставке: не дать телефону уснуть посреди загрузки и вернуть недоставленное в очередь после перезагрузки. Последние два «обычные» — Android не спрашивает их у человека. | |
Кто что видит.
Снятое остаётся здесь. Отправить его — отдельное осознанное действие: человек сам выбирает получателя и способ. На бесплатном тарифе автоматической отправки нет вовсе.
При включённой доставке приложение показывает предупреждение с подтверждением и постоянную строку в настройках: съёмки уходят такой-то организации, отключить это в приложении нельзя — этим распоряжается она. Мы сознательно не даём исполнителю выключатель: возможность отключить доставку — это возможность спрятать неудобный кадр. Отказаться он может иначе — не снимая по этому ключу.
Свои ключи и устройства, на которых они работают. Журнал: когда по какому коду началась съёмка, сколько кадров, закрыт ли чек-лист, отмечено ли получение. История проверок с вердиктами. Если включена доставка — присланные файлы.
Точных координат в журнале нет — намеренно: они живут только внутри подписанного файла, и увидит их лишь тот, кому файл передали. Слежки за перемещениями исполнителя журнал не даёт. До данных другой компании из кабинета не дотянуться.
Короткая строка — SHA-256 файла — с отметкой времени. Сверка публичная и анонимная: на запрос по отпечатку реестр отвечает только «есть такой / нет» и дату. Ни компании, ни номера заявки в ответе нет. «Не найден» — нейтральный факт, а не приговор: съёмка могла идти без связи.
Честная оговорка: реестр ведём мы, и отметка времени в нём наша. Для спора, где не доверяют уже нам самим, этого мало — полностью независимым такое подтверждение делает служба отметок времени, которую ведём не мы, — её у нас пока нет.
Тот, кому файл передали и кто открыл его на проверку, видит всё, что внутри подписи: время, координаты, устройство, реквизит — и вердикт. С приложения 1.4 туда же попадают координаты по сотовой сети и Wi-Fi и портрет спутникового сигнала: они нужны проверке, чтобы отличить настоящий приём от подделанного, и видны тому же получателю. На наши серверы они, как и обычные координаты, сами по себе не уходят. Проверка идёт в его браузере, без наших серверов.
Чего не видим мы сами: содержимое проходящих через нас файлов не просматриваем и не используем; координаты на наших серверах не хранятся нигде; пароли, коды входа и PIN лежат у нас только в виде необратимых отпечатков — даже мы не можем их прочитать, только сверить.
Сервис полностью работает из кабинета, без единой строки кода. Но если у вас CRM, система заявок или 1С, всё то же самое можно делать из неё: выпускать коды на съёмку, узнавать, что съёмка состоялась, и проверять файлы. Ниже — что именно доступно, что для этого нужно и как это подключают.
Всё работает из кабинета, без единой строки кода. Интеграция нужна только чтобы делать то же самое из вашей CRM или 1С.
Тариф Business — для одноразовых кодов, вебхуков и отчётов. Кабинет, доставка файлов и проверка по ключу есть и на Pro.
Ключ API — создаётся в кабинете, раздел «Интеграции и API», за минуту.
Публичный адрес с https — только если хотите получать вебхуки.
Событий два: captured — по коду сняли (поля at, key, case_id) и verified — файл проверен (at, verdict, file_name, source, key). Вердикт приходит именем: TRUSTED_CAPTURE, TIME_UNCONFIRMED, UNVERIFIED_DEVICE, TAMPERED — теми же, что в открытом коде.
Ничего устанавливать на свои серверы, никаких библиотек и SDK — просто HTTP.
Обращаться в поддержку за ключом: он создаётся и отзывается самостоятельно.
Отдельных ключей на операции — один ключ работает для всего.
Опрашивать статусы, если подключены вебхуки.
api.trustvisor.ru — коды, статусы, отчёты, вебхуки, доставка.
portal.trustvisor.ru — проверка файлов.
Ключ передаётся в заголовке X-Api-Key. Показывается один раз при создании; потеряли — отзовите и создайте новый.
Типовой сценарий — страховая, СТО, логистика, стройка, любой другой.
В вашей системе создаётся заявка. Система вызывает наш API и получает код на съёмку, привязанный к номеру заявки, — с нужными условиями: сколько кадров, какое качество, нужна ли геометка.
Код уходит исполнителю так, как вы обычно общаетесь: СМС, мессенджер, письмо. Ему не нужен аккаунт — только приложение и код.
Исполнитель вводит код и снимает. Приложение само соблюдает условия кода и ведёт чек-лист обязательных кадров.
О съёмке ваша система узнаёт от нас вебхуком или опрашивает статус кода — заявка двигается по воронке без ручной работы.
Полученный файл система отправляет на проверку — вердикт возвращается за секунды и сам записывается в журнал кабинета.
Что можно вызвать. Все операции — обычные HTTP-запросы с JSON; полные примеры на curl, JavaScript и 1С — в документации.
| Операция | Как | Что получаете |
|---|---|---|
| Выпустить код на съёмку | POST /v1/business/case-codes с номером вашей заявки. Условия по желанию: лимиты фото и видео (потолок 10 видео и 30 фото подставляется, если не указать), качество, соотношение сторон, геометка — обязательна, по желанию или выключена, требование постоянной связи, максимальная длительность, чек-лист до 20 пунктов. | Код вида TV-XXXX-XXXX и два срока: сутки до первого ввода в приложение, дальше сутки с активации. |
| Узнать состояние кода | GET /v1/business/case-codes/{код} — один код или все разом. | Не введён / в работе / истёк; состоялась ли съёмка; сколько снято из разрешённого; прогресс чек-листа; отмечен ли файл полученным. |
| Отметить, что файл дошёл | POST …/case-codes/{код}/mark-received | Отметка «получен» в кабинете и в статусе кода. |
| Отчёт по заявке | GET …/case-codes/{код}/report | Выпуск, активация, каждая съёмка, чек-лист, получение, все проверки — собирается из журналов, видео на сервере нет. |
| Проверить файл | POST portal.trustvisor.ru/v1/verify, файл в поле package. | Вердикт — TRUSTED_CAPTURE (подлинно), TIME_UNCONFIRMED (момент не подтверждён), UNVERIFIED_DEVICE (не аттестовано), TAMPERED (изменён) — плюс момент съёмки с указанием, чем он подтверждён, каждая проверка поимённо и разобранный состав съёмки: номер заявки, реквизит, пункт чек-листа, координаты, время, модель устройства. Файл не хранится дольше проверки; каждая проверка попадает в журнал «Проверки». |
| Дать исполнителю проверить себя | POST /v1/verify-by-code?code=TV-… — без ключа и без входа, сам код служит пропуском; то же из браузера — страница portal.trustvisor.ru/upload.html. | Вердикт с привязкой к заявке — в ваш журнал; письма и вебхуки срабатывают те же. Подрядчик убеждается, что прислал годное, до того как уедет с объекта. |
| Получать события | Вебхук на ваш адрес — создаётся в кабинете, подробности ниже. | Сообщение, что файл проверен, и сообщение, что по коду состоялась съёмка. |
| Письма о вердиктах | Настройка в кабинете. | Письмо при вердикте «изменён» — включено по умолчанию; при «не аттестовано» — по желанию. |
| Доставка файлов | Настройка в кабинете; список присланных с вердиктами и путями — по ключу (GET /v1/business/uploads). | Файлы проверяются при приёме и уходят в ваш Яндекс.Диск; у нас остаётся журнал с вердиктом и путём. Пределы тут два, и оба про очередь, а не про хранение: очередь в самом телефоне держит сто пакетов (переполнилась — вытесняются самые старые, свежая съёмка нужнее), а у нас в ожидании отправки — до 5 ГБ на всех. Это буфер на случай, когда ваше хранилище недоступно, а не полка: застрявший файл мы пробуем отправить двенадцать раз с нарастающей паузой и удаляем не позже недели. Своего хранилища для чужих съёмок у нас нет — режима «хранить у нас» в сервере не существует с 9 сентября 2026 года. |
| Журналы | GET /v1/business/shots, …/devices, …/verifications, …/activity | Съёмки, устройства, проверки и действия в кабинете — чтение по ключу. Точных координат в журнале нет: они живут только внутри подписанного файла. |
Вебхуки: события в вашу систему. Вместо опроса статусов мы сами отправляем POST-запрос на ваш адрес. Вебхук создаётся в кабинете — намеренно не по API: ключ API хранится в чужих конфигах и логах и утекает легче, чем вход в кабинет. При создании выдаётся секрет подписи, он показывается один раз.
| Событие | Когда приходит | Оговорка |
|---|---|---|
| verified | Проверка пакета записана в журнал — из кабинета, по API или через самопроверку исполнителя. В теле — вердикт, имя файла, источник. | Работает для любой проверки по вашим ключам и кодам. |
| captured | Первая завершённая съёмка по коду заявки. В теле — код и номер заявки. | Сообщение о съёмке шлёт приложение версии 1.3.0 и новее; у исполнителя должна стоять актуальная версия. |
Каждый запрос несёт заголовки с именем события, номером доставки и подписью X-TrustVisor-Signature: sha256=… — HMAC-SHA256 сырого тела вашим секретом, так что чужой запрос к вашему адресу не выдаст себя за наш. Ответьте любым кодом 2xx за 6 секунд. Не успели или упали — повторим до 6 раз с нарастающими интервалами: 1 минута → 5 минут → 30 минут → 2 часа → 6 часов; при повторе номер доставки тот же, обрабатывайте события идемпотентно. До 5 вебхуков на компанию, адрес — только внешний.
Как это выглядит в коде. Три примера — выпуск кода, ответ проверки файла и тело вебхука. Полный набор с примерами на JavaScript и 1С — в документации.
Выпустить код на съёмку под вашу заявку:
curl -X POST https://api.trustvisor.ru/v1/business/case-codes \
-H "X-Api-Key: ваш_ключ" -H "Content-Type: application/json" \
-d '{"case_id": "ОСАГО-4471", "max_videos": 2, "max_photos": 10,
"gps_mode": "required", "checklist": ["4 угла", "VIN", "одометр"]}'
→ {"key": "TV-X7G9-2KPL", "case_id": "ОСАГО-4471",
"expires_at": "2026-09-05T09:12:00Z", "max_videos": 2, "max_photos": 10}
Проверить присланный файл. Ответ ниже — настоящий, получен на демонстрационном пакете с этой страницы; длинные значения обрезаны:
curl -X POST https://portal.trustvisor.ru/v1/verify \
-H "X-Api-Key: ваш_ключ" -F "package=@REC_20260622_0702.trustvisor"
→ {
"verdict": "TRUSTED_CAPTURE",
"isPhoto": false,
"trustDowngrade": false,
"moment": 1787805891039, // момент съёмки, мс UTC
"momentSource": "token", // чем подтверждён: anchor | token | device
"offlineHours": null, // сколько телефон был без связи до съёмки
"deviceClockShiftMin": null, // расхождение часов телефона с сервером
"locationMock": false, // замечено приложение подмены координат
"checks": {
"session": true, "pubkey": true, "hash": true,
"sigStart": true, "sigEnd": true, "attestation": true,
"oid": { "state": "pass" },
"rootOfTrust": { "state": "pass" },
"challengeFreshness": { "state": "pass" },
"anchor": { "state": "skip" },
"deviceClock": { "state": "skip" },
"serverClock": { "state": "pass" },
"timestamp": { "state": "pass" },
"keybound": { "state": "pass" },
"gpstime": { "state": "skip" },
"locationNet": { "state": "skip" },
"gnssPortrait": { "state": "skip" },
"locationMock": { "state": "skip" },
"durationCap": { "state": "skip" },
"motion": { "state": "na" }
},
"meta": { "sm": { манифест начала записи },
"em": { манифест конца: хеш видео, координаты, движение } }
}
Демонстрационный пакет снят приложением версии 1.2.1, поэтому проверки, появившиеся в версии 1.4, отвечают skip — сравнивать в таком файле нечего. Для съёмки из свежего приложения на их месте настоящие значения: anchor подтверждает момент по серверным часам и momentSource становится anchor, deviceClock показывает расхождение часов телефона, locationNet сверяет координаты со спутника с координатами по сотовой сети и Wi-Fi, gnssPortrait отдаёт портрет спутникового сигнала.
Каждая проверка возвращается поимённо, поэтому в своей системе можно не просто показать вердикт, а объяснить его: например, отдельно отметить, что подпись верна, но телефон не выходил в сеть и подтверждение момента просрочено.
Вебхук, который мы отправим на ваш адрес после проверки:
POST https://ваша-crm.ru/hooks/trustvisor
X-TrustVisor-Event: verified
X-TrustVisor-Delivery: 41f0c3b2-…
X-TrustVisor-Signature: sha256=hmac_тела_вашим_секретом
{"event": "verified", "at": "2026-09-04T12:46:21Z",
"verdict": "TAMPERED", "file_name": "obekt-14.trustvisor", "source": "api"}
Проверьте подпись — и можно доверять телу запроса: sha256= плюс HMAC-SHA256 сырого тела вашим секретом. Событие captured устроено так же и приходит, когда по коду состоялась первая съёмка.
Рецепты для типовых систем.
Роботы Битрикса умеют слать исходящие вебхуки, но не умеют добавлять свой заголовок с ключом — прямой вызов из робота не собрать. Рабочие пути: связка через Albato, ApiX-Drive, n8n или Make, либо небольшое локальное приложение Битрикс24 на вашем хостинге, которое принимает событие сделки, вызывает наш API и двигает стадию по нашим вебхукам.
Salesbot и digital pipeline умеют шаг «отправить вебхук» — тоже без своих заголовков, поэтому схема та же: no-code-платформа или свой мини-обработчик, который держит ключ и ходит в наш API.
Из 1С наш API вызывается штатно, без посредников: HTTPСоединение к api.trustvisor.ru, заголовок с ключом, JSON в теле. Пример на встроенном языке — в документации.
Любая платформа связок с шагом «HTTP-запрос с заголовками» подключается за вечер: триггер вашей CRM → POST к нам с ключом → записать код из ответа в поле сделки. Наши вебхуки эти платформы принимают штатным триггером. Свой сайт или внутренняя система — просто HTTP: выпуск кода один POST, проверка файла один POST, события — вебхук.
Лимиты и ошибки. Выпуск кодов — 30 запросов в минуту; все точки портала, включая проверку файла, — 20 запросов в минуту с одного адреса. Если ваши сотрудники выходят в интернет через общий адрес, счёт идёт на всю компанию сразу — напишите нам, поднимем под ваш объём. Это настройка, а не свойство системы.
| Код | Значение |
|---|---|
| 401 | Не передан ключ, либо он неверный или отозван. |
| 400 | Запрос не удалось разобрать; для вебхуков — недопустимый адрес или превышен лимит в 5 вебхуков. |
| 402 / 403 client_plan_required | Коды на съёмку доступны только на тарифе Business. |
| 403 api_key_not_allowed_here | Операции нужен вход в кабинет — ключ API её не открывает: покупка ключей, настройка доставки, удаление файлов, создание и удаление вебхуков, история платежей. |
| 404 | Код или вебхук не найден — или принадлежит другой компании. |
| 413 / 422 | Файл слишком большой / файл отклонён как подозрительный до полной проверки. |
| 429 | Превышен лимит запросов. |
Без кода вообще. Коды можно выпускать и смотреть их состояние командой в Telegram-боте — без кабинета и без API. Бота подключаем мы по запросу: пришлём ссылку на подключение.
Документация и помощь. Полное описание с примерами на curl, JavaScript и 1С — portal.trustvisor.ru/docs.html. Нужна помощь со связкой под вашу систему — напишите на info@trustvisor.ru, поможем собрать.
Мы не просим менять процессы, выделять бюджет или внедрять что-то «по всей компании». Выберите одну точку, где доверие ещё не наработано: одну бригаду, один филиал или один объект. Две недели они снимают как обычно — просто через наше приложение.
Через две недели у вас цифры: сколько съёмок, сколько прошло проверку — и как выглядит спорный случай, когда у вас есть подпись.
Месяц бесплатно — без карты и договора. Если решите продолжить, выберете любой тариф. Срок можно продлить:
Первый шаг делается сегодня и без нас: снимите что угодно, откройте проверку и посмотрите вердикт. Бесплатно, без регистрации и без разговора с нами — это единственный способ понять, годится ли вам сервис.
Опишите, чего не хватает — читаем всё. Полезно указать сферу бизнеса, если задача с ней связана.
Редакция от 9 сентября 2026 г.
Индивидуальный предприниматель Савкин Михаил Андреевич (ОГРНИП 326210000056797, ИНН 212885679288), применяющий специальный налоговый режим «Налог на профессиональный доход» (далее — «Исполнитель»), публикует настоящий документ, являющийся официальным предложением (публичной офертой) в адрес любого дееспособного физического или юридического лица (далее — «Пользователь») заключить договор на изложенных ниже условиях. В соответствии с п. 2 ст. 437 ГК РФ, акцепт этих условий равносилен заключению договора.
«Приложение» / «Программа» — программа для ЭВМ «TrustVisor» для Android, предназначенная для съёмки фото- и видеоматериалов с формированием криптографической подписи и метаданных, подтверждающих подлинность и целостность материала.
«Сайт» — trustvisor.ru и его поддомены (включая api.trustvisor.ru и portal.trustvisor.ru).
«Верификатор» — модуль (веб-страница и/или API) для проверки подлинности файлов, сформированных Приложением.
«Личный кабинет» — раздел Сайта, доступный Пользователю платного Тарифа после входа, предназначенный для управления Лицензионными ключами, Одноразовыми кодами доступа, доставкой файлов, интеграциями и подпиской.
«Лицензионный ключ» — код доступа к функциональности Приложения в пределах установленного лимита устройств.
«Тариф» — «Free» (бесплатный), «Pro» (платный, для собственных сотрудников Пользователя) или «Business» (платный, включает выпуск и отслеживание Одноразовых кодов доступа для третьих лиц, а также приобретение дополнительных Лицензионных ключей на условиях раздела 3 настоящей Оферты).
«Одноразовый код доступа» — код, выпускаемый Пользователем тарифа «Business» для однократного использования третьим лицом, не являющимся сотрудником Пользователя, в рамках отдельной заявки/дела.
«Расчётный период» — календарный месяц с даты первой оплаты.
«Подписка» — периодическая (ежемесячная) форма оплаты доступа к платному Тарифу («Pro» или «Business»).
Исполнитель оказывает Пользователю услугу по предоставлению технического доступа к функциональности Приложения (в том числе посредством выдачи и серверной валидации Лицензионного ключа) в объёме, соответствующем выбранному Тарифу.
В состав услуги по платным Тарифам также входят: доступ к Личному кабинету; проверка файлов через Верификатор, в том числе программным способом по ключу доступа к API; передача уведомлений о событиях (съёмка состоялась, файл проверен) на указанный Пользователем адрес его информационной системы; автоматическая доставка снятых файлов в выбранное Пользователем хранилище — если Пользователь включил эти возможности в Личном кабинете.
Приложение устанавливается Пользователем самостоятельно из магазина приложений на условиях отдельного Лицензионного соглашения (EULA); предмет настоящей Оферты — именно услуга доступа, а не передача прав на само программное обеспечение. Приложение предоставляется «как есть» (as is).
Free — 0 ₽, бессрочно. 3 видео в день, 10 фото в день, только онлайн-съёмка (нужно подключение к интернету в момент записи), без GPS в манифесте, без Блокнота.
Pro — 600 ₽ за ключ в месяц (один ключ — один пользователь/устройство). Без ограничений по количеству видео и фото, возможность офлайн-съёмки, запись геоданных в манифест, Блокнот для рабочих записей, доступ к Личному кабинету, интеграция API верификатора. При покупке от 10 ключей одновременно — 400 ₽ за ключ в месяц.
Business — 5000 ₽ в месяц. Включает всё перечисленное в Тарифе «Pro», а также доступ к панели выпуска и отслеживания Одноразовых кодов доступа для третьих лиц, не являющихся сотрудниками Пользователя (например, для проверки материалов, предоставленных клиентом или подрядчиком Пользователя в рамках отдельной заявки), в количестве до 100 кодов в расчётный период включительно.
Одноразовые коды сверх включённого количества. Каждые следующие 100 Одноразовых кодов доступа в пределах одного расчётного периода оплачиваются дополнительно в размере 4000 (четыре тысячи) рублей. Плата начисляется в момент выпуска кода, которым начинается очередная сотня (101-й, 201-й и так далее), и списывается с привязанной банковской карты. Выпуск кода не блокируется. Пользователь видит текущий расход кодов и начисленные доплаты в Личном кабинете.
Индивидуальные условия. Исполнитель вправе по соглашению с отдельным Пользователем установить иное включённое количество Одноразовых кодов доступа, иную стоимость или иные параметры Тарифа. В этом случае дополнительная плата, предусмотренная предыдущим абзацем, к такому Пользователю не применяется, а действуют согласованные с ним условия. Настоящий абзац не создаёт обязанности Исполнителя предоставлять аналогичные условия другим Пользователям.
Пользователю Тарифа «Business» также доступно приобретение Лицензионных ключей (как в Тарифе «Pro») по цене 400 (четыреста) рублей в месяц за ключ вне зависимости от количества приобретаемых ключей, а также золотая цветовая тема Приложения для таких ключей.
Исполнитель вправе менять состав функциональности Тарифов, уведомляя Пользователей платного Тарифа не менее чем за 10 дней, если изменение сокращает оплаченную функциональность.
Акцептом Оферты признаётся установка Приложения и активация в нём Лицензионного ключа, либо оплата Тарифа «Pro» или «Business». Договор считается заключённым с момента акцепта и действует до прекращения использования Приложения либо расторжения в порядке настоящей Оферты.
Исполнитель обязуется предоставить доступ к Приложению по оплаченному Тарифу, поддерживать техническую работоспособность Приложения и связанных серверных сервисов на уровне разумных усилий, уведомлять об изменении условий Оферты. Исполнитель вправе приостанавливать действие ключа при нарушении Пользователем условий Оферты и привлекать третьих лиц (операторов платежей, хостинг) для исполнения своих обязательств.
Пользователь обязуется использовать Приложение законно, не обходить технические ограничения Тарифов, своевременно оплачивать выбранный платный Тариф, предоставлять достоверные сведения при оформлении ключа.
Если Пользователь передаёт Лицензионный ключ и доступ к Приложению третьим лицам (в том числе своим работникам, далее — «Конечные пользователи»), он самостоятельно и за свой счёт обеспечивает соблюдение в отношении них законодательства о персональных данных, изображении гражданина (ст. 152.1 ГК РФ) и трудового законодательства (гл. 14 ТК РФ), включая получение необходимых согласий и уведомление до начала использования Приложения. Исполнитель не является стороной этих отношений. Пользователь вправе включить по своим Лицензионным ключам отчётность об использовании (агрегированные счётчики снятых фото и видео, без содержимого файлов) и автоматическую доставку снятых файлов; в этом случае Конечный пользователь информируется об этом в Приложении, а обязанность уведомить его до начала использования и оформить необходимые согласия лежит на Пользователе как работодателе (заказчике). Условия, на которых Исполнитель обрабатывает переданные ему файлы при включённой доставке, определены разделом 16 настоящей Оферты (поручение на обработку персональных данных).
Исполнитель применяет налоговый режим «Налог на профессиональный доход» (НПД). В соответствии с п. 8 ч. 2 ст. 4 Федерального закона № 422-ФЗ Исполнитель не вправе оказывать услуги по настоящей Оферте юридическому лицу, являющемуся его текущим работодателем либо являвшемуся работодателем менее двух лет назад — соответственно, такое юридическое лицо не может приобрести доступ к Сервису от своего имени. Это не распространяется на физических лиц — работников такого юридического лица, приобретающих доступ лично для себя.
Free — бесплатно. Стоимость Тарифов «Pro» и «Business» указана в разделе 3 настоящей Оферты.
Доступ к платному Тарифу («Pro» или «Business») предоставляется на условиях Подписки — ежемесячного автоматического списания. Оформляя Подписку, Пользователь даёт согласие на регулярное (рекуррентное) списание денежных средств за каждый очередной расчётный период до отказа от Подписки, а также на списание дополнительной платы, предусмотренной разделом 3 настоящей Оферты — за приобретённые Лицензионные ключи и за Одноразовые коды доступа сверх включённого количества. Размер каждой такой доплаты и основание её начисления отражаются в Личном кабинете.
При оформлении доступа к платному Тарифу Пользователь указывает ФИО/наименование организации — порядок обработки этих данных определяется Политикой конфиденциальности.
Исполнитель вправе по своему усмотрению предоставлять отдельным Пользователям временный бесплатный доступ к платному Тарифу («Pro» или «Business») на основании индивидуальной договорённости в переписке. Условия каждый раз согласовываются отдельно и не создают обязанности предоставлять аналогичные условия другим Пользователям.
Пользователь вправе в любой момент отказаться от Подписки — в личном кабинете (раздел «Оплата») или написав на info@trustvisor.ru; дальнейшие списания прекращаются, доступ сохраняется до конца оплаченного периода. Исполнитель вправе приостановить доступ Пользователю, нарушившему условия Оферты, без возврата средств за текущий период.
Пользователь вправе обратиться за возвратом денежных средств, направив запрос на info@trustvisor.ru. Исполнитель рассматривает такое обращение в течение 10 рабочих дней и, при отсутствии обстоятельств, указанных в абзаце третьем настоящего раздела, возвращает денежные средства за неиспользованную часть оплаченного расчётного периода, за вычетом фактически понесённых расходов. Возврат производится тем же способом, которым была произведена оплата.
Плата за уже выпущенные Одноразовые коды доступа и за уже использованные Лицензионные ключи возврату не подлежит.
Возврат не производится, если доступ был приостановлен вследствие нарушения Пользователем раздела 12 настоящей Оферты.
Настоящий раздел не ограничивает права Пользователя-потребителя, установленные Законом РФ «О защите прав потребителей», в том числе право на отказ от исполнения договора об оказании услуг (ст. 32).
Исполнитель вправе в одностороннем порядке изменять условия Оферты, публикуя новую редакцию на Сайте с указанием даты редакции. Продолжение использования Приложения после вступления изменений в силу означает согласие с новой редакцией. Изменения, касающиеся состава обрабатываемых персональных данных, доводятся до Конечных пользователей отдельно в порядке, предусмотренном Политикой конфиденциальности.
Исполнитель не несёт ответственности за недоступность Приложения по независящим от него причинам (отсутствие интернета у Пользователя, неисправность устройства, форс-мажор), а также за содержание и правовые последствия использования созданных Пользователем материалов. Если Пользователю предъявлены претензии со стороны его Конечных пользователей или госорганов из-за несоблюдения раздела 5 (ненадлежащее получение согласий), Пользователь возмещает Исполнителю все убытки самостоятельно.
Пользователю запрещается использовать Приложение и Сервис для: скрытого наблюдения за физическими лицами без ведома и правового основания; промышленного шпионажа и несанкционированного сбора коммерческой тайны; сбора биометрических данных без правового основания; слежки за работниками в нарушение трудового законодательства; перепродажи или сублицензирования доступа без письменного согласия Исполнителя; иных действий, нарушающих законодательство РФ или права третьих лиц. При нарушении Исполнитель вправе немедленно, без предупреждения, заблокировать доступ без возврата средств.
ИП Савкин Михаил Андреевич ОГРНИП 326210000056797 ИНН 212885679288 info@trustvisor.ru
Отношения Сторон, не урегулированные Офертой, регулируются законодательством РФ. Вопросы обработки персональных данных регулируются отдельной Политикой конфиденциальности. Споры разрешаются путём переговоров, а при недостижении согласия — в порядке, установленном законодательством РФ.
Сервис предназначен для использования на территории Российской Федерации. Серверная инфраструктура Исполнителя расположена на территории Российской Федерации. Настоящая Оферта, а также отношения Сторон, связанные с ней, регулируются правом Российской Федерации.
Доступность Приложения в магазинах приложений в иных странах не означает, что Исполнитель адресует Сервис лицам, находящимся за пределами Российской Федерации, и не влечёт применения к отношениям Сторон права иных государств, если иное прямо не следует из императивных норм применимого законодательства.
Настоящий раздел применяется только в случае, если Пользователь включил автоматическую доставку снятых файлов. По умолчанию доставка выключена: снятые файлы остаются на устройстве Конечного пользователя и Исполнителю не передаются — в этом случае настоящий раздел не применяется.
Включая доставку, Пользователь как оператор поручает Исполнителю обработку персональных данных, содержащихся в снятых файлах и в сопровождающих их данных о съёмке, на условиях настоящего раздела (ч. 3 ст. 6 Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных»). Оператором остаётся Пользователь; Исполнитель действует по его поручению и самостоятельно целей обработки не определяет.
Перечень персональных данных. Изображения и видеозаписи, полученные Приложением, включая содержащиеся в них изображения граждан; данные о съёмке из подписанного манифеста — дата и время, координаты и точность определения места, модель устройства, идентификатор Лицензионного ключа или Одноразового кода доступа, реквизит съёмки, заданный Пользователем.
Перечень действий. Приём файла от Приложения; автоматизированная проверка подписи и целостности файла; передача файла в хранилище, указанное Пользователем; временное хранение на время передачи, а при недоступности хранилища Пользователя — на время повторных попыток, но не более 7 (семи) суток с момента приёма; удаление файла с серверов Исполнителя сразу после передачи либо по истечении указанного срока. Иные действия с содержимым файлов Исполнителем не совершаются: содержимое не просматривается, не используется для обучения моделей и не передаётся третьим лицам, за исключением привлечённых Исполнителем лиц, указанных в Политике конфиденциальности.
Цели обработки. Доставка файла адресату, выбранному Пользователем, и проверка подлинности файла для отображения её результата в Личном кабинете Пользователя. Иных целей обработки поручением не предусмотрено.
Конфиденциальность и защита. Исполнитель обязуется не раскрывать и не распространять персональные данные без согласия Пользователя, если иное не предусмотрено федеральным законом, и обеспечивать их безопасность при обработке в соответствии со ст. 19 152-ФЗ: обработка на серверах, расположенных на территории Российской Федерации; передача по защищённым каналам связи; ограничение доступа кругом лиц, которым он необходим для исполнения поручения; ведение журнала действий, доступного Пользователю в Личном кабинете.
Срок действия и уничтожение. Поручение действует, пока у Пользователя включена доставка. При выключении доставки, прекращении договора либо по письменному требованию Пользователя Исполнитель прекращает обработку и уничтожает переданные файлы; сведения об уничтожении предоставляются Пользователю по его запросу.
Ответственность. Исполнитель отвечает перед Пользователем за соблюдение условий настоящего поручения. Ответственность перед субъектами персональных данных за обработку, осуществляемую Исполнителем по поручению, несёт Пользователь как оператор (ч. 5 ст. 6 152-ФЗ).
Что остаётся на Пользователе. Правовое основание обработки, получение согласий Конечных пользователей и их уведомление до начала использования Приложения — в порядке, предусмотренном разделом 5 настоящей Оферты.
Редакция от 9 сентября 2026 г.
ИП Савкин Михаил Андреевич, ОГРНИП 326210000056797, ИНН 212885679288. Контакт: info@trustvisor.ru
Через Приложение (на сервер лицензий): уникальный идентификатор устройства (Android ID) — при проверке и выдаче лицензионного ключа; сам лицензионный ключ; IP-адрес и стандартные технические данные — в логах сервера; при оформлении платного Тарифа («Pro» или «Business») — ФИО/наименование организации и id платёжной транзакции; при включённой отчётности об использовании — Пользователем в настройках приложения либо владельцем Лицензионного ключа в панели управления — агрегированное количество снятых фото и видео за период и время последнего полученного отчёта (для тарифов «Pro»/«Business», без содержимого или иных метаданных самих файлов); о включении отчётности владельцем ключа Конечный пользователь информируется в настройках Приложения; отпечаток (SHA-256) снятого файла — депонируется в реестр подтверждения сразу после съёмки (только хэш, сами фото и видео не передаются); при съёмке по Одноразовому коду доступа — отметка о факте съёмки (тип файла, время, номер заявки и пункт чек-листа, если они заданы владельцем кода) — она отображается владельцу кода в панели.
Через Личный кабинет (portal.trustvisor.ru): адрес электронной почты владельца доступа — он же является именем для входа; одноразовые коды входа, направляемые на этот адрес (хранятся в необратимом виде и погашаются после использования); сведения о доверенных устройствах входа, с которых осуществлялся вход, и заданный для них ПИН-код (хранится в необратимом виде, восстановить его невозможно); при включённом двухфакторном подтверждении — секрет приложения-аутентификатора в зашифрованном виде и резервные коды; IP-адрес и стандартные технические данные сессии; журнал действий в кабинете (вход, выпуск и отзыв ключей, изменение настроек доставки и интеграций).
Через сайт: при заполнении формы «Запросить демо» — имя, название компании, e-mail, текст сообщения; стандартные технические данные посещения (IP-адрес, логи веб-сервера); при согласии посетителя — обезличенные события использования Сайта: какие страницы открывались, докуда прокручены, какие кнопки нажаты, начата и отправлена ли форма, запускалась ли проверка файла и с каким вердиктом. Без согласия эти события не собираются вовсе (состав, условие и сроки — в разделе 9).
Не собирается вообще: содержимое фото- и видеозаписей (хранится только на устройстве Пользователя; исключение — включённая автоматическая доставка: её включает владелец Лицензионного ключа (организация) в панели управления, и тогда снятый файл целиком передаётся в выбранное владельцем ключа хранилище. Через серверы Исполнителя файл при этом проходит транзитом: он принимается, автоматически проверяется на подлинность и целостность, передаётся в хранилище владельца ключа и удаляется с серверов Исполнителя сразу после передачи. Собственного хранилища для снятых файлов Исполнитель не предоставляет. Если хранилище владельца ключа временно недоступно, файл сохраняется у Исполнителя исключительно ради повторных попыток передачи и удаляется в любом случае не позднее 7 (семи) суток с момента приёма. Исполнитель содержимое файлов не просматривает и не использует. О включённой доставке Конечный пользователь информируется в самом Приложении — предупреждением до съёмки и строкой в настройках; отключить доставку в Приложении он не может, этим распоряжается владелец ключа), GPS-координаты (встраиваются в манифест снятого файла; при выключенной доставке остаются вместе с ним на устройстве, при включённой — передаются в составе файла тому же адресату, что указан выше), содержимое Блокнота приложения. Сторонние аналитические или рекламные модули в Приложении не используются.
Предоставление доступа к функциональности Приложения по выбранному Тарифу; идентификация Пользователя и учёт выданных лицензионных ключей; предоставление доступа к Личному кабинету и защита этого доступа; предотвращение злоупотреблений (в т.ч. отзыв ключа при недостоверных данных); ответ на запросы через форму «Запросить демо»; связь с Пользователем по вопросам использования Сервиса.
Данные, необходимые для исполнения договора (Оферты) — на основании п. 5 ч. 1 ст. 6 152-ФЗ, без отдельного согласия. ФИО/наименование и id транзакции при оформлении платного Тарифа («Pro» или «Business»), а также данные формы «Запросить демо» — на основании согласия субъекта (п. 1 ч. 1 ст. 6 152-ФЗ).
В отношении Конечных пользователей (работников и подрядчиков владельца Лицензионного ключа) правовое основание обработки обеспечивает владелец ключа как их работодатель или заказчик — в порядке, предусмотренном разделом 5 Оферты.
Данные хранятся на серверах, расположенных на территории РФ (ч. 5 ст. 18 152-ФЗ).
| Что | Срок |
|---|---|
| Данные лицензии | срок действия ключа и 1 год после истечения/отзыва |
| Данные, связанные с оплатой | сроки по законодательству о бухгалтерском/налоговом учёте (как правило, не менее 4 лет) |
| Технические логи | не более 90 дней |
| Заявки с формы «Запросить демо» | до отзыва согласия, но не более 3 лет |
| Одноразовые коды входа в кабинет | до использования, но не более 1 часа |
| Сведения о доверенных устройствах входа | до отзыва устройства владельцем доступа либо 1 год после последнего входа |
| Снятые файлы при включённой доставке | до передачи в хранилище владельца ключа (как правило — секунды); при недоступности хранилища — не более 7 суток, далее удаляются автоматически |
| Отпечатки (SHA-256) в реестре подтверждения | бессрочно |
Почему реестр хранится бессрочно. Смысл реестра — подтвердить, что файл существовал уже в момент съёмки. Такое подтверждение обязано пережить и лицензию, и договор: если запись удалить, доказательство перестанет работать именно тогда, когда понадобится. В реестр записывается только математический отпечаток файла — по нему невозможно восстановить ни изображение, ни звук, ни координаты.
Данные не продаются и не передаются в целях, не связанных с исполнением договора.
Для работы Сервиса привлекаются: хостинг-провайдер (размещение серверов на территории РФ) и оператор платёжных услуг (обработка оплаты платного Тарифа) — как лица, осуществляющие обработку по поручению Оператора.
Передача владельцу Лицензионного ключа. Если владелец ключа (организация) включил в панели управления автоматическую доставку, снятый файл целиком — включая изображение или видеозапись и содержащиеся в манифесте GPS-координаты, время и модель устройства — передаётся владельцу ключа в его собственное хранилище; через серверы Исполнителя файл проходит транзитом, без хранения. Владелец ключа выступает самостоятельным лицом, определяющим цели дальнейшей обработки этих данных.
Передача уведомлений в информационную систему владельца ключа. Если владелец ключа настроил в панели управления адрес для уведомлений, на этот адрес передаются сведения о наступивших событиях — факт съёмки (тип файла, время, номер заявки) и результат проверки файла. Содержимое файлов таким образом не передаётся.
Об обеих возможностях Конечный пользователь информируется в Приложении до начала съёмки.
Вы вправе получить информацию об обработке своих данных, требовать их уточнения, блокирования или уничтожения, отозвать согласие, обратиться в Роскомнадзор или в суд. Для реализации прав — обращение на info@trustvisor.ru. Отзыв согласия в отношении данных, необходимых для исполнения договора, может повлечь невозможность дальнейшего доступа к платному Тарифу.
Порядок направления запроса на удаление данных описан на отдельной странице Сайта: trustvisor.ru/#data-deletion
Передача данных — по защищённому протоколу (HTTPS/TLS). Доступ к административным функциям управления ключами ограничен паролем и отдельным секретным ключом доступа. Вход в Личный кабинет производится по одноразовому коду, направляемому на подтверждённый адрес электронной почты; владелец доступа может дополнительно включить двухфакторное подтверждение. ПИН-коды доверенных устройств и одноразовые коды входа хранятся в необратимом виде — их невозможно прочитать, только сверить. Секрет двухфакторного подтверждения хранится в зашифрованном виде. Состав лиц с доступом к серверной инфраструктуре ограничен.
В Личном кабинете используются технически необходимые cookie — для поддержания сессии входа и защиты от подделки запросов; без них вход невозможен.
На Сайте cookie не используются вовсе. Вместо них Сайт сохраняет в самом браузере посетителя выбранную тему оформления («tv-theme») и ответ на вопрос о согласии («tv-consent»); что появляется после согласия — ниже.
Посещаемость Исполнитель считает сам, и только с согласия посетителя. Сторонние аналитические и рекламные счётчики — в том числе Яндекс.Метрика и Google Analytics — не используются. Пока посетитель не нажал «Принять» в баннере, на сервер не передаётся ни одного события. При согласии записываются: вид события (открытие страницы, глубина прокрутки, нажатие на ссылку или кнопку с её надписью, начало и отправка формы, запуск проверки файла и её вердикт словом, переход на внешнюю ссылку, выбранная тема), адрес страницы без строки запроса, домен, с которого посетитель пришёл, метки рекламной кампании из ссылки, класс устройства и ширина окна, язык браузера, номер вкладки и время события по часам сервера. IP-адрес посетителя при этом не записывается; содержимое форм, имена и содержимое проверяемых файлов — тоже. Записи хранятся 90 дней и удаляются автоматически.
Как спрашивается согласие. При первом заходе в правом нижнем углу появляется баннер с двумя ответами — «Принять» и «Отказаться». До ответа события копятся только в памяти вкладки и на сервер не уходят: согласился — уйдут разом, отказался или закрыл страницу не ответив — пропадут вместе со вкладкой. Отказ означает, что счёт посещений не ведётся вообще, а не что он ведётся обезличенно.
Что сохраняется в браузере и когда. До согласия — ничего. После «Принять» появляются номер вкладки («tv-sid», живёт до её закрытия) и случайный номер посетителя («tv-vid»), не связанный ни с какими сведениями о нём и нужный только чтобы отличать повторный визит от нового. Ответ на сам вопрос («tv-consent») сохраняется в любом случае — иначе баннер спрашивал бы снова на каждой странице. Если браузер передаёт признак «Do Not Track», баннер не показывается и сбор не ведётся. Отозвать согласие можно, очистив данные сайта средствами браузера.
Оператор вправе вносить изменения в настоящую политику. Актуальная версия всегда размещена на сайте trustvisor.ru с указанием даты редакции.
Если изменения расширяют состав обрабатываемых данных или цели обработки, Оператор доводит их до сведения пользователей до начала обработки в новом объёме: в Приложении — отдельным экраном с указанием того, что именно изменилось, требующим подтверждения; владельцам доступа к Личному кабинету — письмом на указанный адрес электронной почты.
Обработка персональных данных осуществляется на территории Российской Федерации и регулируется законодательством Российской Федерации, в том числе Федеральным законом № 152-ФЗ. Сервис предназначен для использования на территории Российской Федерации.
Редакция от 2 сентября 2026 г.
ИП Савкин Михаил Андреевич (ОГРНИП 326210000056797, ИНН 212885679288, далее — «Правообладатель») является правообладателем программы для ЭВМ «TrustVisor». Устанавливая и/или используя Приложение, Пользователь принимает условия настоящего Соглашения.
Настоящее Соглашение регулирует права на использование Приложения как объекта интеллектуальной собственности. Условия доступа к тарифам, оплата и подписка регулируются отдельной Публичной офертой. При противоречии по тарифам и оплате действует Оферта, по правам на код — настоящее Соглашение.
Правообладатель предоставляет Пользователю простую, неисключительную, безвозмездную лицензию на установку и использование Приложения, а также на использование связанных с ним веб-интерфейсов (Верификатора и Личного кабинета) в объёме, соответствующем оплаченному Тарифу. Все права на Приложение, включая исключительное право, исходный код, дизайн и товарные знаки, принадлежат Правообладателю и не передаются Пользователю. Это не относится к ядру проверки подлинности файлов, опубликованному Правообладателем отдельно на условиях лицензии Apache License 2.0 (github.com/Mikhail-Savkin/Trustvisor_verify_core): права на него предоставляются на условиях указанной лицензии, а права на Приложение публикация ядра не затрагивает.
Запрещается: распространение, сдача в аренду или сублицензирование Приложения третьим лицам вне порядка, предусмотренного Офертой; модификация, декомпиляция и обратная разработка Приложения (за исключением случаев, прямо разрешённых ст. 1280 ГК РФ); удаление знаков охраны авторских прав; создание конкурирующих продуктов на основе Приложения; обход технических средств защиты и ограничений Тарифов.
Правообладатель вправе выпускать обновления Приложения. Условия Соглашения распространяются на все последующие версии, если при обновлении не указано иное.
Приложение предоставляется «как есть» (as is), без гарантии бесперебойной работы на всех устройствах. Правообладатель не гарантирует, что созданные материалы будут приняты в качестве доказательств в конкретном судебном или ином процессе — это относится к компетенции органа, рассматривающего дело.
Правообладатель не отвечает за косвенные убытки и упущенную выгоду в связи с использованием Приложения, в максимальной степени, допустимой законодательством РФ. Это не ограничивает права Пользователя-потребителя, установленные императивными нормами закона.
Соглашение действует с момента установки Приложения до его удаления. Правообладатель вправе прекратить лицензию при нарушении Пользователем раздела 3.
При получении Приложения через Google Play или аналогичный сервис на Пользователя также распространяются условия соответствующего магазина. Оператор магазина приложений не является стороной настоящего Соглашения.
ИП Савкин Михаил Андреевич ОГРНИП 326210000056797 ИНН 212885679288 info@trustvisor.ru
Настоящее Соглашение регулируется правом Российской Федерации. Приложение предназначено для использования на территории Российской Федерации; его доступность в магазинах приложений в иных странах не влечёт применения права иных государств, если иное прямо не следует из императивных норм применимого законодательства.
Редакция от 2 сентября 2026 г.
Оформляя доступ к платному Тарифу («Pro» или «Business») либо активируя Лицензионный ключ в Приложении, Пользователь даёт согласие ИП Савкину Михаилу Андреевичу (ОГРНИП 326210000056797, ИНН 212885679288) на обработку следующих персональных данных в соответствии со ст. 9 Федерального закона № 152-ФЗ.
При оформлении доступа: ФИО (для физического лица) либо наименование организации; идентификатор платёжной транзакции; адрес электронной почты и иные контактные данные — если предоставлены.
При использовании Приложения: уникальный идентификатор устройства (Android ID); IP-адрес и стандартные технические данные соединения; математический отпечаток (SHA-256) снятого файла.
При включённой владельцем Лицензионного ключа автоматической доставке: содержимое снятых фото- и видеофайлов и содержащиеся в них метаданные, в том числе точные координаты места съёмки (GPS), время съёмки и модель устройства. Об этом Пользователь дополнительно информируется в самом Приложении до начала съёмки.
При использовании Личного кабинета: адрес электронной почты как имя для входа; сведения о доверенных устройствах входа и заданный для них ПИН-код (в необратимом виде); при включённом двухфакторном подтверждении — секрет приложения-аутентификатора в зашифрованном виде; журнал действий в кабинете.
Предоставление доступа к функциональности Приложения; идентификация как стороны договора; учёт выданных лицензионных ключей; предоставление и защита доступа к Личному кабинету; доставка снятых файлов адресату, выбранному владельцем Лицензионного ключа; предотвращение злоупотреблений; связь по вопросам использования Сервиса. Подробности — в Политике конфиденциальности.
Сбор, запись, систематизация, накопление, хранение, уточнение, извлечение, использование, передача в случаях, предусмотренных Политикой конфиденциальности, обезличивание, блокирование, удаление, уничтожение.
Настоящее согласие даёт лицо, оформляющее доступ или активирующее Лицензионный ключ, — в отношении собственных персональных данных.
Если Лицензионный ключ или Одноразовый код доступа передаётся иным лицам (работникам, подрядчикам, клиентам владельца ключа), обязанность получить от них необходимые согласия и уведомить их до начала использования Приложения лежит на владельце ключа как их работодателе или заказчике — в порядке, предусмотренном разделом 5 Публичной оферты. Настоящее согласие таких лиц не заменяет.
Согласие действует до его отзыва либо до истечения срока хранения данных, установленного Политикой конфиденциальности. Отозвать согласие можно в любой момент, написав на info@trustvisor.ru. Отзыв согласия в отношении данных, необходимых для исполнения договора, может повлечь невозможность дальнейшего доступа к платному Тарифу.
Отпечатки (SHA-256), уже депонированные в реестр подтверждения, отзыву не подлежат: они не содержат сведений, позволяющих восстановить изображение, звук или местоположение, и хранятся бессрочно — иначе выданное подтверждение перестало бы действовать.
Если состав обрабатываемых данных или цели обработки расширяются, согласие в новом объёме запрашивается заново: Приложение показывает отдельный экран с описанием того, что именно изменилось, и продолжает работу только после подтверждения.