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 scale with the caller's plan. Unique rows after dedupe: 10 anonymously, 50 on a developer key, 250 on pro, 500 on partner by default (partner caps can be custom per agreement). Raw entries before dedupe are capped at 4x the row cap with a floor of 200. 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; keyed budgets follow the key's plan, starting
at developer 120). 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": [ "0x1234567890abcdef1234567890abcdef12345678", "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": "0x1234567890abcdef1234567890abcdef12345678", "status": "ok", "wallet": "0x1234567890abcdef1234567890abcdef12345678", "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." } ] }}