PinkwalletAGENTIC AI PAYMENTS · SANDBOX
Open console
Sandbox · no real money

Let your AI agent ask before it pays.

Pink sits between an AI agent and a company's money. The agent asks "may I pay this?"; the company's rules answer in under a second: allow ask a person block. This sandbox is a full copy of that engine with test credentials, so any MCP-capable agent can try it in minutes.

1 · Create a sandbox workspace

Pick a company template. You get an admin key for the approvals console and one key per AI agent.

2 · Connect an agent

Every agent gets its own key. Put it in the URL, or send it as a Bearer token. Same server, either way.

MCP endpoint (Streamable HTTP)
https://agentic-sandbox.pinkwallet.com/mcp/<agent_key>

or:  https://agentic-sandbox.pinkwallet.com/mcp
     Authorization: Bearer <agent_key>

Tools the agent receives: pink.get_budget pink.list_payees pink.list_rules pink.check_policy pink.request_payment pink.get_credential pink.report_receipt

How a payment flows

The agent asks. pink.request_payment({ payee_id, amount, purpose, reason, evidence }). It never sees a card or a bank login, only the answer.
The policy decides. Circuit breakers first (registered key, agent not paused, monthly budget, company daily ceiling, vault balance), then the rules top to bottom. First match wins. Nothing matched means blocked.
Three outcomes. allowed returns a single-use credential locked to that payee and amount. pending_human returns a hold_id; a person approves in the console or on their phone and the agent polls pink.get_credential. blocked returns the reason and nothing else.
The agent files the receipt. pink.report_receipt closes the loop and raises the agent's trust score.

Connect from your favourite agent

Claude Code

claude mcp add --transport http pink \
  https://agentic-sandbox.pinkwallet.com/mcp/<agent_key>

Then ask Claude: "Check my budget with Pink, then buy 20 kg of beans from Counter Culture Coffee for $420."

Cursor · Windsurf · VS Code (mcp.json)

{ "mcpServers": { "pink": {
    "url": "https://agentic-sandbox.pinkwallet.com/mcp",
    "headers": { "Authorization": "Bearer <agent_key>" }
} } }

Claude.ai / Claude Desktop · ChatGPT (custom connector)

Add a custom connector / remote MCP server and paste the key-in-URL form: https://agentic-sandbox.pinkwallet.com/mcp/<agent_key>. No OAuth is needed in the sandbox.

OpenAI Agents SDK (Python)

from agents.mcp import MCPServerStreamableHttp
pink = MCPServerStreamableHttp(params={
  "url": "https://agentic-sandbox.pinkwallet.com/mcp",
  "headers": {"Authorization": "Bearer <agent_key>"}})

Anthropic Messages API (MCP connector)

"mcp_servers": [{ "type": "url", "name": "pink",
  "url": "https://agentic-sandbox.pinkwallet.com/mcp",
  "authorization_token": "<agent_key>" }]

Plain REST (any language)

curl -X POST https://agentic-sandbox.pinkwallet.com/v1/payments \
  -H "Authorization: Bearer <agent_key>" \
  -H "Content-Type: application/json" \
  -d '{"payee_id":"p_cc","amount":420,"purpose":"20 kg beans"}'

REST reference

MethodPathKeyWhat it does
POST/v1/sandbox/workspacesnoneCreate a workspace: {company, email, template} → admin key + agent keys
GET/v1/me · /v1/budget · /v1/payees · /v1/vaults · /v1/rulesagentWhat this agent is, may spend, may pay, and the rules that apply to it
POST/v1/payments/checkagentDry run: would_allow / would_ask / would_block with the full trace
POST/v1/paymentsagentRequest a payment. 201 allowed · 202 pending_human · 403 blocked. Send Idempotency-Key to make retries safe
GET/v1/payments/{id}agentPoll a hold; returns the credential once approved
POST/v1/payments/{id}/receiptagentFile the receipt
GET/v1/admin/stateadminEverything: agents, vaults, payees, rules, pending requests, transactions
POST/v1/admin/requests/{id}/approve · /declineadminDecide a pending request (the console uses this)
PUT/v1/admin/rulesadminReplace the policy: {rules:[…]}. Publishes a new version
PATCH/v1/admin/agents/{id}admin{status:"paused"|"active", monthly, perPay}
POST/v1/admin/reset-day · /v1/admin/resetadminZero today's spend · reset the workspace to its template

Payment request fields

payee_idId from the payee list. Omit and pass payee_name for a payee not on the list (the policy will usually stop and ask).
amount · currencyPositive number, USD by default. EUR, GBP, HKD, SGD, JPY are supported; rules can be currency-specific.
purpose · reasonWhat it is for, and why now. Both are shown to the person who approves.
evidenceFree-text references: PO number, invoice id, ticket, photos.
evidence_flagsStructured signals the rules react to: po sow ticket scan statement brief renewal dupInvoice payeeChanged repeatCustomer deposit. In production these come from connected systems (ERP, helpdesk, WMS); in the sandbox the agent states them.
local_hour0–23, for time-of-day rules. Defaults to the UTC hour.
idempotency_keyAny unique string per attempt. Repeating it returns the original decision instead of paying twice.

Sandbox credentials are test values (4111… cards, PWS- transfer references). No money moves. Workspaces are kept for 30 days of inactivity. Questions and early access: agentic@pinkwallet.com