Bots and AI agents
Stop scripted claims while letting the AI agents you trust claim benefits for real people.
Not all automation is abuse. AI agents now sign up, start trials and claim credits for real people, and blocking every one of them turns away real customers. AbuseZero tells the two apart on every evaluation, in the same call that checks the claim.
Agents that can prove who they are show up as recognized agents, by name. You decide, benefit by benefit, which ones may claim it. Automation that hides what it is gets no pass. It's assessed alongside identity, device, network and benefit-history signals, and your policy decides the outcome.
All of this runs inside the evaluation's time limit. Your server makes one call and gets one answer: allow or deny.
Why it matters
Scripted sign-ups are how one person turns a single trial into hundreds. Blanket bot blocking stops them, but it also stops the browser assistants and AI agents your real customers increasingly rely on. AbuseZero Automation Defense lets you be strict with the first and welcoming to the second, per benefit.
Key capabilities
- Automation assessed on every evaluation. Automation is one of the five signal families, assessed together with the others inside the evaluation's time limit.
- A bot check at the moment of submission. When your page runs a bot check as the person submits, AbuseZero verifies it during the evaluation. A check is valid only for its own claim and for a short time.
- Verified AI agents. Your server verifies an incoming agent request with one SDK call. AbuseZero then recognizes the agent by name during the evaluation.
- Allow verified agents. A recognized agent gets special treatment only on the benefits where you allowed it.
- Rules apply to agents. Verified agents you allowed skip the benefit's automation setting, but your rules, lists and eligibility apply to them like anyone else. An agent is automation, so a custom rule on
automation.detectedmatches recognized agents too.
Configuration
Each benefit has three automation settings, in the dashboard under Policies → Automation or in the benefit's config:
| Setting | Field | Values |
|---|---|---|
| Automated traffic | automation | assess (default): automated activity counts toward the AbuseZero Risk Score. deny: claims with detected automation are denied. allow: detected automation doesn't count against the claim. |
| Automation check | bot_evidence | optional (default): a bot check is used when the evaluation carries one. required: every evaluation for this benefit must carry a completed bot check. |
| Verified AI agents | allowed_agents | The recognized agents allowed to claim this benefit. IDs come from GET /v1/agents. |
Denying automation
deny can also block legitimate browser assistants. Allow the verified agents you trust on the
same benefit, and start in observe mode to see the effect first.
Add a bot check
In the browser, call prepareBotObservation instead of observe when the person submits. Send its deviceToken with the evaluation within 2 minutes.
import { prepareBotObservation } from "abusezero/browser";
const { deviceToken } = await prepareBotObservation({ key: "pk_…", claimId });When bot_evidence is required and the evaluation has no usable bot check, the evaluation returns an error instead of a result:
| Error | Status | What to do |
|---|---|---|
BOT_EVIDENCE_REQUIRED | 422 | Run prepareBotObservation for this claim, then evaluate again. |
BOT_EVIDENCE_UNAVAILABLE | 503, retryable | Collect a fresh bot check and retry shortly. |
Evaluations that carry evidence from a verified agent you allowed don't need a bot check. See Add a bot check.
Recognize verified agents
On your server, verify the incoming request with verifyAgentRequest, then send the result with the evaluation as agent_evidence:
import { AbuseZero, verifyAgentRequest } from "abusezero/server";
const abusezero = new AbuseZero({ key: process.env.ABUSEZERO_SECRET_KEY!, outage: "throw" });
export async function POST(request: Request) {
const { email, claimId, deviceToken } = await request.clone().json();
const agentEvidence = await verifyAgentRequest(request, claimId, "https://app.example.com");
const evaluation = await abusezero.evaluate(
{
benefit: "pro_trial",
claim_id: claimId,
subject: { email },
identifiers: { device_token: deviceToken },
agent_evidence: agentEvidence,
},
`claim:${claimId}`,
);
// Act on evaluation.result
}- Pass the incoming request, the claim's ID and your site's public origin.
- Send the returned
AgentEvidencetoken unchanged. It is opaque and bound to that claim. Evidence for another claim is refused withAGENT_EVIDENCE_SCOPE. - Verify and evaluate while handling the same request. Agent evidence is short-lived.
- Requests from people return evidence too. Always send it. AbuseZero handles both.
See Verify AI agents.
Programmatic access
| Interface | Use |
|---|---|
| AbuseZero REST API | GET /v1/agents, and PATCH /v1/benefits/{id} for config.automation, config.bot_evidence and config.allowed_agents |
| AbuseZero Node.js SDK | verifyAgentRequest(), agents(), updateBenefit() |
| AbuseZero browser SDK | prepareBotObservation() |
| AbuseZero CLI | abusezero agents list, benefits update |
| AbuseZero MCP server | abusezero_list_agents, abusezero_update_benefit |
| Dashboard | Policies → Automation |
Response data
- The evaluation's evidence and the dashboard show the
automationfamily, with an assessment ofclear,elevated,highorunavailable. - When AbuseZero Automation Defense decides a claim, the reason code is
automation: "AbuseZero Automation Defense detected automated activity." GET /v1/agentslists the agents AbuseZero recognizes. Each has anidforallowed_agentsand a displayname.
Next steps
How is this guide?
Last updated on