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/state with your admin_key.