Monitoring and verifiable evidence for AI agent payments. Cross-rail records, risk signals, and bank-facing evidence. Open-source SDKs. Developer preview.
Your AI agent just spent $412. Prove it.
HalvorAI signs every agent payment at the source, on every rail, and your bank verifies it offline. Change one cent and it fails. Open source, live on npm and PyPI.
https://t.co/nCgCNGibpr
A signed-in dashboard session can't send events to HalvorAI. Ingest needs an API key.
Keys carry scopes, not roles, so give each one only what it needs. For an ingest key that's events:write, the default.
https://t.co/7V79IqP8EN
A card number in an agent's payment memo, run through our TypeScript SDK with a local sink: it comes out as [redacted:pan], before the event is signed.
A real run, synthetic data, animated. No account needed.
https://t.co/tFiiZ7kXkv
Branch on our error codes, not our messages.
Codes like pan_detected or key_environment_mismatch are stable strings. Messages are written for people and can change.
Every response carries a Request-Id header. Include it when you ask us for help.
https://t.co/Rq5HhH7sZO
Our Python SDK, halvorai-ingest 0.4.1, signs events the same way as the TypeScript SDK, so an event signed in one verifies in the other.
Not in it yet: the Stripe, MPP and MCP adapters. Until then, build the event yourself and pass it to emit().
https://t.co/q7dGtfiOea
American Banker counts at least five large US banks blocking outside AI agents from customer accounts. One concern: no clear liability when an agent logs in with a customer's password.
Our read: access needs a record of which agent acted, and for whom.
https://t.co/CEzRM3fAEM
"ACME Ltd." and "Acme Ltd" in the same country are one payee to us. A payee key is a wallet, a merchant id, or a normalized name plus country.
That matters because new_payee is only as good as knowing who's actually new.
https://t.co/a2f7rfwysX
An MPP server usually doesn't know which agent is paying it.
So our wrapper records the 402 challenge and the receipt, and you add the agent if you know it. Leave it out and the payment is still recorded, as unattributed.
https://t.co/efoQPXo3Sc
Don't reformat a credential before attaching it to a payment event.
The digest will still match the new bytes. The credential's own signature won't verify, and the item becomes invalid.
Pass AP2 mandates and Verifiable Intent chains exactly as received.
https://t.co/SbwNcdKWRe
A payee scored 0.91 on a 0.88 threshold. Here's the review: as received beside the list entry, then a decision recorded against the list version.
Our console with example data, animated. Developer preview.
https://t.co/dqyohLcF3i
POST /v1/events answers 202 even when some items are rejected. So read each result.
accepted: stored, with a chain_seq.
duplicate: that id is already stored, which is why retries are safe.
rejected: fix it. Don't retry it unchanged.
https://t.co/dVWj5AS7Ev
40 payments to one payee in six minutes should be one alert, not 40.
HalvorAI keeps one open alert per agent, detector and time window. Later matching events join it, so a burst doesn't bury your analyst.
https://t.co/2RBTjTiP7D
Agent spending on a Stripe Issuing card? Give each agent its own card, tagged with the agent's id and name, and its payments are attributed to it.
Untagged payments are still recorded, as unattributed. They lower attribution coverage but aren't lost.
https://t.co/TSvT3axjcq
Building on our API? Within /v1, changes are additive: new endpoints, new optional fields, new enum values.
So ignore fields you don't recognize and handle enum values you haven't seen. Breaking changes ship under a new path, never in place.
https://t.co/t3uaLxAq0W
A batch of 100 events costs 100 against our ingest limit, not 1.
Ingest allows 1,000 events/s per organization; other routes, 20 requests/s. Past either: 429 rate_limited with Retry-After in seconds. Our SDKs back off and retry for you.
https://t.co/t3uaLxAq0W
In Visa's September survey, 72% of U.S. consumers had used an AI assistant. Only 23% trusted AI to handle payments for them.
Our read: that gap closes with records people can check, not with promises.
https://t.co/ggZYoRwJOc
Deliveries can repeat and arrive out of order. Make the handler idempotent on the ids and fetch current state rather than trusting the order. https://t.co/MVWo9ZBk5E