> ## Documentation Index
> Fetch the complete documentation index at: https://developers.nova.money/llms.txt
> Use this file to discover all available pages before exploring further.

# Upsell API — Confirm One-Click Post-Purchase Offers

> POST /upsell confirms a one-click upsell offer using the saved payment method from the original order. No card details re-entry required.

The Upsell API lets you present a one-click post-purchase offer to customers immediately after a successful checkout. Because Nova.Pay reuses the payment method from the original order, the customer confirms the upsell with a single action — no re-entering card details required. The signed offer token (`offer`) is returned in the `POST /payments` response whenever the checkout page has an upsell configured and the payment succeeds.

<Tip>
  Only display the upsell UI if the `offer` field is present in your `POST /payments` response. When `offer` is absent, no upsell is available for that order.
</Tip>

***

## POST /upsell

<Note>
  This endpoint is **not** host-restricted — it can be called from any origin, making it safe to invoke directly from client-side code.
</Note>

Confirm an upsell offer using the saved payment method from the original order. Pass the `offer` SGID returned by `POST /payments` to charge the customer for the upsell product without requiring them to re-enter payment information.

**Base URL:** `https://pay.nova.money/api/v1`

### Request Body

<ParamField body="offer" type="string" required>
  The signed GlobalID (SGID) returned in the `offer` field of a successful `POST /payments` response. This token encodes the upsell offer details and authorizes the one-click charge.
</ParamField>

<ParamField body="meta" type="object">
  Optional key/value metadata to attach to the upsell order. Use this for attribution tracking, funnel identifiers, or any custom data your application needs.
</ParamField>

### Request Example

```json theme={null}
{
  "offer": "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJnbG9iYWxpZC9vZmZlciJ9fQ==",
  "meta": { "source": "upsell_banner" }
}
```

***

### Response — UpsellResult

<ResponseField name="order_status" type="string">
  Status of the upsell order after processing. Uses the same set of values as the Payments API:
  `pending`, `waiting_payment`, `partially_paid`, `paid`, `cancelled`, `partially_refunded`, `refunded`, `billed`.
</ResponseField>

<ResponseField name="payments" type="array of strings">
  Gateway-side payment IDs (e.g., Pagar.me charge IDs or Stripe PaymentIntent IDs) for the upsell charge(s).
</ResponseField>

<ResponseField name="bank_slip_url" type="string (uri)">
  URL to a bank slip (boleto) for the upsell order. Present only if the original order used bank slip as the payment method.
</ResponseField>

<ResponseField name="pix_qr_code" type="string">
  Base64-encoded Pix QR code image for the upsell charge. Present only if the original order used Pix.
</ResponseField>

<ResponseField name="pix_qr_code_url" type="string (uri)">
  URL to a hosted Pix QR code page for the upsell charge. Present only if the original order used Pix.
</ResponseField>

<ResponseField name="pix_expires_at" type="string (datetime)">
  ISO 8601 datetime after which the Pix QR code expires. Present only if the original order used Pix.
</ResponseField>

***

<Warning>
  The `offer` SGID is **single-use**. Once you call `POST /upsell` with a given token — regardless of the outcome — that token is invalidated and cannot be reused.
</Warning>


## Related topics

- [Offer One-Click Upsells After a Successful Checkout](/guides/upsell.md)
- [Nova.Pay Checkout Flow: Pages, Carts, and Charge Links](/concepts/checkout-flow.md)
- [Create and Process Your First Payment with Nova.Pay](/guides/create-payment.md)
- [Coupons API — Validate Discount Codes Before Checkout](/api-reference/coupons.md)
- [Customers API — Create and Update Customer Records](/api-reference/customers.md)
