Пакет
Пакет перевіряє до 100 адрес або транзакцій в одному запиті. Використовуйте його, щоб повторно перевірити наявну базу клієнтів або розібрати накопичені черги без сотні окремих запитів; пакет рахується як один запит до обмеження частоти.
Надсилання пакета
POST /v1/checks/batch зі scope checks:write.
{
"items": [
{ "subject": "address", "asset": "TRX", "address": "…" },
{ "subject": "transaction", "asset": "ETH", "tx_hash": "…", "direction": "deposit", "address": "…" }
]
}
itemsмістить від 1 до 100 елементів. Порожній список, понад 100 елементів або невідоме поле відповідають400VALIDATION_ERROR.- Кожен елемент має тіло однієї перевірки: див. Перевірки адрес і Перевірки транзакцій.
- Елементи завжди надсилають
address, також і елементи-транзакції. Пакет приймається без читання будь-якого блокчейну, тож адресу не можна вивести з транзакції. Елемент без неї — помилка валідації. - Елемент з непідтримуваним активом відповідає
422UNSUPPORTED_ASSET, і весь пакет відхиляється.
API приймає пакет і відповідає 202, нічого не перевіряючи в межах запиту:
{
"status": "ok",
"data": {
"batch_id": "c1e5a9d2-3f1b-4a67-b2c8-7d90e4f61a35",
"item_count": 2,
"status": "queued",
"items": [
{ "item_index": 0, "check_id": "8a2f6c10-5d4e-4b73-9a1c-0e3b7d52f984" },
{ "item_index": 1, "check_id": "2d7b1e90-6a3c-4f58-8c14-b5a09f3e7d62" }
]
},
"errors": []
}
item_index — це нульова позиція елемента в масиві items, і вона не змінюється протягом життя пакета. Кожен елемент — повноцінна перевірка зі своїм check_id.
- curl
- Node.js
- Python
curl -s -X POST https://api.leeri.ai/v1/checks/batch \
-H "Authorization: Bearer $LEERI_API_KEY" \
-H "Idempotency-Key: rescreen-2026-10" \
-H "Content-Type: application/json" \
-d '{"items":[
{"subject":"address","asset":"TRX","address":"'"$ADDRESS_1"'"},
{"subject":"address","asset":"BTC","address":"'"$ADDRESS_2"'"}
]}'
const response = await fetch('https://api.leeri.ai/v1/checks/batch', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LEERI_API_KEY}`,
'Idempotency-Key': 'rescreen-2026-10',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: addresses.map(({ asset, address }) => ({ subject: 'address', asset, address })),
}),
});
const { data } = await response.json();
console.log(data.batch_id, data.item_count); // status is "queued"
import os
import requests
response = requests.post(
"https://api.leeri.ai/v1/checks/batch",
headers={
"Authorization": f"Bearer {os.environ['LEERI_API_KEY']}",
"Idempotency-Key": "rescreen-2026-10",
},
json={"items": [{"subject": "address", "asset": a["asset"], "address": a["address"]} for a in addresses]},
timeout=30,
)
data = response.json()["data"]
print(data["batch_id"], data["item_count"]) # status is "queued"
Допуск — усе або нічого
Кожен елемент резервується й приєднується до пакета одним кроком. Якщо щось не може бути допущено, нічого не приймається й нічого не списується:
| Статус | Код | Значення |
|---|---|---|
402 | INSUFFICIENT_BALANCE | Ліміт і попередньо поповнений баланс не покривають усі елементи. |
429 | PROVIDER_CAPACITY_EXCEEDED | Ємність для запитів зараз заповнена. Повторіть після Retry-After. |
422 | PROVIDER_CAPACITY_REQUEST_TOO_LARGE | Одному цьому пакету потрібно більше ємності, ніж має ваш обліковий запис. Він ніколи не пройде й не підлягає повторенню: розбийте його на менші пакети. |
Кожен live-елемент може займати до 10 слотів запитів, доки його запити не зафіксовано, а типова ємність облікового запису завжди допускає один повний пакет зі 100 елементів, коли більше нічого не очікує. Див. Обмеження частоти запитів і ліміти.
Читання результатів
Елементи перевіряються у фоні, за обмеженням частоти запитів до сторонніх джерел даних, тож великий пакет потребує часу. Стежте за прогресом через GET /v1/checks/batch/{batch_id} (scope checks:read):
| Поле | Значення |
|---|---|
batch_id, item_count | Пакет і скільки елементів він містить. |
status | queued, running або completed. |
completed_count, failed_count | Скільки елементів завершилися вердиктом і скільки зазнали невдачі. |
items | Кожен елемент із тим самим тілом, що й GET /v1/checks/{check_id}, плюс item_index. |
Пакет стає completed, коли completed_count + failed_count досягає item_count. Пакет ніколи не зазнає невдачі цілком через один елемент: читайте власний status кожного елемента (completed, pending або failed, як у будь-якої перевірки), а що вони означають — див. Pending і опитування.
Елементи — звичайні перевірки, тож один із них можна прочитати й за його check_id через GET /v1/checks/{check_id}. Якщо вебхук зареєстровано, кожен елемент, що завершується, викликає власну доставку check.completed: по одній на елемент, а не на пакет; див. Вебхуки.
- curl
- Node.js
- Python
curl -s https://api.leeri.ai/v1/checks/batch/$BATCH_ID \
-H "Authorization: Bearer $LEERI_API_KEY"
async function waitForBatch(batchId) {
for (;;) {
const response = await fetch(`https://api.leeri.ai/v1/checks/batch/${batchId}`, {
headers: { Authorization: `Bearer ${process.env.LEERI_API_KEY}` },
});
if (!response.ok) throw new Error(`poll failed with ${response.status}`);
const { data } = await response.json();
if (data.status === 'completed') return data;
await new Promise((resolve) => setTimeout(resolve, 10_000));
}
}
const batch = await waitForBatch(batchId);
for (const item of batch.items) console.log(item.item_index, item.status, item.band);
import os
import time
import requests
def wait_for_batch(batch_id):
while True:
response = requests.get(
f"https://api.leeri.ai/v1/checks/batch/{batch_id}",
headers={"Authorization": f"Bearer {os.environ['LEERI_API_KEY']}"},
timeout=30,
)
response.raise_for_status()
data = response.json()["data"]
if data["status"] == "completed":
return data
time.sleep(10)
batch = wait_for_batch(batch_id)
for item in batch["items"]:
print(item["item_index"], item["status"], item["band"])
Повторення пакета
Надсилайте Idempotency-Key разом із пакетом. Повторення того самого ключа з тим самим тілом повертає той самий пакет замість створення другого, а ключ кожного елемента виводиться з ключа пакета та його позиції, тож жоден елемент не може бути перевірений двічі. Той самий ключ з іншим тілом відповідає 422 IDEMPOTENCY_KEY_CONFLICT. Див. Ідемпотентність.