Робота з API порталу EDIN ID

Колекцію Postman можна скачати в сторінці "Перелік методів АРІ"

Перелік методів API по роботі з порталом EDIN ID

Всі запити нижче перерахованих API методів порталу EDIN ID направляються на адресу: https://id.edin.ua

Для підписання хеш(ів) та/або файлу пароль передається в зашифрованому вигляді.

Авторизація 

Кожен запит має містити HTTP header:

Header Обовʼязковий Опис
x-system-id так Токен/ідентифікатор зовнішньої системи. Саме цей header використовується для авторизації.

Приклад:

curl -X GET 'https://host/api/external/company?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
Отримання публічного ключа для шифрування паролів 

Усі секретні значення, які передаються в API, мають бути зашифровані на актуальний публічний RSA-ключ сервера.

Це стосується таких полів:

Поле Що передавати
Метод 9.1info.caPassPhrase base64(RSA-encrypt(publicKey, caPassPhraseBytes))
Метод 9.1info.pkPassword base64(RSA-encrypt(publicKey, pkPasswordBytes))
Метод 11adminKeyPassword base64(RSA-encrypt(publicKey, adminKeyPasswordBytes))
Підписати хеш ключем співробітника компанії: requestbody.password base64(RSA-encrypt(publicKey, password))
Підписати файл ключем співробітника компанії: params.password base64(RSA-encrypt(publicKey, caPassPhraseBytes))

API очікує саме base64 від зашифрованих bytes, а не plaintext пароль.

Інтеграція підписання в облікову систему
1 Отримати і зберегти публічний ключ GET /api/external/key
2 Підписати хеш ключем співробітника компанії POST /api/external/company/sign
3 Підписати файл ключем співробітника компанії POST /api/external/company/sign/file
4 Верифікувати підпис на файлі POST /api/external/company/sign/file/verify
5 Отримати інформацію про сертифікат GET /api/external/company/key/certificate

Колекція Postman

Інтеграція управління ключами в облікову систему
1 Отримати інформацію про компанію GET /api/external/company
2 Отримати інформацію про співробітника GET /api/external/company/employee
3 Пошук ключів співробітника POST /api/external/company/employee/pkeys/search
4 Пошук співробітників компанії POST /api/external/company/employees/search
5 Пошук ключів компанії POST /api/external/company/pkeys/search
6 Отримати інформацію про ключ GET /api/external/company/pkey
7.1 Отримати документ компанії GET /api/external/company/form
7.2 Отримати ідентифікацію співробітника GET /api/external/company/employee/identification
7.3 Отримати документ ключа GET /api/external/company/pkey/form
8 Додати співробітника POST /api/external/company/employee
9.1 Створити чернетку ключа POST /api/external/company/employee/pkey/generate/draft
9.2 Згенерувати PDF-форму для адміністратора компанії PATCH /api/external/company/employee/pkey/generate/draft
9.3

Передати підписи PDF і активувати ключ

POST /api/external/company/employee/pkey/activation
10

Змінити статус ключа

POST /api/external/company/pkey/status
11

Змінити статус співробітника 

POST /api/external/company/employee/status
12

Створити компанію

POST /api/external/company/create

Створення ключа складається з трьох запитів:

  1. Створити чернетку ключа та отримати PDF для підпису співробітником.
  2. Згенерувати PDF для підпису адміністратором компанії.
  3. Передати detached-підписи всіх PDF і активувати ключ або передати його на активацію КНЕДП.

Рекомендований сценарій створення та активації ключа:

  1. Перевірити компанію методом 1.
  2. Якщо співробітника ще немає – створити його методом 8.
  3. Перевірити співробітника методом 2.
  4. Викликати метод 9.1 і отримати pKey.uuid та employee PDF-форми.
  5. Співробітник підписує PDF-форми з відповіді 9.1 detached-підписом.
  6. Викликати метод 9.2 з pKeyUuid та adminIpn і отримати admin PDF-форми.
  7. Адміністратор/суперадміністратор підписує PDF-форми з відповіді 9.2 detached-підписом.
  8. Викликати метод 9.3, передавши keyUuidactivate і map підписів за всіма отриманими formType.
  9. Отримати оновлений ESSPrivateKey зі статусом ACTIVATED або COMPANY_ADMIN_APPROVED.

Шифрування пароля за допомогою відкритого ключа RSA

Приклад для Postman (js)

Функції для шифрування

/**
 * Encrypt data with RSA public key
 * @param publicKey - get from server
 * @param password - user key password
 */
utils = {
    rsaEncrypt: async function(publicKey, password) {
        const cryptoKey = await crypto.subtle.importKey("spki", publicKey, {
            name: "RSA-OAEP",
            hash: "SHA-256"
        }, true, ["encrypt"]);
        const encodedText = new TextEncoder().encode(password);
        const encrypted = await crypto.subtle.encrypt({name: "RSA-OAEP"}, cryptoKey, encodedText);
        //
        return toBase64(encrypted);
    }
}

function toBase64(buffer) {
    const bytes = new Uint8Array(buffer);
    let binary = '';
    for (let i = 0; i < bytes.byteLength; i++) {
        binary += String.fromCharCode(bytes[i]);
    }
    return btoa(binary);
}

Шифрування пароля

const encrypted = await utils.rsaEncrypt(Uint8Array.from(publicKey), password));

де, 

Приклад Java

import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.MGF1ParameterSpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;

String pem = """
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJB...
-----END PUBLIC KEY-----
""";

String body = pem
        .replace("-----BEGIN PUBLIC KEY-----", "")
        .replace("-----END PUBLIC KEY-----", "")
        .replaceAll("\\s", "");

byte[] der = Base64.getDecoder().decode(body);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(der));

OAEPParameterSpec oaepParams = new OAEPParameterSpec(
        "SHA-256",
        "MGF1",
        MGF1ParameterSpec.SHA256,
        PSource.PSpecified.DEFAULT
);

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams);

byte[] encrypted = cipher.doFinal("my-secret-password".getBytes(StandardCharsets.UTF_8));
String encryptedBase64 = Base64.getEncoder().encodeToString(encrypted);

Приклад Node.js

import crypto from "node:crypto";

const publicKeyPem = `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJB...
-----END PUBLIC KEY-----`;

const encrypted = crypto.publicEncrypt(
  {
    key: publicKeyPem,
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
    oaepHash: "sha256"
  },
  Buffer.from("my-secret-password", "utf8")
);

const encryptedBase64 = encrypted.toString("base64");

Як шифрувати?

  1. Отримати публічний ключ через /api/external/key?type=pem.
  2. Імпортувати public key у crypto-бібліотеку як RSA public key.
  3. Зашифрувати plaintext пароль bytes.
  4. Результат RSA encryption закодувати в base64.
  5. Передати base64 string у відповідне поле запиту.
plaintext password
  -> UTF-8 bytes
  -> RSA encrypt with server public key
  -> base64
  -> JSON field

алгоритм шифрування має відповідати вимогам API: RSA/ECB/OAEPPadding з OAEP SHA-256 і MGF1 SHA-256;
- не використовуйте RSA_PKCS1_PADDING / RSA/ECB/PKCS1Padding — сервер не зможе розшифрувати такі дані;
- RSA OAEP має обмеження на довжину plaintext, яке залежить від розміру ключа; передавайте короткі секрети/паролі, а не великі JSON/файли;
- публічний ключ має TTL, тому його треба оновлювати після expiredAt / x-key-ttl;
- не кешуйте ключ назавжди;
- якщо сервер повертає decrypt_error для caPassPhrase або pkPassword, найчастіші причини:
  - використаний застарілий public key;
  - зашифровано не тим padding/OAEP hash;
  - у JSON переданий не base64 від encrypted bytes;
  - plaintext був зашифрований іншим ключем.

 

Помилки при роботі з API

Помилки повертаються у JSON без envelope:

{
  "type": "employee_not_found"
}
Загальні помилки

Код відповіді

Опис

403

Помилка авторизації зовнішньої системи або підключення зовнішньої системи відбувається з недоступних IP-адрес або компанія не привʼязана до зовнішньої системи..

