Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.algovoi.co.uk/llms.txt

Use this file to discover all available pages before exploring further.

Agentic Payment Mandates (APM) let an AI agent pay for AlgoVoi-gated resources autonomously, without ever touching crypto. A human authorises a GBP spending limit once, receives a signed JWT mandate token, pastes it into the agent’s environment, and the agent can transact across all 8 supported chains. AlgoVoi pays merchants from its hot wallet and bills the human via their prepaid balance.
APMMPP subscriptionsRecurr
Who fundsHuman, in fiat (GBP via PayPal)Human, in crypto (wallet-funded)Human, in crypto (each invoice)
Who pays merchantsAlgoVoi (from custodial wallet)Customer’s wallet, pulled by AlgoVoiCustomer, manually
Agent setupPaste JWT into env / system promptAuthority tx via wallet at signupN/A (not for agents)
Per-tx wallet popupNoneNoneNone
Best forAgents that need to spend fiat-funded budgetsSubscriptions priced in cryptoHuman customers, periodic invoices

Customer portal — recurr.algovoi.co.uk/mandate

End-users (the humans authorising the mandate) self-serve at: https://recurr.algovoi.co.uk/mandate The page accepts a mandate ID (UUID) and shows:
  • Current balance and currency (GBP pence resolution)
  • Status (active / suspended / revoked)
  • The mandate JWT (copyable — paste into your agent’s env)
  • Last 10 charges (amount, chain, tx id, timestamp)
  • Top up via PayPal button (initiates PayPal Orders v2 flow, captures on return)
Direct link with a mandate pre-loaded:
https://recurr.algovoi.co.uk/mandate?id=<MANDATE_UUID>
The page identifies the mandate by ID alone — no separate login. Treat the mandate ID like an access link: anyone who has it can view balance, JWT, and top it up (but cannot revoke or change limits). Operators retain admin control via the internal API.

How it works

[1] Operator registers human as a mandate account holder
[2] Operator issues a mandate (cap, period, merchant whitelist) → returns JWT
[3] Human tops up balance via PayPal (or operator credits via SQL/API)
[4] Human pastes the JWT into their agent's env vars / system prompt
[5] Agent calls POST /mandate/pay with the JWT for each resource purchase
[6] AlgoVoi: decrements balance → pays merchant on-chain → returns access token
[7] Agent uses access token to retrieve the gated resource
Settlement happens on whichever chain the merchant has configured for that resource. The agent never sees the chain detail; it only sees GBP pence.

Token format

The mandate token is a stateless JWT, signed with a separate MANDATE_JWT_SECRET (key-separated from the gateway’s session JWTs). Format:
{
  "jti": "<mandate-row-uuid>",
  "sub": "<account-uuid>",
  "typ_claim": "mandate_v1",
  "iat": 1778775645,
  "exp": 1778779245
}
  • jti — UUID stored on the mandates row (pre-allocated at issue time, primary index for fast revocation lookup)
  • sub — the mandate_accounts.id of the human who owns it
  • typ_claim — token type marker; the verifier rejects anything other than mandate_v1
  • exp — optional expiry; if omitted, the token is non-expiring (caps + balance still enforce limits)
Tokens are HS256-signed; no asymmetric keys to manage. Treat them like a prepaid debit card number — whoever holds the token can spend up to the balance against whitelisted merchants. Use mandate expiry (ttl_secs at issue time) and merchant whitelist as primary mitigations.

Spending the mandate — agent integration

The agent calls a single endpoint:
curl -X POST https://api.algovoi.co.uk/mandate/pay \
  -H "Authorization: Bearer $ALGOVOI_MANDATE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tenant_id": "96eb0225-dd47-4bc3-be10-143d6e6d7bd1",
    "resource_id": "a52aa0a9-db9a-4212-85f3-e91647c399b9",
    "max_amount_minor": 200,
    "description": "Research API call"
  }'
Response (200):
{
  "charge_id": "1d8e3...",
  "amount_minor": 80,
  "currency": "GBP",
  "tx_id": "ALGO_TX_ID_HERE",
  "chain": "algorand_mainnet",
  "remaining_balance_minor": 1420,
  "access_token": "eyJhbGciOiJI..."
}
The access_token is the same short-lived JWT that the resource endpoint accepts — the agent then calls the resource with Authorization: Bearer <access_token>.

