API referenceReputation

Get one agent's reputation and should-send verdict

Returns one agent's live reputation: its rolling bounceRate and complaintRate recomputed from the agent's recent delivery outcomes, the current breaker state (healthy, throttled, quarantined, or review), a verdict (allow, throttle, block, review), and a shouldSend boolean that is false only when the agent is quarantined.

Endpoint
GET https://api.dairo.app/v1/agents/{id}/reputation

Returns one agent's live reputation: its rolling bounceRate and complaintRate recomputed from the agent's recent delivery outcomes, the current breaker state (healthy, throttled, quarantined, or review), a verdict (allow, throttle, block, review), and a shouldSend boolean that is false only when the agent is quarantined. The window block reports the hours (24 by default), sent, bounces, and complaints behind the rates, and thresholds echoes the warn/trip lines in force (complaintWarn 0.10% / complaintTrip 0.20%, bounceWarn 3% / bounceTrip 4%) so you never hard-code them — a rate only trips once at least 30 sends fall in the window, so a tiny sample never quarantines an agent. Poll this before a batch: a quarantined agent's sends are rejected with 429 until you clear it, while throttled tightens its send rate without blocking, and lastReason, lastTrippedAt, and lastEvaluatedAt explain the most recent transition. Automatic transitions (during a send, or when bounce and complaint feedback arrives) emit an agent.reputation.changed webhook, so you can react without polling. A never-evaluated agent reads healthy; requires the agents:read scope and returns 404 if the agent doesn't exist under your account.

Scope: agents:read. Send the API key as a bearer token; Scopes lists what each one reaches.

Request

cURL
curl "https://api.dairo.app/v1/agents/3fa85f64-5717-4562-b3fc-2c963f66afa6/reputation" \
  -H "Authorization: Bearer $DAIRO_API_KEY"

Path parameters

NameTypeRequiredDescription
idstringyesAgent UUID.

Response

200 Success. Body: application/json, AgentReputation.

FieldTypeRequiredDescription
agentIdstringyes
state"healthy", "throttled", "quarantined", "review"yesCircuit-breaker state. healthy sends freely; throttled sends under a reduced per-agent rate; quarantined is fail-closed (no send) until cleared; review is an operator-pinned hold.
verdict"allow", "throttle", "block", "review"yes
shouldSendbooleanyesfalse only when the agent is quarantined. Poll before a batch.
windowobjectyes
ratesobjectyes
thresholdsobjectyes
lastReasonstring or nullno
lastTrippedAtstring or nullno
lastEvaluatedAtstring or nullno
overrideLockedbooleannoTrue while an operator override lock (set in the dashboard by an owner or admin) pins the state.
overrideLockedUntilstring (date-time) or nullnoWhen the override lock ends (at most 24 hours after it was set); null without a lock.
200
{
  "agentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "state": "healthy",
  "verdict": "allow",
  "shouldSend": true,
  "window": {
    "hours": 0,
    "sent": 0,
    "bounces": 0,
    "complaints": 0
  },
  "rates": {
    "bounceRate": 0,
    "complaintRate": 0
  },
  "thresholds": {
    "complaintWarn": 0,
    "complaintTrip": 0,
    "bounceWarn": 0,
    "bounceTrip": 0
  },
  "lastReason": null,
  "lastTrippedAt": null,
  "lastEvaluatedAt": null,
  "overrideLocked": true,
  "overrideLockedUntil": "2026-10-19T09:30:00Z"
}

Errors

Every error has the same body, {"error": {"type", "code", "message", "param"}}; branch on code. Errors lists every code.

StatusMeaning
400The request is malformed or a value is invalid (invalid_request, invalid_domain, idempotency_key_mismatch).
401The API key is missing or invalid.
403The key lacks the scope this endpoint needs (scope_missing) or may not do this (not_permitted).
404No such resource in this account (resource_not_found).
422The request is well-formed but a field failed validation (validation_failed).
429Rate limit, plan limit, budget or spend cap reached (rate_limited, plan_limit_reached, budget_exceeded, spend_cap_reached).
500An unexpected error; retry with backoff, then contact support (internal_error).

On this page