400

Бізнес/валідаційні помилки: не знайдено співробітника, ключ, документ, неправильний статус тощо.

413

Перевищено допустимий розмір файлу, якщо для конкретного upload-методу увімкнений ліміт.

Типові помилки доступу:

{"type":"access_denied"}
{"type":"company_access_denied"}
{"type":"company_wrong_status","status":"DRAFT"}
Помилки підписання хешів

Код відповіді

Опис

406

Ключ не знайдено або неправильний пароль

413

Більше 100 хешів для підписання

422

Помилка в процесі підписання

426

Неможливо дешифрувати пароль до ключа. Спробувати оновити публічний ключ для шифрування та повторити операцію

Помилки підписання файлів

Код відповіді

Опис

406

Ключ не знайдено або неправильний пароль

412

Атрибути ("key" або "password") або файл неправильно заповнені або відсутні у запиті

413

Розмір файла для підпису більше 1Мб

422

Помилка в процесі підписання

426

Неможливо дешифрувати пароль до ключа. Спробувати оновити публічний ключ для шифрування та повторити операцію


Методи API

Методи API

Отримати і зберегти публічний ключ GET /api/external/key

REQUEST

URL

 

Метод запиту

GET

URL запиту

/api/external/key

Authorization


Auth type

API key

Key / Value

x-system-id / токен, отриманий при підключенні

Params


type

тип відповіді JSON|PEM|XML (якщо параметр не передавати за замовченням буде JSON)

RESPONSE

В тілі відповіді повертається ключ у вказаному форматі:

Для type in (PEM, XML) в reponse-header передається параметр x-key-ttl, в якому передається термін життя відкритого ключа.

Методи API

Підписати ключем співробітника компанії POST /api/external/company/sign

REQUEST

URL

 

Метод запиту

POST

URL запиту

/api/external/company/sign

Headers

 

Authorization

x-system-id - токен, отриманий при підключенні

Content-Type

aplication/json

Request body

{
    "key": "{{id ключа}}",
    "password": "{{зашифрований пароль від ключа}}",
    "algorithm": "DSTU4145_GOST34311", "DSTU4145_DSTU7564", "ECDSA",
    "isRaw": "true/false. В разі встановлення true повертає "сирий підпис", при цьому signtype ігноруються.
    "hashes": [
        {"hash": "{{хеш документа, що підписується}}", "description": "опис документа, що підписується"}
    ]
    "SignType": "{{CADES_BES (за замовчуванням), CADES_T, CADES_C, CADES_X_LONG, CADES_X_LONG_TRUSTED;}}",
}
RESPONSE

В тілі відповіді повертається масив підписів.

Приклад:

{
    "fFNkFPush1kn988zLJoXBoSYilWMI408xxQ7Xs69Ww=": "MIILPgYJKoZIhvcNAQcC..."
}

 

Методи API

Підписати файл ключем співробітника компанії POST /api/external/company/sign/file

REQUEST

URL

 

Метод запиту

POST

URL запиту

/api/external/company/sign/file

Authorization


Auth type

API key

Key / Value

x-system-id / токен, отриманий при підключенні

Headers

 

Content-Type

multipart/form-data

Request body

Параметри тіла запиту:

  • password – зашифрований пароль до ключа
  • file.pdf – дані (контент) для підпису у вигляді файлу або base64 (залежно від inputFormat)

Params

  • key – ідентифікатор ключа.
  • type – тип підписання, може приймати значення:
    • append – додає підпис до переданого файлу. ВАЖЛИВО! Якщо файл вже був підписаний, то підпис додається до існуючого, а не підписується разом з існуючим підписом.
    • sign - підписує контент, використовується за замовчуванням.
  • result – формат підписання (дані й підпис в одному файлі, дані й підпис в окремих файлах), може приймати значення:
    • enveloped – у відповідь надійде файл з підписом
    • detached – у відповідь надійде тільки підпис
  • inputFormat – формат вхідних даних для підписання, може приймати значення:
    • file – файл в бінарному вигляді
    • base64 – файл у вигляді base64 рядка
  • outputFormat – формат вихідних (результуючих) даних після підписання, може приймати значення:
    • file – файл в бінарному вигляді
    • base64 – файл у вигляді base64 рядка
  • signType – тип підпису, приймає значення CADES_BES, CADES_T, CADES_C, CADES_X_LONG, CADES_X_LONG_TRUSTED. Якщо не передано, то за замовченням підставляється CADES_BES
  • algorithm (enum) - алгоритм формату підписання:
    • DSTU4145_GOST34311,
    • DSTU4145_DSTU7564,
    • ECDSA
RESPONSE

В тілі відповіді повертаються код 200 та результат підписання відповідно до параметрів result та outputFormat.

Методи API

Отримати інформацію про компанію GET /api/external/company

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company

URL параметри

companyCode (обов’язково) - код Компанії;

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

В тілі відповіді передаються статус 200 та об'єкт ESSCompany.

CURL 

curl -X GET 'https://host/api/external/company?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'

Помилки 

HTTP type Опис
403 access_denied Невалідний x-system-id або IP не дозволений.
403 company_access_denied Компанія не знайдена або не привʼязана до зовнішньої системи.

Методи API

Отримати інформацію про співробітника GET /api/external/company/employee

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/employee

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

В тілі відповіді передаються статус 200 та об'єкт ESSUser.

CURL
curl -X GET 'https://host/api/external/company/employee?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
Помилки 
HTTP type Опис
400 employee_not_found Співробітник з таким employeeIpn не знайдений у цій компанії.
403 company_access_denied Немає доступу до company.
Методи API

Пошук ключів співробітника POST /api/external/company/employee/pkeys/search

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/employee/pkeys/search

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

В тілі запиту методу передається об’єкт ESSPrivateKeysQuery

 

 JSON приклад запиту:

 

{
  "statuses": ["ACTIVATED"],
  "stamp": false,
  "limit": {
    "offset": 0,
    "count": 20
  }
}
RESPONSE

В тілі відповіді передаються статус 200 та масив об'єктів ESSPrivateKey.

JSON  приклад відповіді:

[
  {
    "id": 1001,
    "name": "Ключ співробітника",
    "uuid": "019ec000-0000-7000-8000-000000000001",
    "status": "ACTIVATED",
    "storeType": "HSM",
    "keyType": "UA",
    "stamp": false,
    "validFrom": 1717200000,
    "validTo": 1780272000,
    "requests": [],
    "certificates": []
  }
]
CURL 
curl -X POST 'https://host/api/external/company/employee/pkeys/search?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "statuses": ["ACTIVATED"],
    "stamp": false,
    "limit": {"offset": 0, "count": 20}
  }'
Помилки 
HTTP type Опис
400 employee_not_found Співробітник не знайдений.
403 company_access_denied Немає доступу до company.
Методи API

Пошук співробітників компанії POST /api/external/company/employees/search

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/employees/search

URL параметри

companyCode (обов’язково) - код Компанії;

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

В тілі запиту методу передається об’єкт ESSUsersQuery

 

 JSON приклад запиту:

 

{
  "search": "3148615913",
  "role": ["USER", "ADMIN"],
  "identification": ["YES"],
  "employeeStatus": ["ACTIVE"],
  "limit": {
    "offset": 0,
    "count": 20
  }
}
RESPONSE

В тілі відповіді передаються статус 200 та масив об'єктів ESSUser.

JSON  приклад відповіді:

[
  {
    "id": 456,
    "login": "380501112233",
    "email": "employee@example.com",
    "fullName": "Іваненко Іван Іванович",
    "ipn": "3148615913",
    "identified": "YES",
    "role": "USER",
    "employeeStatus": "ACTIVE",
    "employeeEmail": "employee@example.com"
  }
]

 

CURL 
curl -X POST 'https://host/api/external/company/employees/search?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "search": "3148615913",
    "employeeStatus": ["ACTIVE"],
    "limit": {"offset": 0, "count": 20}
  }'
Помилки 
HTTP type Опис
403 company_access_denied Немає доступу до company.
Методи API

Пошук ключів компанії POST /api/external/company/pkeys/search

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/pkeys/search