Per-call guards

  • max_amount_minor — agent self-cap. If the resolved resource costs more than this, the call returns 402 and no charge occurs.
  • Mandate balance — if amount_minor > balance_minor, returns 402.
  • Period cap (daily/weekly/monthly) — if this charge would push period_spent_minor over the cap, returns 402.
  • Merchant whitelist — if merchant_whitelist is non-null and tenant_id is not in it, returns 403.

Response codes

CodeMeaning
200Charge settled. tx_id is the on-chain settlement; access_token unlocks the resource.
401Token invalid, expired, or revoked.
402Balance/cap/agent-self-cap exceeded.
403Merchant not in mandate whitelist.
404Resource not found.
502On-chain payout failed — agent should retry with idempotency.

Operator workflow — internal API

All admin operations are at /internal/* and require the admin bearer token.

1. Register a human account holder

curl -X POST https://api.algovoi.co.uk/internal/mandate-accounts/register \
  -H "Authorization: Bearer $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "agent-owner@example.com",
    "display_name": "Acme Co — research bot"
  }'
Returns { id, email, status, created_at }. Save the id — needed for issuance.

2. Issue a mandate

curl -X POST https://api.algovoi.co.uk/internal/mandates \
  -H "Authorization: Bearer $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": "<ACCOUNT_UUID>",
    "display_name": "Acme research bot — Q2 budget",
    "period": "monthly",
    "period_cap_minor": 10000,
    "ttl_secs": 2592000,
    "merchant_whitelist": ["96eb0225-..."]
  }'
Returns the mandate_id, the JWT token (this is the only time it is returned — store it now or have the user load recurr.algovoi.co.uk/mandate?id=<mandate_id> to retrieve it), balance_minor, currency, period, status.

3. Top up balance

Two paths: Via PayPal (customer self-serve) — direct the user to recurr.algovoi.co.uk/mandate?id=<mandate_id>. They click “Top up”, complete PayPal checkout, balance credited on capture. Via admin API (operator-credited) — for invoiced enterprise accounts:
curl -X POST https://api.algovoi.co.uk/internal/mandates/<MANDATE_ID>/topup \
  -H "Authorization: Bearer $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "amount_minor": 50000 }'

4. List, view charges, revoke

# List all mandates for an account
curl -H "Authorization: Bearer $ADMIN_API_KEY" \
  "https://api.algovoi.co.uk/internal/mandates?account_id=<ACCOUNT_UUID>"

# View charges
curl -H "Authorization: Bearer $ADMIN_API_KEY" \
  "https://api.algovoi.co.uk/internal/mandates/<MANDATE_ID>/charges"

# Revoke (idempotent — JWT immediately invalidated)
curl -X DELETE -H "Authorization: Bearer $ADMIN_API_KEY" \
  "https://api.algovoi.co.uk/internal/mandates/<MANDATE_ID>"

Period semantics

The period field controls the rolling spending cap:
periodBehaviour
dailyperiod_spent_minor resets every 24h from period_reset_at
weeklyResets every 7 days
monthlyResets every 30 days
unlimitedNo period cap; only balance_minor and merchant whitelist limit spending
Reset is lazyperiod_spent_minor is rolled forward on the next POST /mandate/pay after the boundary, not on a cron. Analytics queries that read period_spent_minor directly may see stale values between the boundary and the next charge.

Custody

APM is the only AlgoVoi product where AlgoVoi takes custody of funds. This is the deliberate trade-off that makes agent-native fiat spending possible — agents cannot hold private keys or fiat accounts, so a regulated custodian has to stand in.

Where the money sits at each stage

[1] PayPal top-up        →  Funds settle from PayPal to AlgoVoi's UK business
                            bank account (segregated client-money account, not
                            AlgoVoi operating capital).
[2] balance_minor row    →  Postgres column on the mandate.  Source of truth
                            for "how much the user has left to spend."
[3] Agent calls /pay     →  balance_minor decremented within a single transaction
                            that also writes the mandate_charges ledger row.
[4] Merchant payout      →  AlgoVoi's custodial hot wallet on the target chain
                            sends the equivalent crypto amount to the merchant's
                            configured payout address.  On-chain settlement is
                            final — there is no reversal once tx_id confirms.
[5] Treasury rebalance   →  Off-cycle, AlgoVoi sells GBP → stablecoin to keep
                            the hot wallet floats topped up.  Users do not see
                            this; the user-visible flow is GBP in, GBP out.

Custody model vs the other AlgoVoi products

RecurrMPP subscriptionsAPM (Mandates)
Customer funds custodyCustomerCustomerAlgoVoi
Merchant payout custodyCustomer’s walletCustomer’s wallet (pulled)AlgoVoi’s custodial hot wallet
Maximum AlgoVoi exposureNoneNoneSum of all balance_minor
Failure-mode for the userPay one invoice manuallyAuthority tx already on chainCustodied balance at risk if AlgoVoi insolvent
Regulatory perimeterPayment-processor onlyPayment-processor onlyE-money / safeguarding regime

Safeguarding

The fiat-balance custody puts APM in a different regulatory bucket from the rest of the platform:
  • UK: holding pre-paid customer balances triggers EMR 2011 safeguarding obligations under regulations 20-21 (the funds-received and segregation rules), with PSR 2017 reg 23 covering any non-e-money payment-transaction funds (via EMR 20(6)). This is the EMR/PSR regime — NOT the CASS 7 client-money regime which governs investment business. AlgoVoi is in the process of obtaining the relevant authorisation (status: in preparation — see Compliance).
  • EU: equivalent treatment under PSD2 / EMD2 if offering APM cross-border to EU residents.
  • US: state money-transmitter licensing if APM is offered to US residents; not currently available in the US.
Until full authorisation lands, APM operates on a closed-beta posture with three hard caps enforced in code:
  • Per-mandate balance cap (default £100): enforced at issuance, admin top-up, PayPal initiate, and PayPal capture — every code path that increases balance_minor. Config: MANDATE_MAX_BALANCE_MINOR.
  • Per-account aggregate balance cap (default £300): sum of balance_minor across all active mandates owned by the same human; same enforcement points. Config: MANDATE_MAX_ACCOUNT_BALANCE_MINOR.
  • Per-account mandate-count cap (default 3): enforced at issuance only — an account holding 3 active (non-revoked) mandates cannot issue a fourth. Config: MANDATE_MAX_PER_ACCOUNT.
The three caps compose so total custodial exposure per human is strictly bounded to £300 (3 mandates × £100 each). Set any individual cap to 0 to disable that check once authorisation is granted or a higher-trust account is whitelisted. Per EMR 2011 reg 21(2)(a), safeguarded funds must be segregated by the end of the fifth business day following the day on which the e-money was issued. AlgoVoi’s PayPal-capture flow credits balance_minor synchronously on the same business day funds settle to the safeguarding account.

Hot-wallet security

The custodial hot wallets that pay merchants on-chain are operationally separated from the customer balance accounting:
  • Hot wallet float per chain, not per user. The £15 mandate has no specific crypto reserved against it — the wallet holds enough liquidity in aggregate to settle expected daily volume, with overnight cold-storage sweeps for the excess.
  • HSM-backed signing for high-value chains (Base, Algorand mainnet, Stellar); software signing with key-encryption-at-rest for testnets and low-value chains.
  • Rate limits at the facilitator prevent a compromised gateway from draining the float — per-chain daily cap and per-tx maximum.
  • No user keys held. APM never asks the user for, generates, or stores any private key on the user’s behalf. The user’s relationship with AlgoVoi is purely fiat-balance-based.

Evidence the FCA will look for

Safeguarding readiness is not a one-off setup — the FCA expects ongoing controls evidence. The minimum documented set for APM:
  1. Designated safeguarding account at the bank with a letter from the bank confirming designation per EMR 21(3)(a). Internal labelling is not sufficient; the account name or accompanying bank letter must make the safeguarding purpose obvious.
  2. Chain-by-chain reconciliation from the mandate ledger (balance_minor aggregated) through mandate_charges.tx_id to the on-chain wallet balance — performed and recorded daily, with discrepancies investigated within one business day.
  3. Key-management governance — who can sign, signing thresholds (m-of-n for HSM-protected wallets), key rotation cadence, incident response.
  4. Sweep and float-management policy — when excess float moves to cold storage, who authorises, how reconciliations follow the funds.
  5. Wind-down plan showing how every active mandate would be made whole if AlgoVoi ceased operations or the wallet stack failed (refund route, communication, timeline).
  6. Books and records per EMR 21(5) — ledger entries that identify each user’s safeguarded balance, retained per the FCA’s record-keeping rules.

What this means for users

The portal at recurr.algovoi.co.uk/mandate makes the trade-off explicit:
  • You don’t need a crypto wallet to use APM. That’s the value proposition.
  • You give up custody of your fiat balance during the period it sits with AlgoVoi.
  • Unspent balance is refundable on mandate closure (subject to identity verification) — EMR 2011 reg 39 redemption rights apply.
  • Spent balance is refundable for at-fault failures — if AlgoVoi delivers the wrong payout, the merchant doesn’t deliver the resource, or a double-charge occurs, you get a refund of the GBP amount from AlgoVoi’s reserves. The on-chain payout to the merchant cannot be reversed, but you the user are made whole. This is required under CRA 2015 fairness rules; “non-refundable once spent” as a blanket term is not enforceable in UK consumer law.
  • Choose your cap deliberately. A £100 mandate exposes £100 of custody risk; a £10 mandate exposes £10. For untrusted agents, start small.

What this means for operators

If you’re offering APM to your own customers (white-label via merchant_whitelist), you need to think about three things:
  1. Disclosure — your terms must tell the end-user that funds are custodied by AlgoVoi, not by you. Standard template clause available on request.
  2. Float planning — APM revenue lands in AlgoVoi’s account, not yours. Settlements to you happen on-chain when the agent buys your resources. Tax and accounting follow standard crypto-settlement rules for your jurisdiction.
  3. Refund routing — if your customer asks for a refund, you process it through your own payment rails (or via AlgoVoi if AlgoVoi is the merchant of record for the resource). The mandate balance does not flow back automatically — it’s already been spent on-chain.

Security model

RiskMitigation
JWT leaked from agent envMandate exp claim + revoke via DELETE /internal/mandates/{id} (instant)
Compromised agent over-spendsperiod_cap_minor caps loss per cycle; balance caps total loss
Wrong merchant gets paidmerchant_whitelist UUIDs — 403 if tenant_id not in list
Replay / double-chargepg_advisory_xact_lock(hashtext(jti)) + SELECT FOR UPDATE on every call
Token forgeryHS256 signed with MANDATE_JWT_SECRET (≥32 chars, key-separated from session JWTs)
Custodial hot wallet compromiseHSM signing on high-value chains; per-chain daily cap; off-cycle cold sweeps
AlgoVoi insolvencyEMR 2011 reg 21 segregation; bank-designation evidence; in-preparation FCA authorisation; 3-mandate × £100 per-account cap until authorised
At-fault failure (wrong settlement / undelivered resource)Operator-initiated refund via POST /internal/mandate-charges/{id}/refund — restores balance_minor from AlgoVoi reserves (CRA 2015)
Refund model:
  • Unspent balance — refundable on mandate closure subject to identity verification (EMR 2011 reg 39 redemption rights).
  • At-fault failures (wrong merchant settled, resource not delivered, double-charge) — refundable from AlgoVoi reserves via POST /internal/mandate-charges/{id}/refund. The on-chain payout to the merchant is irreversible, but AlgoVoi credits the user back in GBP and treasury reconciles. Required under CRA 2015 — blanket “non-refundable” terms are unenforceable.
  • Successful purchases where the customer changes their mind — no automatic refund (the merchant has been paid, the resource was delivered). The customer’s recourse is with the merchant.
Operators should set conservative period_cap_minor and ttl_secs for new accounts.

See also