Розробникам

SDK, OAuth/OIDC та майбутні ендпоінти

SDK · web
<script src="https://sdk.dna-ai.online/v1/dna-id.js"></script>
<script>
  DNAiD.init({ clientId: "demo_client_id", redirectUri: location.origin + "/callback" });

  // Кнопка "Увійти через D.N.A."
  DNAiD.login({ scopes: ["openid", "profile", "proof:is_adult"] });

  // Запросити підпис документа
  const res = await DNAiD.sign({
    document: fileBytes,
    documentTitle: "Договір №12",
    requiredLevel: "advanced",
  });
  console.log(res.legalLevel); // "advanced" — ніколи "qualified" без Дія
</script>
API — усі 81 ендпоінти

base_url: той самий origin (VITE_API_BASE_URL не задано)

Автентифікація · 23

POST
/api/v1/auth/registerКрок 1: акаунт + виклик під генерацію ключів на пристрої
POST
/api/v1/auth/register/keysКрок 2: публічні ключі — лише з доказом володіння приватним
POST
/api/v1/auth/loginВхід паролем. При 2FA повертає pending-токен, не сесію
POST
/api/v1/auth/challengeВиклик для входу підписом або біометрією
POST
/api/v1/auth/biometricВхід підписом ключа з пристрою — без пароля
POST
/api/v1/auth/refreshRefresh одноразовий: старий помирає після обміну
POST
/api/v1/auth/logoutВийти з поточної сесії
POST
/api/v1/auth/logout-allВихід з усіх пристроїв. Діє негайно
GET
/api/v1/auth/meПрофіль: рівень, 2FA, спосіб відновлення
GET
/api/v1/auth/csrfCSRF-токен для наших сторінок
GET
/api/v1/auth/access-logЖурнал доступу — його бачить сам користувач
POST
/api/v1/auth/2fa/setupСекрет і QR-URI. Вмикається лише після verify
POST
/api/v1/auth/2fa/verifyЗавершення входу або увімкнення захисту
POST
/api/v1/auth/device/keyПрив'язати ключ із Secure Enclave / Keystore
GET
/api/v1/auth/device/keysМої пристрої
POST
/api/v1/auth/device/keys/{id}/revokeВідкликати ключ загубленого пристрою
GET
/api/v1/auth/recovery/optionsЩо доступно саме цьому користувачу
POST
/api/v1/auth/recovery/verify-keyЧи справді ключ належить акаунту
POST
/api/v1/auth/recovery/rotate-keysОстання інстанція: новий ключ замість втраченого
GET
/api/v1/auth/recovery/backupЧи є копія і що саме вона покриває
PUT
/api/v1/auth/recovery/backupПокласти конверт. Створити його міг лише пристрій
DELETE
/api/v1/auth/recovery/backupПрибрати копію
GET
/api/v1/auth/recovery/backup/envelopeКонверт для розшифрування на пристрої

Підпис · 15

POST
/api/v1/signСкорочений виклик підпису (псевдонім /sign/request)
POST
/api/v1/sign/requestКрок 1: сервіс просить підпис
POST
/api/v1/sign/executeКрок 2: підпис створено на пристрої, ми перевіряємо
POST
/api/v1/sign/declineВідмова — теж дія, і вона в журналі
GET
/api/v1/sign/requestsСписок запитів на підпис
GET
/api/v1/sign/{id}/statementЗаява, яку треба підписати
GET
/api/v1/sign/{id}/resultЧим завершився запит
GET
/api/v1/sign/{id}Один підпис. Чужий дає 404, а не 403
GET
/api/v1/sign/{id}/proofДоказ для суду або аудиту
GET
/api/v1/signaturesАрхів власних підписів
POST
/api/v1/sign/verifyВідкрита перевірка підпису будь-якою стороною
GET
/api/v1/sign/levels/availableЩо система реально може видати зараз
GET
/api/v1/sign/document-kindsЯкий документ яким підписом можна підписати
GET
/api/v1/sign/document-kinds/{kind}Чи годиться підпис такого рівня для документа
POST
/api/v1/sign/diiaЄдиний шлях до КЕП. 501 до партнерства

Сховище · 11

GET
/api/v1/vault/itemsСписок записів — конвертами, як є
POST
/api/v1/vault/itemsЗберегти. Приходить уже зашифрованим
GET
/api/v1/vault/items/{id}Один запис
PATCH
/api/v1/vault/items/{id}Замінити вміст. Старий блоб не відновлюється
DELETE
/api/v1/vault/items/{id}Видалити назавжди
GET
/api/v1/vault/summaryЗдоров'я: слабкі, повторені, скомпрометовані
POST
/api/v1/vault/generate-passwordГенерація на сервері. Ніде не зберігається
POST
/api/v1/vault/health-checkK-анонімність: 5 символів хеша → суфікси
POST
/api/v1/vault/health-reportКлієнт повідомляє результат власної перевірки
GET
/api/v1/vault/recipient-key/{id}Публічний ключ отримувача для перешифрування
POST
/api/v1/vault/shareКопія запису в отримувача

Партнери · 10

GET
/api/v1/partners/plansПублічний довідник тарифів
POST
/api/v1/partners/registerЗаявка інтегратора. Створює pending
GET
/api/v1/partners/{id}Кабінет: план, адреси, scope
GET
/api/v1/partners/{id}/usageВходи за 30 днів і стан квоти
PUT
/api/v1/partners/{id}/redirect-urisЗмінити список адрес повернення
POST
/api/v1/partners/{id}/keysНовий секрет. Старий помирає негайно
GET
/api/v1/partners/admin/pendingЧерга заявок
POST
/api/v1/partners/admin/{id}/decideСхвалити або відхилити
POST
/api/v1/partners/admin/{id}/suspendПризупинення діє негайно
POST
/api/v1/partners/admin/{id}/planЗмінити тариф

Верифікація · 6

POST
/api/v1/verify/documentДокумент і selfie на перевірку
GET
/api/v1/verify/statusСтан заявки на підтвердження особи
GET
/api/v1/verify/proofsДоступні докази атрибутів
POST
/api/v1/verify/presentQR із доказом атрибута, таймер 5 хвилин
GET
/api/v1/verify/admin/queueЧерга модератора верифікації
POST
/api/v1/verify/admin/{id}/decideРішення людини: підтвердити або відхилити

OAuth 2.0 / OIDC · 10

GET
/.well-known/openid-configurationDiscovery: адреси і те, чого ми не вміємо
GET
/oauth/authorizeПочаток входу партнера: згода, рівень, PKCE
POST
/oauth/authorize/decisionРішення людини на екрані згоди
POST
/oauth/tokenОбмін коду на токени
GET
/oauth/userinfoClaims у межах scope, без персональних даних
GET
/oauth/jwksПублічні ключі для перевірки id_token
POST
/oauth/introspectПеревірка токена для ресурс-серверів
GET
/oauth/logoutЄдиний вихід
GET
/api/v1/consentsКому дано доступ від мого імені
DELETE
/api/v1/consents/{id}Забрати доступ. Діє тієї ж миті

SDK і службові · 6

GET
/sdk/v1/{filename}Роздача SDK. Білий список
GET
/sdk/v1/callbackМіст popup → сторінка партнера
GET
/sdk/v1/openapi.jsonСхема для генерації backend-SDK
GET
/healthЖивий процес. Нічого зовнішнього не чіпає
GET
/health/deepПлюс база і DCP
GET
/statusЩо система вміє насправді