URL параметри

companyCode (обов’язково) - код Компанії;

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

В тілі запиту методу передається об’єкт ESSPrivateKeysQuery

 

 JSON приклад запиту:

 

{
  "nameQuery": "Печатка",
  "stamp": true,
  "statuses": ["ACTIVATED"],
  "limit": {
    "offset": 0,
    "count": 20
  }
}

 

RESPONSE

В тілі відповіді передаються статус 200 та масив об'єктів ESSPrivateKey.

CURL 
curl -X POST 'https://host/api/external/company/pkeys/search?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "stamp": true,
    "statuses": ["ACTIVATED"],
    "limit": {"offset": 0, "count": 20}
  }'
Помилки 
HTTP type Опис
403 company_access_denied Немає доступу до company.
Методи API

Отримати інформацію про ключ GET /api/external/company/pkey

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/pkey

URL параметри

companyCode (обов’язково) - код Компанії;

key (обов’язково) - код ключа.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

В тілі відповіді передаються статус 200 та об'єкт ESSPrivateKey.

CURL
curl -X GET 'https://host/api/external/company/pkey?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
 
Помилки 
HTTP type Опис
400 pkey_not_found Ключ не знайдений або не належить цій company.
403 company_access_denied Немає доступу до company.
Методи API

Отримання документа компанії GET /api/external/company/form

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/form

URL параметри

companyCode (обов’язково) - код Компанії;

formType (обов’язково) - Enum name з ESSRegFormType, наприклад,  OFFER_AGREEMENT_MANAGER.

format (опційно) - binary або base64. Default: binary.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

В тілі відповіді передається:

PDF bytes з content type:

Content-Type: application/pdf
{
  "formType": "OFFER_AGREEMENT_MANAGER",
  "fileName": "Договір-оферта (керівник/УО).pdf",
  "contentType": "application/pdf",
  "contentBase64": "JVBERi0x..."
}
Поле Тип Опис
formType string Enum name документа.
fileName string Імʼя файлу.
contentType string Завжди application/pdf.
contentBase64 string PDF у base64.
CURL binary
curl -X GET 'https://host/api/external/company/form?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -o company-form.pdf
CURL base 64
curl -X GET 'https://host/api/external/company/form?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
Помилки
HTTP type Опис
400 unknown_form_type Невідомий formType.
400 form_not_found Документ не знайдений.
400 unknown_format format не binary і не base64.
403 company_access_denied Немає доступу до company.
Методи API

Отримати ідентифікацію співробітника GET /api/external/company/employee/identification

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/employee/identification

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

У тілі відповіді передаються статус 200 та об'єкт з даними співробітника.

Опис параметрів відповіді:

Поле Тип Опис
info object Об'єкт ESSUserIdentification.
data string Base64 підпису ідентифікації. Повертається лише якщо info.complete == YES.

Якщо ідентифікація не завершена, поле data не повертається.

JSON  приклад відповіді:

{
  "info": {
    "type": "SIGN",
    "complete": "YES",
    "fullName": "Іваненко Іван Іванович",
    "fullNameEN": "IVANENKO IVAN",
    "ipn": "3148615913",
    "unzr": "19900101-12345",
    "state": "Київська",
    "city": "Київ",
    "address": "вул. Тестова, 1",
    "publicKey": "01 02 03 ...",
    "validTo": 1780272000,
    "sign": null
  },
  "data": "base64 identification sign container"
}
CURL
curl -X GET 'https://host/api/external/company/employee/identification?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
Помилки 
HTTP type Опис
400 employee_not_found Співробітник не знайдений.
400 employee_identification_not_found Ідентифікація співробітника не знайдена.
400 employee_identification_sign_not_found Ідентифікація завершена, але файл підпису не знайдено.
403 company_access_denied Немає доступу до company.
Методи API

Отримати документ ключа GET /api/external/company/pkey/form

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/pkey/form

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

key (обов’язково) - UUID ключа.

formType (обов’язково) - Enum name з ESSRegFormType, наприклад, PK_FORM.

format (опційно) - binary або base64. Default: binary.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

Такий самий, як у методі Отримання документа компанії:

CURL 
curl -X GET 'https://host/api/external/company/pkey/form?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -o pkey-form.pdf
Помилки 
HTTP type Опис
400 unknown_form_type Невідомий formType.
400 form_not_found Документ ключа не знайдений.
400 unknown_format format не binary і не base64.
403 company_access_denied Немає доступу до company.
Методи API

Додати співробітника POST /api/external/company/employee

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/form

URL параметри

companyCode (обов’язково) - код Компанії.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

multipart/form-data

REQUEST

 

REQUEST Body

info (обов’язково) JSON attr - дані для додавання співробітника;

identification (обов’язково) file - підписаний контейнер ідентифікації співробітника.

 

Всі персональні дані ідентифікації беруться з підпису/сертифіката у file identification, а не з JSON info

info:

{
  "phone": "380501112233",
  "email": "employee@example.com",
  "role": "USER",
  "identificationType": "SIGN"
}

Опис полів:

Поле Тип Обовʼязкове Опис
phone string так Телефон у форматі 380XXXXXXXXX.
email string так Email співробітника.
role enum так USERADMIN.
identificationType enum так SIGNDIIA_INTERNAL_PASSPORT або DIIA_FOREIGN_PASSPORT.
RESPONSE

У тілі відповіді передається об'єкт ESSUser з даними доданого або вже існуючого співробітника.

CURL
curl -X POST 'https://host/api/external/company/employee?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -F 'info={
    "phone":"380501112233",
    "email":"employee@example.com",
    "role":"USER",
    "identificationType":"SIGN"
  }' \
  -F 'identification=@employee-identification.p7s;type=application/octet-stream'
Помилки 
HTTP type Опис
400 invalid_info Невалідний або неповний info.
400 invalid_phone phone не відповідає формату 380XXXXXXXXX.
400 identification_file_not_found Не переданий file identification.
400 invalid_signature Неможливо перевірити підпис ідентифікації.
400 unsupported_role Непідтримувана роль.
400 unsupported_identification_type Непідтримуваний тип ідентифікації.
400 wrong_ipn ІПН існуючого користувача не збігається з ІПН у підписі.
403 company_access_denied Немає доступу до company.
403 company_wrong_status Компанія не ACTIVE.
Методи API

Створити чернетку ключа для співробітника POST /api/external/company/employee/pkey/generate/draft

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/employee/pkey/generate/draft

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника;

store (обов’язково) - може приймати одне зі значень:

  •  cloud - сервер генерує ключ і p10-запити у форматі PKCS #10.  Потрібен info.pkPassword.
  •  file - зовнішня система генерує ключ, а сервер приймає p10-запити у форматі PKCS #10 в part requests

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

multipart/form-data

REQUEST

 

REQUEST Body

info (обов’язково) JSON attr - параметри CA user і ключа;

requests (обов’язково, тільки для store=file) JSON attr - p10-запити у форматі PKCS #10, створені зовнішньою системою.

 

Всі персональні дані ідентифікації беруться з підпису/сертифіката у file identification, а не з JSON info

info:

{
  "pkName": "Ключ Іваненко",
  "pkType": "UA",
  "pkStoreType": "HSM",
  "pkPassword": "base64 RSA-encrypted password",
  "pkIsStamp": false,
  "emplTitle": "Менеджер",
  "emplOrgUnit": "Відділ продажів",
  "caPassPhrase": "base64 RSA-encrypted pass phrase",
  "certType": "SIGN_AND_ENCRYPT",
  "certValidity": "TWO"
}

Опис полів info:

Поле Тип Обовʼязкове Опис
pkName string так Назва ключа.
pkType enum так UA або ECDSA.
pkStoreType enum так HSM або FILE.
pkPassword string для store=cloud Base64 від RSA-encrypted bytes пароля ключа. Шифрувати актуальним public key з /api/external/key.
pkIsStamp boolean так true — печатка, false — особистий ключ співробітника.
emplTitle string/null ні Посада для CA user.
emplOrgUnit string/null ні Підрозділ для CA user.
caPassPhrase string так Base64 від RSA-encrypted bytes секретної фрази CA user. Шифрувати актуальним public key з /api/external/key.
certType enum так SIGN_ONLY або SIGN_AND_ENCRYPT.
certValidity enum так ONE або TWO.

