## pay

Send an instant transfer from your financial account to another business identified by a Stripe profile handle or network ID.

In an interactive terminal, you can omit the recipient, amount, and currency and enter them in the interactive form. With `--agent` or `--json`, you must provide all three arguments.

The command lists your eligible open financial accounts. If one account is eligible, the command selects it automatically. If multiple accounts are eligible, interactive sessions show a selector.
Agent and scripted runs should pass `--financial-account`.

For agent or scripted use:

1. Run `stripe whoami` to verify the active Stripe account. If authentication fails, ask the user to run `stripe login`.
2. Run `stripe pay @recipient 10.00 usd --agent` with the exact recipient, amount, and currency that the user requested. Include `--financial-account fa_...` if the user supplied a source financial account. Agent and JSON modes return a `confirmation_required` response before sending money.
3. Review the returned source financial account, recipient, amount, currency, fee, delivery timing, internal note, and memo with the user.
4. Only after the user confirms those details, rerun the same command with `--yes`. Explicitly pass `--financial-account` with the `financial_account` value from the review response, even if the review command selected it automatically. Preserve the exact recipient, amount, currency, and source financial account.

If the result has `status: approval_required`, follow the contract in the returned JSON:

- If the result includes `approval_url` and `next_step.command`, give the user the approval link and wait for them to approve or reject the request. After the user confirms approval, run the exact command in `next_step.command`. Don't change its recipient, amount, currency, or financial account.
- If the result includes `approvals_dashboard_url` without `next_step`, tell the user that the request was submitted for review. Stripe sends the transfer automatically after approval, so don't rerun the pay command or poll it.

A resume command checks approval once. If the request is still pending, return the approval link and wait instead of polling. Resumable approval requests expire after 5 minutes. If a request expires or is rejected, report that no transfer was sent and don't reuse its `--approval-id`. Only start a new transfer from the review step if the user explicitly asks to start over.

To verify the workflow without sending money, run `stripe pay @recipient 10.00 usd --financial-account fa_... --agent --dry-run`. Review the returned details with the user. If they want to complete the dry run, rerun the same command with `--agent --dry-run --yes`. The completed dry run resolves the profile, source financial account, recipient, transfer rail, and confirmation details, but doesn't create or send the transfer.

Supported currencies are `usd`, `gbp`, and `usdc`.

**Command:** `stripe pay [recipient] [amount] [currency]`

### Arguments

- `[recipient]`
  Destination Stripe profile handle, such as `@recipient`, or profile network ID, such as `profile_...`. Optional in an interactive terminal and required with `--agent` or
          `--json`.

- `[amount]`
  Positive decimal amount in major units, for example `10.00`. Optional in an interactive terminal and required with `--agent` or `--json`. Precision is currency-specific.

- `[currency]`
  Currency code to transfer. Supported values are `usd`, `gbp`, and `usdc`. Optional in an interactive terminal and required with `--agent` or `--json`.

### Flags

- `--internal-note, -n <note>`
  Optional internal note that isn't shown to the recipient. Must contain only ASCII characters and be 50 characters or fewer.

- `--memo, -m <memo>`
  Optional recipient-facing memo. Must contain only ASCII characters and be 22 characters or fewer.

- `--financial-account <financial-account>`
  Source financial account ID, such as `fa_...`. The account must be open, eligible for network transfers, and support the selected currency.

- `--yes, -y`
  Confirm the transfer without an interactive prompt. Review the transfer details before using this option.

- `--agent, --json`
  Use non-interactive, machine-readable JSON output. Without `--yes`, the command returns `confirmation_required` and doesn't send money.

- `--dry-run`
  Validate and review the transfer without creating a profile, recipient, approval request, or outbound payment.

- `--approval-id <approval-request>`
  Resume a previously approved request. Use the exact command returned in `next_step.command`; the recipient, amount, currency, and financial account must match the approval.

- `--create-profile-if-missing`
  Create a Stripe profile if the authenticated account doesn't have one. Requires `--profile-handle`, `--profile-display-name`, and `--profile-email`.

- `--profile-handle <handle>`
  Stripe profile handle to create with `--create-profile-if-missing`.

- `--profile-display-name <display-name>`
  Display name for the Stripe profile created with `--create-profile-if-missing`.

- `--profile-email <email>`
  Email address for the Stripe profile created with `--create-profile-if-missing`.

### Examples

**Enter transfer details interactively**

```sh
stripe pay
```

**Send a transfer to a Stripe profile handle**

```sh
stripe pay @profile-username 10.00 usd
```

**Send a transfer using a profile network ID**

```sh
stripe pay profile_... 10.00 usd
```

**Review a transfer without sending money**

```sh
stripe pay @profile-username 10.00 usd \
  --financial-account fa_... \
  --internal-note "Invoice 1234" \
  --memo "PROFILE PAY" \
  --dry-run
```

**Review a transfer as JSON**

```sh
stripe pay @profile-username 10.00 usd \
  --financial-account fa_... \
  --agent
```
