---
title: "Spend from a passkey-owned Safe under an active grant"
method: POST
path: "/v1/agents/{agent_id}/passkey-safes/{safe_id}/spend"
tags: ["Key Custody"]
---

# Spend from a passkey-owned Safe under an active grant

`POST /v1/agents/{agent_id}/passkey-safes/{safe_id}/spend`

## Request

- Base URL: `https://api.1claw.co`
- URL: `https://api.1claw.co/v1/agents/{agent_id}/passkey-safes/{safe_id}/spend`
- Auth: HTTP bearer

Agent credential only. Runs the agent's guardrails (chains, allowlists, caps,
daily limits, approval policy) and the sanctions screen, reads the module's
current allowance and nonce, signs the Allowance Module transfer hash with the
agent's Ethereum signing key, and relays `executeAllowanceTransfer` from the
Safe owner's Ethereum treasury wallet. Above the on-chain remaining allowance
the request is refused before any gas is spent; the module would refuse it
anyway. Counts as one signature. Audited as `passkey_safe.allowance_spent`.

## Request body

- object
  - `to` string, required
  - `amount` string, required: Base units, decimal string.
  - `token` string: ERC-20 contract; omit for the native token.

## Response `200`

Broadcast

- object
  - `grant_id` string, uuid
  - `safe_address` string
  - `chain` string
  - `to` string
  - `amount` string
  - `token_address` string
  - `remaining_after` string: Allowance left in this period after this transfer.
  - `nonce` integer: The module's delegate nonce used.
  - `tx_hash` string
  - `status` string

## Other responses

- `400`: Invalid request
- `401`: Authentication required or invalid
- `402`: x402 payment required
- `403`: Insufficient permissions
- `404`: Resource not found
- `409`: Resource already exists or conflict

---

[API](https://skmtc.dev/1claw/apis/1claw-api.md) · [All operations](https://skmtc.dev/1claw/apis/1claw-api/llms.txt) · [OpenAPI document](https://skmtc.dev/1claw/apis/1claw-api/revisions/5fa0918f3b41?raw)