requests для store=file:

{
  "ecdsa": "base64 PKCS #10 request",
  "signature": "base64 PKCS #10 request",
  "encryption": "base64 PKCS #10 request"
}

Опис полів requests :

Поле Тип Коли потрібне Опис
ecdsa string pkType=ECDSA Base64 PKCS #10 request для ECDSA сертифіката.
signature string pkType=UA Base64 PKCS #10 request для сертифіката підпису.
encryption string pkType=UA і certType=SIGN_AND_ENCRYPT Base64 PKCS #10 request для сертифіката шифрування.
RESPONSE

В тілі відповіді передається статус 200.

JSON  приклад відповіді:

{
  "pKey": {
    "id": 1001,
    "name": "Ключ Іваненко",
    "uuid": "019ec000-0000-7000-8000-000000000001",
    "status": "COMPANY_GENERATED",
    "storeType": "HSM",
    "keyType": "UA",
    "stamp": false
  },
  "forms": [
    {
      "type": "PK_FORM",
      "pdf": "JVBERi0x...",
      "hash": "HASH_OF_PDF"
    }
  ]
}

Для співробітника з роллю ADMIN у відповіді додатково буде PK_APPENDIX.

Опис полів відповіді:

Поле Тип Опис
pKey object Обʼєкт ESSPrivateKey, поля описані в розділі 2.3. Використовуйте pKey.uuid у методах 9.2 і 9.3.
forms object[] PDF-документи, які потрібно підписати співробітником.
forms[].type enum Тип форми.
forms[].pdf string PDF content у base64.
forms[].hash string/null Hash PDF для контролю цілісності.
CURL
curl -X POST 'https://host/api/external/company/employee/pkey/generate/draft?...'   -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'   -F 'info={
    "pkName":"Ключ Іваненко",
    "pkType":"UA",
    "pkStoreType":"HSM",
    "pkPassword":"BASE64_RSA_ENCRYPTED_PASSWORD",
    "pkIsStamp":false,
    "emplTitle":"Менеджер",
    "emplOrgUnit":"Відділ продажів",
    "caPassPhrase":"BASE64_RSA_ENCRYPTED_CA_PASSPHRASE",
    "certType":"SIGN_AND_ENCRYPT",
    "certValidity":"TWO"
  }'
curl -X POST 'https://host/api/external/company/employee/pkey/generate/draft?...'   -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'   -F 'info={
    "pkName":"Ключ Іваненко",
    "pkType":"UA",
    "pkStoreType":"FILE",
    "pkIsStamp":false,
    "emplTitle":"Менеджер",
    "emplOrgUnit":"Відділ продажів",
    "caPassPhrase":"BASE64_RSA_ENCRYPTED_CA_PASSPHRASE",
    "certType":"SIGN_AND_ENCRYPT",
    "certValidity":"TWO"
  }'   -F 'requests={
    "signature":"BASE64_P10_SIGNATURE",
    "encryption":"BASE64_P10_ENCRYPTION"
  }'
Помилки 
HTTP type Опис
400 invalid_store store не cloud і не file.
400 employee_not_found Співробітник не знайдений.
400 employee_not_active Співробітник не активний або не ідентифікований.
400 company_not_found Не знайдено company для співробітника.
400 decrypt_error Неможливо розшифрувати caPassPhrase або pkPassword.
400 employee_identification_not_found Не знайдено підпис ідентифікації співробітника.
400 request_not_found Для store=file не переданий потрібний p10-запит.
400 pk_requests_not_found Після створення ключа не знайдені p10-запити.
403 company_access_denied Немає доступу до company.
403 company_wrong_status Компанія не ACTIVE.
Методи API

Згенерувати PDF-форму для адміністратора компанії PATCH /api/external/company/employee/pkey/generate/draft

Цей метод можна викликати повторно. У такому випадку admin-форми будуть перестворені, а попередні варіанти цих форм — перезаписані.

REQUEST

URL


Метод запиту

PATCH

URL запиту

/api/external/company/employee/pkey/generate/draft

URL параметри

companyCode (обов’язково) - код Компанії;

pKeyUuid (обов’язково) - UUID ключа з відповіді на виклик метода створення чернетки ключа;

adminIpn (обов’язково) - ІПН/РНОКПП адміністратора або суперадміністратора компанії, який підписуватиме admin-форми.

 

Якщо ключ створюється для співробітника з роллю ADMIN, у adminIpn потрібно передати саме SUPER_ADMIN компанії.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

В тілі відповіді передається статус 200.

JSON  приклад відповіді:

{
  "pKey": {
    "uuid": "019ec000-0000-7000-8000-000000000001",
    "status": "COMPANY_GENERATED"
  },
  "forms": [
    {
      "type": "AFFILIATION_CONFIRMATION",
      "pdf": "JVBERi0x...",
      "hash": "HASH_OF_PDF"
    }
  ]
}

Опис полів відповіді:

Поле Тип Опис
pKey object Обʼєкт ESSPrivateKey, поля описані в розділі 2.3.
forms object[] PDF-документи, які потрібно підписати адміністратору/суперадміністратору.
forms[].type enum Тип форми: AFFILIATION_CONFIRMATION або POWER_OF_ATTORNEY.
forms[].pdf string PDF content у base64.
forms[].hash string/null Hash PDF для контролю цілісності.

Для ключа співробітника з роллю ADMIN у відповіді додатково буде POWER_OF_ATTORNEY.

CURL 
curl -X PATCH 'https://host/api/external/company/employee/pkey/generate/draft?...'   -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'
Помилки 
HTTP type Опис
400 invalid_pkey_uuid pKeyUuid має неправильний UUID-формат.
400 pkey_not_found Ключ не знайдений або не належить company.
400 pkey_wrong_status Ключ не у статусі COMPANY_GENERATED.
400 employee_not_found Співробітник-власник ключа не знайдений.
400 employee_not_active Співробітник-власник ключа не активний або не ідентифікований.
400 admin_not_found Адміністратор не знайдений.
400 admin_not_active Адміністратор не активний або не ідентифікований.
400 admin_wrong_role Переданий користувач не має ролі адміністратора/суперадміністратора.
400 admin_must_be_super_admin Для цього ключа потрібен підпис суперадміністратора.
403 company_access_denied Немає доступу до company.
403 company_wrong_status Компанія не ACTIVE.
Методи API

Передати підписи PDF і активувати ключ POST /api/external/company/employee/pkey/activation

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/employee/pkey/activation

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

Приклад запиту:

 

{
  "keyUuid": "019ec000-0000-7000-8000-000000000001",
  "activate": true,
  "forms": {
    "PK_FORM": [
      "BASE64_DETACHED_SIGNATURE_BY_EMPLOYEE",
      "BASE64_DETACHED_SIGNATURE_BY_ADMIN"
    ],
    "PK_APPENDIX": [
      "BASE64_DETACHED_SIGNATURE_BY_EMPLOYEE",
      "BASE64_DETACHED_SIGNATURE_BY_SUPER_ADMIN"
    ],
    "AFFILIATION_CONFIRMATION": [
      "BASE64_DETACHED_SIGNATURE_BY_ADMIN"
    ],
    "POWER_OF_ATTORNEY": [
      "BASE64_DETACHED_SIGNATURE_BY_SUPER_ADMIN"
    ]
  }
}

Опис полів запиту:

Поле Тип Обовʼязкове Опис
keyUuid string UUID так UUID ключа з відповіді 9.1: pKey.uuid.
activate boolean так true — одразу активувати ключ; false — передати ключ на активацію КНЕДП.
forms object/map так Map підписів для PDF-документів, отриманих у 9.1 та 9.2.
forms.{formType} string[] так для кожної PDF-форми Масив detached-підписів PDF у base64. Ключ map — enum name ESSRegFormType.

