v0.1 — Beta
Policy is on-chain. Spending policy is stored in the account's Solana PDA, not only in the MPPCash database. Updates take effect for subsequent transfers immediately, but the on-chain state is the authoritative source.

Policy templates by use case

Inference agent (MPP sessions)

An agent making high-frequency calls to an inference provider via MPP Session intent. The session cap bounds each individual session; the daily limit bounds total spend across all sessions.

json
{
  "max_single_transfer": 20,
  "max_daily_spend": 200,
  "categories": ["inference"],
  "require_memo": false,
  "paused": false
}

Micro-task payment agent

An agent paying sub-agents for small completed tasks. Payments should be small and frequent.

json
{
  "max_single_transfer": 50,
  "max_daily_spend": 500,
  "categories": ["agent-reward"],
  "require_memo": true,
  "paused": false
}

Vendor payment agent

An agent paying known vendors on a fixed allowlist. Higher per-transfer limit, strict counterparty control.

json
{
  "max_single_transfer": 2000,
  "max_daily_spend": 5000,
  "allowed_counterparties": [
    "9xTz4KqR8mYvPn3SdFgHj6WbCeAuLo1XkQi5NtZpMwV",
    "acct_03x1m7p9k2qrst4ab",
    "acct_04y2n8q0l3rsuv5cd"
  ],
  "require_memo": true,
  "paused": false
}

Multi-service data agent

An agent calling multiple MPP data providers via Charge intent. No allowlist needed — it pays a range of providers. Use categories to restrict spend type rather than specific counterparties.

json
{
  "max_single_transfer": 5,
  "max_daily_spend": 100,
  "categories": ["data", "search"],
  "require_memo": false,
  "escalation_threshold": 4,
  "paused": false
}

Revenue-collecting agent (incoming only)

An agent that only receives payments — it should never send. Pause outbound transfers completely.

json
{
  "max_single_transfer": 0,
  "max_daily_spend": 0,
  "paused": false
}

Setting limits to 0 blocks all outbound transfers without using the pause flag — the account can still receive USDC.

Updating policy

Policy updates are a full replacement. To change a single field without affecting others, read the current policy first:

typescript
const current = await client.policy.get(accountId);

await client.policy.update(accountId, {
  ...current,
  max_daily_spend: 3000, // only this field changes
});

Emergency pause

If you see anomalous spending, pause the account immediately:

bash
# Via API
curl -X PUT https://api.mppcash.xyz/v1/accounts/acct_01j8k4x9p2qrst7yz/policy \
  -H "Authorization: Bearer $MPPPAL_API_KEY" \
  -d '{"paused": true}'

# Via CLI
mppcash policy pause --account acct_01j8k4x9p2qrst7yz

To resume after investigation:

bash
mppcash policy resume --account acct_01j8k4x9p2qrst7yz

Monitoring policy violations

Every rejected transfer fires a transfer.rejected webhook event. Set up an alert on this event — a spike in rejections means either an agent bug, a policy misconfiguration, or a security event.

See Setting Up Webhooks for alert configuration.