# Payment intents

A payment intent is one attempt to collect an amount. Create it on your server, confirm it from the browser (via checkout) or the server.

## Create

`POST /api/v1/payment_intents` (secret key)

| Field | Notes |
| --- | --- |
| `amount` | Required, cents, before any card surcharge. |
| `description` | Shown on checkout and receipts. |
| `customer` | `cus_…`, required to save the card. |
| `metadata` | String key/values. |

Returns `id`, `client_secret`, `status: "requires_payment_method"`.

## Quote and confirm

Checkout does this for you. With your own flow:

- `POST /api/v1/payment_intents/:id/quote` `{client_secret, payment_method}` — price for that card (surcharge depends on credit vs debit). Publishable or secret key.
- `POST /api/v1/payment_intents/:id/confirm` `{client_secret, payment_method}` — charge.

Server-only confirm options (secret key):

| Field | Notes |
| --- | --- |
| `save_payment_method: true` | Keep the card on the intent's customer for later. You confirm the customer agreed. |
| `payment_method: "pm_<32 hex>"` | Charge a PayLynks saved card (see [saved cards](/docs/customers-and-saved-cards)). |
| `off_session: true` | Customer not present (recurring, merchant-initiated). |
| `expected_total` | Refuse to charge if pricing changed from what the payer was told. |

## Statuses

`requires_payment_method` → `processing` → `succeeded`, or back to `requires_payment_method` with `last_error` on a decline. After confirm the intent has `amount_total` (what was charged) and `fee_lines` (any surcharge or card price adjustment).

`GET /api/v1/payment_intents/:id` retrieves one.
