Identity is a registered credential
An agent registers once and exchanges an assertion for an access token, then presents that token asAuthorization: Bearer …. Buying an entitlement requires one: a plan purchase or top-up binds to the credential, so the buyer keeps its plan however it chooses to pay.
Pay-as-you-go callers need no credential and still get a zcAgentId: ZeroClick registers an anonymous agent for each payer. How stable that id is depends on the rail:
What sellers see: zcAgentId
Sellers only ever see a buyer as zcAgentId, an id shaped like agt_x7f2kq93bh0d. It is stable per buyer and appears consistently across the product: the zc-agent-id request header on forwarded requests, the zcAgentId field in 402 challenge bodies, usage reports and usage events, and transaction analytics. Use it as your foreign key for per-buyer state: rate limits, tenancy, audit logs.
Agents belong to buyers: zcBuyerId
An agent is one credential. A buyer is the person or company behind it, and one buyer can hold several agents: a replacement for a rotated credential, a second agent for a different workload, a recovered identity from an earlier registration. Entitlements live on the buyer, so every agent a buyer holds can draw on every plan the buyer bought, no matter which agent made the purchase.
When ZeroClick knows the owner, forwarded requests carry zc-buyer-id (byr_3n8v1c6t5j2w) alongside zc-agent-id:
Agent whose owner is known
zc-agent-id is always the agent that made this call. It never switches to the agent that originally bought the plan being drawn down, so a request from a buyer’s second agent looks like exactly what it is. The buyer id is what stays stable across all of them.
No zc-buyer-id means an anonymous agent: identified, billable, and fine to serve, but not yet attached to an owner you should key durable records to. Prefer zc-buyer-id for anything a human should still see after the agent that created it is gone, and zc-agent-id for per-caller concerns like rate limits. The headers reference has the full matrix, including what the signature does and does not cover.
Anonymous probes have no agent id
One forwarded request legitimately arrives without a buyer: the signed anonymous probe. When an unpaid pay-as-you-go request needs pricing, ZeroClick forwards it upstream so your API can state its price as a402 payment_required refusal. ZeroClick re-prices that refusal into the buyer’s challenge (see how ZeroClick works). Nobody has paid yet, so there is no verified identity to attach: the probe carries no zc-agent-id header, and the signature’s agent segment is the empty string. Identity binds at verify time, from the signed payment; only the paid retry carries the agent id:
Anonymous probe: valid signature, no agent
Paid retry: same request id, agent bound
Access grants
A purchase creates a buyer access: the grant that ties one buyer to one plan at one seller, and the thing every allowance check evaluates. Each buyer holds at most one active access per seller. Buying again or switching plans replaces the grant in place rather than stacking a second one. Any remaining credit carries forward onto the new purchase, so an unspent balance survives a plan switch. An access carries:status:activeorinactive. Checks against an inactive access are deniedaccess_inactive.periodStartsAt/periodEndsAt: the current period for subscription-style plans. A check afterperiodEndsAtis deniedplan_expired.remainingCreditUsd: the prepaid balance on credit plans, or the included usage credit onsubscription_usageplans. Usage draws it down; an amount it cannot cover is deniedusage_exhausted.
agt_… before it forwards, so your API needs no buyer authentication of its own. The zc-signature header is the trust boundary.