AbuseZero

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.detected matches recognized agents too.
Claims a benefitEvaluation with device tokenand agent evidenceallow or denyPerson or agentYour serverAbuseZero
Claims a benefitEvaluation with device tokenand agent evidenceallow or denyPerson or agentYour serverAbuseZero

Configuration

Each benefit has three automation settings, in the dashboard under Policies → Automation or in the benefit's config:

SettingFieldValues
Automated trafficautomationassess (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 checkbot_evidenceoptional (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 agentsallowed_agentsThe 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.

In the browser
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:

ErrorStatusWhat to do
BOT_EVIDENCE_REQUIRED422Run prepareBotObservation for this claim, then evaluate again.
BOT_EVIDENCE_UNAVAILABLE503, retryableCollect 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:

On your server
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 AgentEvidence token unchanged. It is opaque and bound to that claim. Evidence for another claim is refused with AGENT_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

InterfaceUse
AbuseZero REST APIGET /v1/agents, and PATCH /v1/benefits/{id} for config.automation, config.bot_evidence and config.allowed_agents
AbuseZero Node.js SDKverifyAgentRequest(), agents(), updateBenefit()
AbuseZero browser SDKprepareBotObservation()
AbuseZero CLIabusezero agents list, benefits update
AbuseZero MCP serverabusezero_list_agents, abusezero_update_benefit
DashboardPolicies → Automation

Response data

  • The evaluation's evidence and the dashboard show the automation family, with an assessment of clear, elevated, high or unavailable.
  • When AbuseZero Automation Defense decides a claim, the reason code is automation: "AbuseZero Automation Defense detected automated activity."
  • GET /v1/agents lists the agents AbuseZero recognizes. Each has an id for allowed_agents and a display name.

Next steps

How is this guide?

Last updated on

On this page