Quickstart
Sandbox live. Create a free sandbox workspace at agentic-sandbox.pinkwallet.com (test credentials only; no money moves). Production is not yet available.
Pink Agentic AI Payments (by PinkWallet, early access) is the approval layer between AI agents and company money: plain-language rules, per-agent budgets and human approvals decide each payment before a single-use card or bank transfer is issued.
Total time below, measured: under a minute of API calls once you have a sandbox key.
1. Create a workspace (the "coffee" template)
export PINK_BASE=https://agentic-sandbox.pinkwallet.com # public sandbox: live
curl -s -X POST "$PINK_BASE/v1/sandbox/workspaces" -H 'content-type: application/json' \
-d '{"company":"Bloom & Bean","email":"[email protected]","template":"coffee"}'
Real response (trimmed to what you need next — the full response also includes payees, rules: 11, slug, and a console URL):
{
"workspace_id": "o8fvsqi24z",
"admin_key": "pk_sandbox_admin_o8fvsqi24z_5809c2bf8398939d0864a7a8",
"agents": [
{ "id": "a_purch", "name": "Purchasing AI", "key": "pk_sandbox_agent_o8fvsqi24z_a_purch_09999513b4c710f8ec0b", "vault": "v_ops", "monthly_budget": 4000, "per_payment_cap": 500 },
{ "id": "a_inv", "name": "Inventory AI", "key": "pk_sandbox_agent_o8fvsqi24z_a_inv_...", "vault": "v_ops", "monthly_budget": 2500, "per_payment_cap": 300 },
{ "id": "a_mkt", "name": "Marketing AI", "key": "pk_sandbox_agent_o8fvsqi24z_a_mkt_...", "vault": "v_mkt", "monthly_budget": 3000, "per_payment_cap": 300 },
{ "id": "a_pay", "name": "Payroll & Bills AI", "key": "pk_sandbox_agent_o8fvsqi24z_a_pay_...", "vault": "v_pay", "monthly_budget": 32000, "per_payment_cap": 15000 }
],
"note": "Sandbox only. Credentials are test values; no money moves. Keys are shown once here and again in the console."
}
Save the Purchasing AI key — it's the agent we'll use below:
export PURCH=pk_sandbox_agent_o8fvsqi24z_a_purch_09999513b4c710f8ec0b
The coffee template ships with 4 agents, 11 rules, and 8 payees (suppliers, ads, payroll, utilities) already seeded — nothing else to configure before your first call.
2. Connect
Either header or path-based auth works, no OAuth:
curl -s -X POST "$PINK_BASE/mcp/$PURCH" \
-H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Real response (tool names only, shortened):
{"result":{"tools":[
{"name":"pink.get_budget"}, {"name":"pink.list_payees"}, {"name":"pink.list_rules"},
{"name":"pink.check_policy"}, {"name":"pink.request_payment"},
{"name":"pink.get_credential"}, {"name":"pink.report_receipt"}
]},"jsonrpc":"2.0","id":1}
Or use Authorization: Bearer $PURCH against POST $PINK_BASE/mcp instead of the key-in-path form — both were tested and both work (see Connect via MCP).
3. Three calls: allowed, asked, blocked
Allowed — a small supply order
curl -s -X POST "$PINK_BASE/mcp/$PURCH" \
-H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"pink.request_payment","arguments":{"payee_id":"p_cc","amount":420,"purpose":"20 kg espresso beans","idempotency_key":"qs-1"}}}'
Real result: "decision": "allowed", with a credential (type: "bank_transfer", rail ACH, locked_to: "Counter Culture Coffee") attached immediately — no human involved, because $420 is under the $500 rule for small supply orders.
Asked — a bigger order that needs the store manager
curl -s -X POST "$PINK_BASE/mcp/$PURCH" \
-H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"pink.request_payment","arguments":{"payee_id":"p_sysco","amount":890,"purpose":"weekly milk and syrups"}}}'
Real result: "decision": "pending_human", hold_id (= payment_id), who: "Luis Ortega (Store manager)", expires_at 30 minutes out. In your own agent, poll pink.get_credential(hold_id) until it resolves — see Agent integration patterns.
Blocked — a payee this workspace will never pay
curl -s -X POST "$PINK_BASE/mcp/$PURCH" \
-H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"pink.request_payment","arguments":{"payee_name":"giftcards.com","amount":50,"purpose":"prizes"}}}'
Real result: "decision": "blocked", credential: null, why: "matched · block", rule: "Never: gift cards, cash-like, crypto" — this rule is first in every template on purpose.
What you just proved
In 3 calls, the same amount of code produced 3 different outcomes based on the rules already in the workspace — no code change, no new integration, just different payees and amounts hitting different rules. That's the product's own one-liner in practice: "AI can work. Pink lets it spend safely."
Next
- Full tool/endpoint reference: Connect via MCP, Connect via REST.
- How to design around holds, idempotency, and receipts: Agent integration patterns.
- Try a bigger org: create a workspace with
"template":"startup"(6 agents, 17 rules, an API-credit circuit breaker) or"template":"ecommerce"(7 agents, 30 rules, multi-currency) instead of"coffee". - See every rule and every pending/past payment as the admin:
GET /v1/admin/statewith youradmin_key.






