---
api: 'Merchant API'
---

# Create a payment intent

Create a payment intent to push a payment request to a specific Revolut Terminal device.

This endpoint is used in push payments to Revolut Terminal integration, where a POS system sends payment requests to physical terminal devices. The terminal must be in Pay at Counter mode and assigned to the same location as the order.

**Requirements:**
- Order must be created with `channel: "pos"` and include a `location_id`
- Terminal must be online, in `pos` operation mode, and assigned to the same location
- Amount must match the order amount

**What happens next:**
- The payment request appears on the Revolut Terminal screen
- Customer presents their card or device to complete payment
- You should poll the payment intent status until it reaches a final state (`completed`, `cancelled`, or `failed`)
- When the payment intent reaches `completed` state, use the returned `payment_id` to retrieve the final payment status

:::info
For the complete push payments flow, see: [Push payments to Revolut Terminal](/docs/guides/merchant/accept-payments/in-person-payments/terminal/push-payments).
:::

## Endpoint

POST `/api/orders/{order_id}/payment-intents`

## Request body

### Attributes

- `amount` (integer)
    The payment amount expressed in minor currency units, according to the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217). For example, `7034` in `EUR` corresponds to €70.34.
    
    :::info
    Conversion between major and minor units varies by currency. For instance, `100` minor units equal £1.00 in `GBP`, whereas in `ISK` they represent 100 units. For more details, see the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217).
    :::
- `terminal_id` (string)
    The unique identifier of the terminal.

## Returns

### 201

Payment intent created

#### Response attributes

- `id` (string)
    The unique identifier of the payment intent.
- `state` (enum)
    The current state of the payment intent.
    
    | State | Description |
    |-------|-------------|
    | `pending` | Payment intent created and sent to terminal, customer has not yet started interacting |
    | `processing` | Customer is actively interacting with the terminal (e.g., inserting card, entering PIN) |
    | `completed` | Payment authorization is complete, includes a `payment_id` in the response |
    | `cancelled` | Payment intent was cancelled (by system or customer) |
    | `failed` | Payment intent failed due to technical issues (timeout, terminal unavailable, network error) |
    Possible enum values:

    - `pending`
    - `processing`
    - `completed`
    - `cancelled`
    - `failed`
- `terminal_id` (string)
    The unique identifier of the terminal.
- `order_id` (string)
    Permanent order ID used to retrieve, capture, cancel, or refund an order after authorization.
- `payment_id` (string, optional)
    The ID of the payment.
- `amount` (integer)
    The payment amount expressed in minor currency units, according to the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217). For example, `7034` in `EUR` corresponds to €70.34.
    
    :::info
    Conversion between major and minor units varies by currency. For instance, `100` minor units equal £1.00 in `GBP`, whereas in `ISK` they represent 100 units. For more details, see the [ISO 4217 standard](https://en.wikipedia.org/wiki/ISO_4217).
    :::
- `currency` (string)
    [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code in upper case.
    
    :::info
    For more information about the supported currencies, see: [Help Center](https://help.revolut.com/business/help/merchant-accounts/payments/in-which-currencies-can-i-accept-payments/).
    :::
- `created_at` (string)
    The date and time the payment intent was created.
- `updated_at` (string)
    The date and time the payment intent was last updated.

## Error responses

| HTTP status code | Description |
| --- | --- |
| 400 | Bad Request |
| 401 | Unauthorized |
| 404 | Not Found |
