Screen many counterparties in one call
Batch counterparty check for payroll runs, grant payouts, escrow batches, marketplace onboarding and allowlists. Accepts wallet addresses and Kyro usernames mixed in one list. Entries are trimmed and deduped case-insensitively (first occurrence keeps its position); every unique entry gets its own row in the answer, in input order.
Committed reads only: a batch never triggers indexing or provider scans,
and the input list is processed in memory, never stored. A bad row never
fails the batch; it becomes its own row status. Rows without a
committed score report no_score instead of a verdict. No receipts are
created by this endpoint.
Limits: at most 200 raw entries per request; after dedupe, at most 10 unique rows anonymously or 50 with an API key. A batch of N unique rows consumes N rate units; batches rejected for size or shape are not charged.
Authorization
bearerApiKey Optional Kyro API key: Authorization: Bearer kyro_live_.... Anonymous
access (no header) works on every endpoint with a lower rate limit
(20 units/minute per IP vs 120 units/minute per key). Keys are validated
only when the header is present; a malformed, unknown or revoked key is
rejected with 401 INVALID_KEY.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/v1/decision/batch" \ -H "Content-Type: application/json" \ -d '{ "inputs": [ "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "0x1111111111111111111111111111111111111111", "amara.kyro" ], "useCase": "payment" }'{ "ok": true, "version": "v1", "data": { "useCase": "payment", "decisionModelVersion": "decision_v0.4.1", "summary": { "total": 2, "allow": 0, "caution": 1, "block": 0, "noScore": 1, "invalid": 0, "error": 0 }, "results": [ { "input": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "status": "ok", "wallet": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "username": null, "decision": "caution", "score": 79, "riskLevel": "Trusted", "recommendedLimit": { "amountUsdc": 50, "currency": "USDC", "basis": "Caution band for payment (v0 conservative limits)." }, "reasons": [ { "code": "KYRO_TRUST_GRAPH_MISSING", "message": "This wallet has no Kyro-native relationship evidence yet." } ], "warnings": [], "note": null }, { "input": "0x1111111111111111111111111111111111111111", "status": "no_score", "wallet": "0x1111111111111111111111111111111111111111", "username": null, "decision": null, "score": null, "riskLevel": null, "recommendedLimit": null, "reasons": [], "warnings": [], "note": "No committed score snapshot for this wallet." } ] }}