Важливо:
- треба передати підписи для кожної PDF-форми, отриманої у 9.1 та 9.2;
- підпис має бути detached: у forms.{formType} передається тільки підпис у base64, без PDF-контенту;
- підпис має бути сформований по точних bytes PDF з поля pdf відповідної форми;
- для одного formType треба передати масив підписів, навіть якщо підпис один.

Правила підписання:

formType Хто підписує
PK_FORM співробітник + admin/super_admin
PK_APPENDIX співробітник + super_admin
AFFILIATION_CONFIRMATION admin/super_admin
POWER_OF_ATTORNEY super_admin
RESPONSE

В тілі відповіді передаються статус 200 та оновлений повний обʼєкт ESSPrivateKey .

Якщо activate=true, очікуваний статус:

{
  "uuid": "019ec000-0000-7000-8000-000000000001",
  "status": "ACTIVATED"
}

Якщо activate=false, очікуваний статус:

{
  "uuid": "019ec000-0000-7000-8000-000000000001",
  "status": "COMPANY_ADMIN_APPROVED"
}
CURL 
curl -X POST 'https://host/api/external/company/employee/pkey/activation?...'   -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898'   -H 'Content-Type: application/json'   -d '{
    "keyUuid": "019ec000-0000-7000-8000-000000000001",
    "activate": true,
    "forms": {
      "PK_FORM": [
        "BASE64_DETACHED_SIGNATURE_BY_EMPLOYEE",
        "BASE64_DETACHED_SIGNATURE_BY_ADMIN"
      ],
      "AFFILIATION_CONFIRMATION": [
        "BASE64_DETACHED_SIGNATURE_BY_ADMIN"
      ]
    }
  }'
Помилки 
HTTP type Додаткові поля Опис
400 key_uuid_not_found Не переданий keyUuid.
400 employee_not_found Співробітник не знайдений.
400 employee_not_active Співробітник не активний або не ідентифікований.
400 pkey_not_found Ключ не знайдений або не належить company/employee.
400 pkey_wrong_status status Ключ не у статусі COMPANY_GENERATED.
400 forms_not_found Не передані підписи або для ключа немає PDF-форм.
400 unexpected_form formType Переданий підпис для форми, яка не була згенерована для ключа.
400 admin_not_found Адміністратор не знайдений.
400 admin_not_active Адміністратор не активний або не ідентифікований.
400 admin_wrong_role Адміністратор не має ролі admin/super_admin.
400 admin_must_be_super_admin Для однієї з форм потрібен super_admin.
400 form_sign_not_found formType Не переданий підпис для однієї зі збережених форм.
400 unsupported_form formType Непідтримуваний тип форми для цього запиту.
400 wrong_sign_count formType Кількість підписів для форми не відповідає очікуваній.
400 duplicate_signature formType Для форми передано однаковий підпис більше одного разу.
400 invalid_signature formType Підпис не проходить перевірку для PDF.
400 wrong_signer formType Підписант не відповідає очікуваному підписанту форми.
403 company_access_denied Немає доступу до company.
403 company_wrong_status status Компанія не ACTIVE.

 

Методи API

Змінити статус ключа POST /api/external/company/pkey/status

Метод змінює статус ключа компанії/співробітника та одразу формує, підписує і зберігає PDF-підтвердження зміни статусу.

Клієнт не підписує PDF самостійно, а передає UUID ключа адміністратора/суперадміністратора та зашифрований пароль до нього. Після чого API:

  1. формує PDF-форми зміни статусу;
  2. підписує їх ключем адміністратора/суперадміністратора;
  3. зберігає підписані PDF як підтвердження зміни статусу;
  4. змінює статус ключа у системі;
  5. передає зміну статусу до центру сертифікації;
  6. повертає масив підписаних PDF.
REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/pkey/status

URL параметри

companyCode (обов’язково) - код Компанії;

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

 JSON приклад запиту:

 

{
  "keyUuid": "019ec000-0000-7000-8000-000000000001",
  "action": "hold",
  "adminKeyUuid": "019ec000-0000-7000-8000-000000000099",
  "adminKeyPassword": "BASE64_RSA_ENCRYPTED_ADMIN_KEY_PASSWORD",
  "reason": "Компрометація ключа"
}

 

Опис полів запиту:

Поле Тип Обовʼязкове Опис
keyUuid string UUID так UUID ключа, статус якого треба змінити.
action enum так

Дія: 

  • hold - призупинити активний ключ.
  • unhold - відновити ключ зі статусу HOLD.
  • revoke - скасувати/відкликати ключ.
adminKeyUuid string UUID так UUID ключа адміністратора/суперадміністратора цієї компанії.
adminKeyPassword string так Base64 від RSA-encrypted bytes пароля ключа адміністратора/суперадміністратора. Шифрувати public key з /api/external/key; див. розділ 1.4.
reason string так Причина зміни статусу. Мінімум 4 символи після trim. Потрапляє у PDF і в історію статусів.

API перевіряє, чи дозволена дія для поточного статусу ключа. Наприклад, hold дозволений тільки для ACTIVATED, а unhold — для ключа у статусі HOLD.

RESPONSE

В тілі відповіді передаються статус 200 та масив рядків. Кожен рядок — підписаний PDF у base64.

JSON  приклад відповіді:

[
  "BASE64_SIGNED_STATUS_CHANGE_PDF"
]

Якщо для ключа є дочірні файлові ключі, які мають змінювати статус каскадно, у відповіді буде кілька елементів: основний ключ + дочірні ключі.

CURL 
curl -X POST 'https://host/api/external/company/pkey/status?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "keyUuid": "019ec000-0000-7000-8000-000000000001",
    "action": "hold",
    "adminKeyUuid": "019ec000-0000-7000-8000-000000000099",
    "adminKeyPassword": "BASE64_RSA_ENCRYPTED_ADMIN_KEY_PASSWORD",
    "reason": "Компрометація ключа"
  }'
Помилки
HTTP type Додаткові поля Опис
400 decrypt_error field=adminKeyPassword Не вдалося розшифрувати пароль ключа адміністратора/суперадміністратора.
400 pkey_not_found Ключ keyUuid не знайдений або не належить company.
400 employee_not_found Власник ключа не знайдений як співробітник company.
400 admin_pkey_not_found Ключ адміністратора/суперадміністратора не знайдений або не належить company.
400 admin_required Власник adminKeyUuid не має ролі ADMIN/SUPER_ADMIN.
400 invalid_password Пароль ключа адміністратора/суперадміністратора неправильний.
400 invalid_reason reason порожній або коротший за 4 символи після trim.
400 unsupported_action У action передано не holdunhold або revoke.
400 pkey_wrong_status Перехід статусу не дозволений для поточного стану ключа.
403 company_access_denied Немає доступу до company.
403 company_wrong_status status Компанія не ACTIVE.
Методи API

Змінити статус співробітника POST /api/external/company/employee/status

Метод змінює статус співробітника компанії. Якщо дія вимагає каскадної зміни статусів ключів співробітника, API формує PDF-документи зміни статусу ключів, підписує їх ключем адміністратора/суперадміністратора, зберігає підтвердження і змінює статуси ключів.

Клієнт не підписує PDF самостійно. Клієнт передає UUID ключа адміністратора/суперадміністратора та зашифрований пароль до нього.

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/employee/status

URL параметри

companyCode (обов’язково) - код Компанії;

employeeIpn (обов’язково) - ІПН/РНОКПП співробітника.

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

JSON Body

 JSON приклад запиту:

 

{
  "action": "BLOCKED",
  "adminKeyUuid": "019ec000-0000-7000-8000-000000000099",
  "adminKeyPassword": "BASE64_RSA_ENCRYPTED_ADMIN_KEY_PASSWORD",
  "reason": "Тимчасове блокування співробітника"
}

 

Опис полів запиту:

Поле Тип Обовʼязкове Опис
action enum так Новий статус/дія для співробітника: ACTIVEBLOCKEDFIREDREHIRED.
adminKeyUuid string UUID так UUID ключа адміністратора/суперадміністратора цієї компанії.
adminKeyPassword string так Base64 від RSA-encrypted bytes пароля ключа адміністратора/суперадміністратора. Шифрувати public key з /api/external/key.
reason string так Причина зміни статусу. Мінімум 4 символи після trim. Потрапляє у PDF-документи зміни статусу ключів і в історію статусів співробітника.

