Update, 2026-10-28: Pink Agentic AI Payments is now live in production as a decision layer: your agent asks Pink before each payment, and your own Stripe, card or bank pays only if Pink allows it. Pink never holds or moves your money. Anything below that says early access or test money describes the free public sandbox, which still runs on test money. Production pilot on your own tenant: $99/month, pinkwallet.com/agentic/pilot.
A $1,150 customs duty payment from an AI agent cleared automatically today in under a second, while a $3,200 payment to a brand-new supplier it had never paid before sat waiting for a named human, and a $2,500 payment to a known supplier got blocked outright because it had no matching purchase order.
Disclosure: I work on Pink Agentic AI Payments at PinkWallet.
Short answer: build an approved-payee list, give known vendors an auto-approve band under a set amount, and route anything new or unmatched to a human instead of blind-trusting the agent. Pink Agentic AI Payments checks every payment an AI agent requests against per-agent budgets and approval rules on the server, before it executes, so the "safely" part isn't a prompt instruction, it's a server-side rule an ops team writes once. Below is a real sandbox run, with the actual responses, connected over MCP.
The setup an ops team actually wants
"Let the agent pay vendors automatically" usually means three different things bundled together:
- A list of vendors the agent is even allowed to pay (an approved-payee list, not "any bank account the agent decides to use").
- A ceiling under which a known, approved vendor just gets paid, no human in the loop.
- A trapdoor for anything that doesn't fit that shape: a brand-new vendor, an amount over the ceiling, or a payment missing the paperwork it should have.
Below is a workspace built for a 120-person e-commerce company that ships all three.
Step 1: spin up a workspace with an approved-vendor list already in it
curl -s -X POST "https://agentic-sandbox.pinkwallet.com/v1/sandbox/workspaces?utm_source=devto&utm_medium=article&utm_campaign=autopay-vendors" \
-H 'content-type: application/json' \
-d '{"company":"Driftwood Goods","email":"dev@driftwood-goods.example","template":"ecommerce"}'
Real, trimmed response from today's run:
{
"workspace_id": "zus8sjzdue",
"name": "Driftwood Goods",
"template": "ecommerce",
"agents": [
{ "id": "a_proc", "name": "Procurement AI", "monthly_budget": 400000, "per_payment_cap": 60000 },
{ "id": "a_fin", "name": "Finance Ops AI", "monthly_budget": 120000, "per_payment_cap": 40000 }
],
"payees": ["p_foshan", "p_yiwu", "p_hk", "p_dhl", "p_ups", "p_duty", "p_klaviyo", "..."],
"rules": 30
}
19 payees ship pre-approved, each with a category (supplier, logistics, duty, saas, and so on), and some already carry a risk flag. One supplier in this template, Foshan Ceramics Co., ships with "risk_flags": ["payeeChanged"] because its bank details changed 3 days ago, which on its own routes any payment to that payee to a human rather than letting the amount decide.
Step 2: the auto-approve band for a known, small payment
Not every rule in this template needs a human. Customs duties under $3,000 to the approved duty payee clear on their own:
curl -s -X POST "https://agentic-sandbox.pinkwallet.com/v1/payments" -H "authorization: Bearer $FIN" \
-H 'content-type: application/json' -d '{"payee_id":"p_duty","amount":1150,"purpose":"import duty, October container"}'
Real response:
{
"decision": "allowed", "rule": "Customs duties and taxes up to $3,000: automatic",
"credential": { "type": "bank_transfer", "max_amount": 1150, "locked_to": "DHL Duties & Taxes",
"single_use": true, "transfer": { "rail": "ACH", "reference": "PWS-6E770BCF", "status": "submitted" } }
}
That credential is single-use and locked to this exact payee and amount; it's issued only after the rule matched, and it can't be reused for a different payee or a larger amount.
Step 3: a hold for a vendor the agent has never paid before
The same workspace's Procurement AI agent has its own rule for anything new:
curl -s -X POST "https://agentic-sandbox.pinkwallet.com/v1/payments" -H "authorization: Bearer $PROC" \
-H 'content-type: application/json' -d '{"payee_name":"Guangzhou Zipper Factory","amount":3200,"purpose":"first order, new zipper supplier"}'
Real response:
{
"decision": "pending_human", "rule": "New supplier: first payment up to $5,000, CFO approves",
"hold_id": "pay_0c1906fcba25", "who": "Wei Lim (CFO)", "approvers_needed": 1,
"expires_at": "2026-10-20T06:06:39.691Z"
}
A vendor that isn't on the approved list yet, even for a first order under the normal CFO band, waits for a named person. Approving that first payment doesn't add the vendor to the approved list by itself: the approved-payee list is something the company maintains, and only payees on it can match the auto-approve bands for known vendors.
Step 4: a block for a known vendor missing its paperwork
The same Procurement AI agent also carries a rule that any payment to an approved supplier without a matching purchase order gets blocked outright, not held, not asked:
curl -s -X POST "https://agentic-sandbox.pinkwallet.com/v1/payments" -H "authorization: Bearer $PROC" \
-H 'content-type: application/json' -d '{"payee_id":"p_yiwu","amount":2500,"purpose":"rush order, PO not issued yet"}'
Real response:
{ "decision": "blocked", "rule": "Supplier payment without a matching PO: blocked", "credential": null, "why": "matched · block" }
This is a good one to test against your own setup before you trust an auto-approve band blindly: in this template, that rule is checked ahead of the small-reorder auto-approve rule for this agent, so a known vendor with a missing PO gets blocked rather than quietly clearing under the small-amount band. Rule order matters as much as the rule itself.
Step 5: connect the agent over MCP or REST
MCP, no OAuth flow needed in the sandbox:
{
"mcpServers": {
"pink": {
"command": "npx",
"args": ["-y", "pink-agentic-payments-mcp"],
"env": { "PINK_AGENT_KEY": "pk_sandbox_agent_<your_key>" }
}
}
}
Or call the REST API directly, which is what every example above does. Python and n8n integrations exist too (pip install langchain-pink, and an n8n node), for teams that would rather wire this into an existing agent framework than write raw HTTP calls.
What to decide before turning this on
| Decision | Where it lives | What happens if you skip it |
|---|---|---|
| Which vendors the agent can pay at all | The approved-payee list | Any payee name the agent sends gets treated as new, routing almost everything to a human |
| The ceiling for auto-approve on known vendors | A rule with an amount.max and action: allow
|
Every payment, even a $20 recurring charge, needs a human |
| What counts as "new" or "risky" enough to hold |
payee: "new" rules, and risk flags like a recently changed bank detail |
A compromised or swapped payee account gets paid without anyone noticing |
| What paperwork a payment needs before it clears |
requires fields like a purchase order match |
An agent can pay an approved vendor for something nobody ordered |
Honest limits of this sandbox
This is test money against a sandbox at agentic-sandbox.pinkwallet.com, not production; production with real money is early access right now. The engine checks the conditions you write into a rule, like amount, payee, category, and whether a flag like a purchase order was attached; it does not independently verify that a stated PO number is real, only that one was or wasn't provided. And because rules are evaluated in order, first match wins, a broad rule placed above a narrower one will shadow it, which is exactly what happened with the blocked payment above.
FAQ
Can the agent still pay a vendor that's not on the approved list? Not without a rule for it. A payment to an unlisted payee name matches a payee: "new" rule if one exists; without one, the request has no rule to route through.
What does the agent get back when a payment is held, not blocked? A hold_id, the named approver (or group), and an expires_at. The agent can poll for the outcome; the credential only exists after a human approves.
Does connecting over MCP change which rules apply? No. MCP and REST hit the same server-side rule engine; the transport changes, the check doesn't.
Try it
Sandbox is free, no account required: agentic-sandbox.pinkwallet.com. Full API and rules reference: pinkwallet.com/agentic/developers. Security model: pinkwallet.com/agentic/developers/security-model. Production with real money is early access: join the waitlist.
Top comments (1)
The part that makes this actually work is the credential object in step 2: single-use, amount-locked, and payee-locked, issued only after the rule matched. Most agent-payment setups fail because the authorization is standing and reusable, so the exploit is never the rule, it's replaying the credential. The pending_human hold is the other piece teams get wrong: they route the exception to a queue instead of a named person with an expiry, and $3,200 to a new supplier on a first order is exactly where that discipline pays for itself. The blocked-without-PO rule is quietly the most important of the three; it catches the agent acting normally, not a novel attack. One question on the decision table: does the auto-approve band also key on payee history, or is amount the only threshold?