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