Дозволені переходи статусів: 

Поточний статус співробітника Дозволені action
ACTIVE BLOCKEDFIRED
REHIRED BLOCKEDFIRED
BLOCKED ACTIVEFIRED
FIRED REHIRED

Якщо передати недозволений перехід, API поверне wrong_action.

RESPONSE

В тілі відповіді передаються статус 200.

JSON  приклад відповіді:

{
  "employee": {
    "id": 456,
    "login": "380501112233",
    "email": "employee@example.com",
    "fullName": "Іваненко Іван Іванович",
    "ipn": "3148615913",
    "role": "USER",
    "employeeStatus": "BLOCKED",
    "employeeEmail": "employee@example.com"
  },
  "pdf": [
    "BASE64_SIGNED_STATUS_CHANGE_PDF"
  ]
}

Опис полів відповіді:

Поле Тип Опис
employee object Оновлений JSON-обʼєкт ESSUser. Поля описані в розділі 2.2.
pdf string[] Масив підписаних PDF-документів зміни статусу ключів у base64.

Для REHIRED PDF-документи за ключами не формуються, тому pdf буде порожнім масивом.

Якщо у співробітника немає ключів, для яких потрібно виконати каскадну зміну статусу, pdf також буде порожнім масивом.

В історії статусів ключів дія фіксується як виконана адміністратором компанії.

CURL 
curl -X POST 'https://host/api/external/company/employee/status?...' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "action": "BLOCKED",
    "adminKeyUuid": "019ec000-0000-7000-8000-000000000099",
    "adminKeyPassword": "BASE64_RSA_ENCRYPTED_ADMIN_KEY_PASSWORD",
    "reason": "Тимчасове блокування співробітника"
  }'
Помилки 
HTTP type Додаткові поля Опис
400 employee_not_found Співробітник не знайдений.
400 wrong_action Перехід статусу не дозволений.
400 unsupported_action action не передано або не підтримується.
400 invalid_reason reason порожній або коротший за 4 символи після trim.
400 decrypt_error field=adminKeyPassword Не вдалося розшифрувати пароль ключа адміністратора/суперадміністратора.
400 admin_pkey_not_found Ключ адміністратора/суперадміністратора не знайдено або не належить company.
400 admin_required Власник adminKeyUuid не має ролі ADMIN/SUPER_ADMIN.
400 invalid_password Пароль ключа адміністратора/суперадміністратора неправильний.
400 pkey_wrong_status Каскадна зміна статусу одного з ключів неможлива для поточного стану ключа.
403 company_access_denied Немає доступу до company.
403 company_wrong_status status Компанія не ACTIVE.
Методи API

Верифікувати підпис на файлі POST /api/external/company/sign/file/verify

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/sign/file/verify

URL параметри

format (enum) - формат передачі файлів (binary за замовчуванням або base64).

type (enum) - тип підпису:

  • enveloped (за замовчуванням) - очікується рівно 1 файл. Якщо передано 0 або >1 файлу, метод повертає помилку 400.
  • detached - очікується мінімум 2 файли (1 оригінальний документ + 1 або більше файлів підпису .p7s). Якщо передано менше 2 файлів, метод повертає помилку 400.

returnOriginal (boolean) - прапорець повернення оригінального файлу (false за замовчуванням або true).

 

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

multipart/form-data

REQUEST

 

JSON Body

 У тілі запиту передається масив файлів (контент у форматі згідно з параметром format).

RESPONSE

 

{signInfo: [EndUserSignInfo], originalFile: "original file in base64"}

Приклад EndUserSignInfo:

{
    "ownerInfo": {
        "issuer": "O=ТОВ \"АТС\";OU=Відділ електронних довірчих послуг;CN=Тестовий НЕДП ТОВ \"АТС\";Serial=UA-12345678-1111;C=UA;L=Київ;OI=NTRUA-12345678",
        "issuerCN": "Тестовий НЕДП ТОВ \"АТС\"",
        "serial": "447D03645BB037EB040000002100000078000000",
        "subject": "O=ТОВ \"АТС\";Title=генеральний директор;CN=ІВАНЕНКО ІВАН ІВАНОВИЧ;SN=ІВАНЕНКО;GivenName=ІВАН ІВАНОВИЧ;Serial=TINUA-3456789012;C=UA;L=Київ;OI=NTRUA-12345678",
        "subjCN": "ІВАНЕНКО ІВАН ІВАНОВИЧ",
        "subjOrg": "ТОВ \"АТС\"",
        "subjTitle": "генеральний директор",
        "subjLocality": "Київ",
        "subjFullName": "ІВАНЕНКО ІВАН ІВАНОВИЧ",
        "subjAddress": "03061, м. Київ, вул. Михайла Донця, буд. 6",
        "subjPhone": "+38 (0 11) 111-11-11",
        "subjEMail": "testtest@edin.ua",
        "subjEDRPOUCode": "12345678",
        "subjDRFOCode": "3456789012"
    },
    "timeInfo": {
        "isTimeAvail": true,
        "isTimeStamp": true,
        "time": "Mar 26, 2026, 11:26:29 AM",
        "timeArray": [
            126,
            2,
            26,
            11,
            26,
            29
        ]
    }
}

 

 

 

 

Методи API

Отримати інформацію про сертифікат GET /api/external/company/key/certificate

REQUEST

URL


Метод запиту

GET

URL запиту

/api/external/company/key/certificate

URL параметри

key (обов’язково) – uuid ключа;

raw (не обовʼязково) – true/false (за замовченням false), якщо raw = true, то у відповіді буде сам сертифікат в base64

type (не обовʼязково) – тип сертифіката. Доступні значення (SIGNATURE, ENCRYPTION, RSA, ECDSA). За замовченням SIGNATURE

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

RESPONSE

У відповідь повертається об'єкт EndUserCertificateInfoEx з інформацією про сертифікат або контент сертифіката в base64 (якщо raw = true)

Методи API

Створення компанії POST /api/external/company/create

Метод створює компанію у статусі DRAFT, з договором-офертою OFFER, створює чернетку ключа суперадміністратора та привʼязує компанію до зовнішньої системи.

Якщо компанія з таким кодом вже привʼязана до цієї зовнішньої системи, метод не створює нову компанію, а повертає існуючий обʼєкт ESSCompany.

Якщо компанія з таким кодом вже активна, але не привʼязана до цієї зовнішньої системи, метод повертає помилку company_already_active.

REQUEST

URL


Метод запиту

POST

URL запиту

/api/external/company/create

Authorization


Auth type

API key

Key / Value

x-system-id - токен, отриманий при підключенні

Headers

 

Content-Type

application/json

REQUEST

 

REQUEST Body

info - дані суперадміністратора компанії, для якого буде створено чернетку ключа.

company - обʼєкт з даними про компанію ESSCompany

COMPANY:

Поле Формат Тип 1 Опис
fullName string M Повна назва компанії/ФОП.
shortName string M Скорочена назва компанії/ФОП.
fullNameEN string/null O Повна назва англійською.
shortNameEN string/null O Скорочена назва англійською.
type enum M Тип компанії: COMPANY або SELF_EMPLOYED.
code string M Для компанії — ЄДРПОУ, для ФОП — РНОКПП.
ipn string/null O ІПН платника ПДВ, якщо є.
country string/null O Країна.
state string/null O Область/регіон.
locality string/null O Населений пункт.
street string/null O Адреса.
ceoName string/null O ПІБ керівника.

1 - Під визначенням колонки Тип поля мається на увазі скорочене позначення:
  • M (mandatory) — обов’язкові до заповнення поля;

  • O (optional) — необов’язкові (опціональні) до заповнення поля.

Поля договору у запиті передавати не потрібно. Сервер завжди створює компанію з:

Поле Значення
status DRAFT
agreemType OFFER
agreemNumber null
agreemDate 0

INFO:

