KyroKyro Docs
ReferenceAPI Reference

Screen many counterparties in one call

POST
/api/v1/decision/batch

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
AuthorizationBearer <token>

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."      }    ]  }}