Поле Тип Обовʼязкове Опис
fullName string так ПІБ суперадміністратора.
ipn string так ІПН/РНОКПП суперадміністратора.
phone string так Телефон у форматі 380XXXXXXXXX.
email string так Email суперадміністратора.
organizationUnit string/null ні Підрозділ для даних ключа.
position string/null ні Посада для даних ключа.
JSON приклад запиту

{
  "company": {
    "fullName": "ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ \"ТЕСТ\"",
    "shortName": "ТОВ \"ТЕСТ\"",
    "fullNameEN": "TEST LLC",
    "shortNameEN": "TEST LLC",
    "type": "COMPANY",
    "code": "00000000",
    "ipn": null,
    "country": "UA",
    "state": "м. Київ",
    "locality": "Київ",
    "street": "вул. Тестова, 1",
    "ceoName": "Іваненко Іван Іванович"
  },
  "info": {
    "fullName": "Іваненко Іван Іванович",
    "ipn": "0000000000",
    "phone": "380671234567",
    "email": "ivanenko@example.com",
    "organizationUnit": "Адміністрація",
    "position": "Директор"
  }
}

RESPONSE 

У відповідь повертаються  статус 200 та обʼєкт ESSCompany.

CURL
curl -X POST 'https://host/api/external/company/create' \
  -H 'x-system-id: 019eb581-307b-7562-8a1f-20227511e898' \
  -H 'Content-Type: application/json' \
  -d '{
    "company": {
      "fullName": "ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ \"ТЕСТ\"",
      "shortName": "ТОВ \"ТЕСТ\"",
      "fullNameEN": "TEST LLC",
      "shortNameEN": "TEST LLC",
      "type": "COMPANY",
      "code": "00000000",
      "ipn": null,
      "country": "UA",
      "state": "м. Київ",
      "locality": "Київ",
      "street": "вул. Тестова, 1",
      "ceoName": "Іваненко Іван Іванович"
    },
    "info": {
      "fullName": "Іваненко Іван Іванович",
      "ipn": "0000000000",
      "phone": "380671234567",
      "email": "ivanenko@example.com",
      "organizationUnit": "Адміністрація",
      "position": "Директор"
    }
  }'
Помилки
type Опис
access_denied Невірний x-system-id або доступ за IP заборонений.
empty_body Тіло запиту порожнє.
invalid_body Некоректний JSON або відсутні обовʼязкові поля.
company_already_active Компанія з таким кодом вже активна, але не привʼязана до цієї зовнішньої системи.
unknown_company Компанію не знайдено в публічних реєстрах, але не коректний ІПН/РНОКПП
wrong_ipn Користувач з таким телефоном вже існує, але має інший ІПН/РНОКПП.
offline_exists Користувач з таким телефоном вже існує з offline-ідентифікацією.

Об'єкти API

Об'єкти API

Довідник enum значень

ESSRegFormType 

Для запитів на документи formType передається як enum name:

name code Опис використання
PK_FORM 1 Заява на отримання КЕП ключ
OFFER_AGREEMENT_USER 2 Договір-оферта користувача компанія
OFFER_AGREEMENT_MANAGER 3 Договір-оферта керівника/УО компанія
POWER_OF_ATTORNEY 4 Доручення компанія
AFFILIATION_CONFIRMATION 5 Приналежність
SIGNATORY_CONFIRMATION 6 Підтвердження підписанта
CA_CONFIRMATION 7 Підтвердження КНЕДП
INDIVIDUAL_AGREEMENT 8 Індивідуальний договір
PK_APPENDIX 9 Додаток до заяви
USER_IDENTIFICATION 10 Ідентифікація користувача
COMPANY_CHARTER 11 Статут компанії
ACCEPT_CHARTER 12 Підтвердження статуту компанії
AGREEMENT_APPENDIX 13 Додаток до договору
DISAGREEMENT_PROTOCOL 14 Протокол розбіжностей

У методі для заміни статусу ключа підписи передаються у map forms, де ключ — це enum name, наприклад, "PK_FORM" або "PK_APPENDIX".

Інші поширені enum
Enum Приклади значень
ESSCompanyUserType USERADMINSUPER_ADMINDRAFT_ADMIN
ESSUserIdentificationType SIGNDIIA_INTERNAL_PASSPORTDIIA_FOREIGN_PASSPORTOFFLINEUNKNOWN
ESSUserCompleteType YESNO
ESSUserCompanyStatus ACTIVEBLOCKEDFIREDREHIRED
ESSPKType UAECDSA
ESSPKStoreType HSMFILE
ESSPKStatus COMPANY_GENERATEDACTIVATED, інші статуси ключа
EUCreatePKType SIGN_ONLYSIGN_AND_ENCRYPT
ESSCertificateValidityYears ONETWO
Об'єкти API

Об'єкт ESSCompany

Опис параметрів об’єкта
Поле Тип Опис
id number Внутрішній ідентифікатор компанії.
fullName string/null Повна назва українською.
shortName string/null Скорочена назва українською.
fullNameEN string/null Повна назва англійською.
shortNameEN string/null Скорочена назва англійською.
type enum Тип компанії, наприклад, COMPANY або SELF_EMPLOYED.
code string Код компанії/ФОП.
ipn string/null ІПН, якщо застосовується.
status enum Статус компанії. Частина write/action методів дозволена лише для ACTIVE компаній.
country string/null Країна.
state string/null Область/регіон.
locality string/null Населений пункт.
street string/null Адреса.
ceoName string/null ПІБ керівника.
agreemType enum/null Тип договору.
agreemNumber string/null Номер договору.
agreemDate number Дата договору, Unix timestamp у секундах.
ECDSAStatus або ecdsaStatus enum Готовність компанії до ECDSA залежно від EN-назв.
role enum/null Роль користувача в компанії, якщо company повернена в контексті співробітника.
employeeStatus enum/null Статус співробітника, якщо company повернена в контексті співробітника.
employeeEmail string/null Email співробітника в компанії, якщо доступний.

JSON приклад:

{
  "id": 123,
  "fullName": "ТОВ \"Тест\"",
  "shortName": "ТОВ \"Тест\"",
  "fullNameEN": "TEST LLC",
  "shortNameEN": "TEST LLC",
  "type": "COMPANY",
  "code": "25412361",
  "ipn": null,
  "status": "ACTIVE",
  "country": "UA",
  "state": "Київська",
  "locality": "Київ",
  "street": "вул. Тестова, 1",
  "ceoName": "Петренко Петро Петрович",
  "agreemType": "INDIVIDUAL",
  "agreemNumber": "123",
  "agreemDate": 1717200000,
  "role": null,
  "employeeStatus": null,
  "employeeEmail": null
}

 

Об'єкти API

Об'єкт ESSUser

Опис параметрів об’єкта
Поле Формат Опис
id number Внутрішній ідентифікатор користувача.
login string Логін/телефон користувача.
email string/null Email користувача.
fullName string/null ПІБ українською з ідентифікації.
fullNameEN string/null ПІБ англійською, якщо є.
ipn string/null РНОКПП/ІПН користувача.
unzr string/null УНЗР.
registered або isRegistered boolean Ознака, чи зареєстрований користувач.
type enum Тип ідентифікації:  SIGNDIIA_INTERNAL_PASSPORTDIIA_FOREIGN_PASSPORTOFFLINEUNKNOWN.
identified enum YES або NO.
mobile або isMobile boolean Ознака mobile user.
role enum/null Роль у компанії: USERADMINSUPER_ADMINDRAFT_ADMIN.
employeeStatus enum/null Статус співробітника у компанії.
employeeEmail string/null Email співробітника у компанії.

JSON приклад:

{
  "id": 456,
  "login": "380501112233",
  "email": "employee@example.com",
  "fullName": "Іваненко Іван Іванович",
  "fullNameEN": "IVANENKO IVAN",
  "ipn": "3148615913",
  "unzr": "19900101-12345",
  "registered": false,
  "type": "SIGN",
  "identified": "YES",
  "mobile": false,
  "role": "USER",
  "employeeStatus": "ACTIVE",
  "employeeEmail": "employee@example.com"
}

 

Об'єкти API

Обект ESSPrivateKey

Опис параметрів об’єкта
Поле Тип Опис
id number Внутрішній ідентифікатор ключа.
name string Назва ключа.
caUserId number Внутрішній ID CA user.
caUser object/null Обʼєкт ESSCAUser.
uuid string Публічний ідентифікатор ключа. Використовувати як key або keyUuid.
status enum Статус ключа, наприклад, COMPANY_GENERATEDACTIVATED.
statusType enum Додатковий тип статусу.
storeType enum Тип сховища: HSMFILE.
keyType enum Тип ключа: UAECDSA.
stamp або isStamp boolean true, якщо це печатка.
validityYears enum ONE або TWO.
validFrom number Початок дії сертифіката, Unix timestamp у секундах.
validTo number Кінець дії сертифіката, Unix timestamp у секундах.
usage number Внутрішній usage.
parentKeyId number Внутрішній ID батьківського ключа, якщо є.
requests array Масив ESSPKRequest.
certificates array Масив ESSCertificate.

 

Об'єкти API

Об'єкт ESSCAUser

Опис параметрів об’єкта
Поле Формат Опис
id number Внутрішній ID CA user.
userId number Внутрішній ID користувача.
type enum Тип CA user, наприклад COMPANYSELF_EMPLOYEDPERSONAL.
serialNumber number Серійний номер користувача в ЦСК.
info object/null Об'єкт ESSCAUserInfo.
companyId number Внутрішній ID компанії.
company object/null Об'єкт ESSCompany

 

Об'єкти API

Об'єкт ESSCAUserInfo

Опис параметрів об'єкта
Поле Формат Опис
commonName string/null CN.
userCode string/null Код користувача.
locality string/null Населений пункт.
state string/null Область/регіон.
country string/null Країна.
street string/null Адреса.
organization string/null Організація.
organizationCode string/null Код організації.
organizationUnit string/null Підрозділ.
ouCode string/null Код підрозділу.
title string/null Посада.
phone string/null Телефон.
surname string/null Прізвище.
givenname string/null Імʼя/по батькові.
email string/null Email.
dns string/null DNS.
upn string/null UPN.
edrpouCode string/null ЄДРПОУ.
drfoCode string/null РНОКПП/ДРФО.
nbuCode string/null Код НБУ.
unzr string/null УНЗР.
information string/null Додаткова інформація.
passPhrase або isPassPhrase boolean Чи збережено секретну фразу.
publishCert boolean Публікувати сертифікат.
publishCertOut boolean Публікувати сертифікат назовні.
Об'єкти API

Об'єкт ESSPKRequest

Опис параметрів об'єкта
Поле Формат Опис
privateKeyId number Внутрішній ID ключа.
type enum SIGNATUREENCRYPTIONECDSA.
content number[] Бінарний p10 request у форматі PKCS #10 у JSON як масив байтів.
publicKey number[] Публічний ключ як масив байтів.
publicKeyId number[] ID публічного ключа як масив байтів.
Об'єкти API

Об'єкт ESSCertificate

Опис параметрів об'єкта
Поле Формат Опис
type enum SIGNATUREENCRYPTIONECDSA.
status enum Статус сертифіката.
serial string Серійний номер сертифіката.
Об'єкти API

Об'єкт ESSUserIdentification

Опис параметрів об'єкта
Поле Формат Опис
type enum Тип ідентифікації.
complete enum YES або NO.
fullName string/null ПІБ українською.
fullNameEN string/null ПІБ англійською.
ipn string/null РНОКПП/ІПН.
unzr string/null УНЗР.
state string/null Область/регіон.
city string/null Населений пункт.
address string/null Адреса.
publicKey string/null Публічний ключ у hex-поданні.
validTo number Дата завершення сертифіката, Unix timestamp у секундах.
sign string/null Зазвичай null у цих відповідях; файл підпису повертається окремо в полі data.
Об'єкти API

Об'єкт ESSPrivateKeysQuery

Опис параметрів об'єкта

Параметр

Формат

Тип 1

Опис

nameQuery string O Пошук за назвою ключа.
companyQuery string O Пошук за назвою компанії.
caUserName string O Пошук за CA user name.
stamp boolean O true — тільки печатки, false — тільки ключі.
validTo object O Діапазон дати validTo.
userId number O Internal поле; для external API краще не використовувати.
title string O Пошук за посадою.
parentPKeyId number O Internal поле батьківського ключа.
uuids string[] O Список UUID ключів.
statuses enum[] O Фільтр за статусами ключів.
statusTypes enum[] O Фільтр за типами статусів.
storeType enum[] O HSMFILE.
keyType enum[] O UAECDSA.
caType enum[] O Тип CA user.
pKeyId number[] O Internal ID ключів; для external API краще не використовувати.
companies number[] O Internal поле; у external API компанія береться з companyCode.
users number[] O Internal поле; для методу пошуку ключів співробітника employee береться з employeeIpn.
usage number[] O Usage фільтр.
orderBy object O Сортування.
limit object O Ліміт/offset.

JSON приклад:

{
  "nameQuery": "Ключ",
  "stamp": false,
  "statuses": ["ACTIVATED"],
  "storeType": ["HSM"],
  "keyType": ["UA"],
  "limit": {
    "offset": 0,
    "count": 50
  }
}

1 - Під визначенням колонки Тип поля мається на увазі скорочене позначення:
  • M (mandatory) — обов’язкові до заповнення поля;

  • O (optional) — необов’язкові (опціональні) до заповнення поля.

Об'єкти API

Об'єкт ESSUsersQuery

Опис параметрів об'єкта

Параметр

Формат

Тип 1

Опис

search string O Пошук за ПІБ, ІПН або телефоном.
users number[] O Internal ID користувачів; для external API краще не використовувати.
companies number[] O Internal поле; компанія береться з companyCode.
role enum[] O USERADMINSUPER_ADMIN.
identification enum[] O YESNO.
employeeStatus enum[] O Наприклад ACTIVE.
registration boolean O Фільтр за реєстрацією користувача.
orderBy object O Сортування.
limit object O Ліміт/offset.

JSON приклад:

{
  "search": "3148615913",
  "role": ["USER", "ADMIN"],
  "identification": ["YES"],
  "employeeStatus": ["ACTIVE"],
  "limit": {
    "offset": 0,
    "count": 50
  }
}

 

Об'єкти API

Об'єкт EndUserCertificateInfoEx

 
class EndUserCertificateInfoEx {
    isFilled: boolean;
    version: number;
    issuer: string;
    issuerCN: string;
    serial: string;
    subject: string;
    subjCN: string;
    subjOrg: string;
    subjOrgUnit: string;
    subjTitle: string;
    subjState: string;
    subjLocality: string;
    subjFullName: string;
    subjAddress: string;
    subjPhone: string;
    subjEMail: string;
    subjDNS: string;
    subjEDRPOUCode: string;
    subjDRFOCode: string;
    subjNBUCode: string;
    subjSPFMCode: string;
    subjOCode: string;
    subjOUCode: string;
    subjUserCode: string;
    certBeginTime: Date;
    certEndTime: Date;
    isPrivKeyTimesAvail: boolean;
    privKeyBeginTime: Date;
    privKeyEndTime: Date;
    publicKeyBits: number;
    publicKey: string;
    publicKeyID: string;
    issuerPublicKeyID: string;
    keyUsage: string;
    extKeyUsages: string;
    policies: string;
    crlDistribPoint1: string;
    crlDistribPoint2: string;
    isPowerCert: boolean;
    isSubjTypeAvail: boolean;
    isSubjCA: boolean;
    chainLength: number;
    UPN: string;
    publicKeyType: number;
    keyUsageType: number;
    RSAModul: string;
    RSAExponent: string;
    OCSPAccessInfo: string;
    issuerAccessInfo: string;
    TSPAccessInfo: string;
    isLimitValueAvailable: boolean;
    limitValue: number;
    limitValueCurrency: string;
    subjType: number;
    subjSubType: number;
    subjUNZR: string;
    subjCountry: string;
    fingerprint: string;
    isQSCD: boolean;
    subjUserID: string;
    certHashType: number;
}