# ONVO Docs (English)
> Official documentation for integrating ONVO: payments, checkout, webhooks, authentication, testing, and API reference.
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
# Authentication
URL: https://docs.onvopay.com/en/authentication
Markdown: https://docs.onvopay.com/en/authentication.md
# Authentication
ONVO authenticates requests with API keys sent as Bearer tokens.
```http
Authorization: Bearer onvo_test_secret_key_...
```
## Where to get your API keys
API keys are available from the ONVO Dashboard at [onvopay.com](https://onvopay.com/) after you register an account. When the account is created, ONVO automatically generates test API keys so you can integrate and validate your flow in test mode.
After you complete onboarding, your account can switch to live mode from the Dashboard and obtain live API keys.
## Related API reference
- [API introduction](/en/api)
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
## Key types
| Key | Use |
| --- | --- |
| `onvo_test_secret_key_...` | Server-side code in test mode. |
| `onvo_live_secret_key_...` | Server-side code in live mode. |
| `onvo_test_publishable_key_...` | Client-side code in test mode. |
| `onvo_live_publishable_key_...` | Client-side code in live mode. |
:::warning
Never expose secret keys in browsers, public mobile apps, or repositories.
:::
## HTTPS
All requests must use HTTPS. Requests without authentication or over HTTP fail.
---
# One-time links
URL: https://docs.onvopay.com/en/checkout/one-time-links
Markdown: https://docs.onvopay.com/en/checkout/one-time-links.md
# One-time links
One-time links create a direct Checkout session for a fixed charge. Use them when you already know the final amount and want to send a payment URL to the buyer.
For donations, tips, or charges where the buyer chooses the amount, use [Customer chooses what to pay](/en/checkout/open-amount).
## Related API reference
- [Create a Checkout session](/en/api/crear-una-sesion-de-checkout)
- [List Checkout sessions](/en/api/listar-sesiones-de-checkout)
- [Expire a Checkout session](/en/api/expirar-una-sesion-de-checkout)
- [Create a coupon](/en/api/crear-un-cupon)
- [List coupons](/en/api/listar-cupones)
## Create a fixed amount session
The endpoint receives `lineItems`. Each item can use an existing `priceId` or create an inline product with `unitAmount`, `currency`, and `description`. Amounts are sent in the currency's minor unit.
```bash
curl https://api.onvopay.com/v1/checkout/sessions/one-time-link \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"lineItems": [
{
"quantity": 1,
"unitAmount": 250000,
"currency": "CRC",
"description": "Order #1001"
}
],
"customerEmail": "buyer@example.com",
"redirectUrl": "https://example.com/success",
"cancelUrl": "https://example.com/cancel",
"discounts": [
{
"coupon": "cpn_abc123"
}
],
"metadata": {
"orderId": "1001"
}
}'
```
The response includes `url`. Redirect the buyer to that URL or send it through the channel your sales flow uses.
## Marketplace
If the charge belongs to a seller in your marketplace, send `onBehalfOf` with that marketplace account's `Account ID` when creating the session. ONVO applies marketplace routing to the payment intent generated for that session.
## Coupons for one-time links
You can create coupons from the dashboard or from the API:
- In the dashboard, go to **Discounts** and create the coupon with the visual form. This works well for campaigns operated by commercial or support teams.
- In the API, create the coupon with `POST /v1/coupons`. This works well for campaigns generated by your backend, internal integrations, or bulk operations.
Both paths create the same `Coupon` object. To use it in a one-time link, keep the coupon `id` and send it in `discounts` when you create the Checkout session.
### Recommended flow
1. Create the coupon in the dashboard or with the API.
2. Configure its rules: discount type, redemption limit, expiration date, and eligible BINs.
3. Create the one-time link with `discounts: [{ "coupon": "cpn_..." }]`.
4. Checkout applies the discount during payment when the buyer's card matches an active BIN rule.
### Create a coupon with the API
This example creates a 10% coupon for cards whose BIN starts with `411111`.
```bash
curl https://api.onvopay.com/v1/coupons \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Sponsor Bank 10%",
"type": "percentage",
"percentOff": 10,
"scope": "checkout_session",
"appliesTo": ["one_time_links"],
"maxRedemptions": 100,
"redeemBy": "2026-06-30",
"binRules": [
{
"bin": "411111"
}
]
}'
```
The response includes the coupon `id`. Use that value in the link payload:
```json
{
"discounts": [
{
"coupon": "cpn_abc123"
}
]
}
```
### Main attributes
| Attribute | What it does |
| --- | --- |
| `name` | Internal name used to identify the coupon in the dashboard, reports, and Checkout responses. |
| `type` | Defines whether the discount is `percentage` or `fixed_amount`. |
| `percentOff` | Percentage discount when `type` is `percentage`. It must be greater than `0` and at most `100`. |
| `amountOff` | Fixed discount amount when `type` is `fixed_amount`. Send it in the currency's minor unit. |
| `currency` | Required currency for `fixed_amount` coupons. It must match the link currency. |
| `scope` | Coupon scope. For one-time links, use `checkout_session`. If omitted, ONVO uses that default. |
| `appliesTo` | Surfaces where the coupon can be used. For these links, include `one_time_links`. If omitted, ONVO uses that default. |
| `binRules` | Card BINs that make the discount eligible. |
| `maxRedemptions` | Total number of successful payments that can consume the coupon. Omit it for no limit. |
| `redeemBy` | Last date the coupon can be used. Send a full ISO date or `YYYY-MM-DD`; date-only values are normalized to Costa Rica midnight. |
| `isActive` | Enables or disables the coupon without deleting it. Defaults to `true`. |
| `promotionCodes` | Promotion codes associated with the coupon. In one-time links, these are used by your backend, not as a visible field where the buyer enters a code. |
### Discount types
Use `percentage` when you want to discount a percentage of the final amount:
```json
{
"type": "percentage",
"percentOff": 15
}
```
Use `fixed_amount` when you want to discount a specific amount:
```json
{
"type": "fixed_amount",
"amountOff": 250000,
"currency": "CRC"
}
```
Amounts are sent in the currency's minor unit. For example, `250000` in `CRC` represents `CRC 2,500.00`.
### BIN rules
One-time link discounts are applied by BIN. A BIN is the first digits of a card; ONVO accepts `6` to `8` digit rules. In the dashboard, the BIN field is a simple list: paste or type the eligible BINs and ONVO stores them as rules. In the API, that same list is sent as `binRules`, where each item has at least `bin`.
Send digits only, without spaces or hyphens. When the buyer enters or selects a card, Checkout checks whether the BIN matches an active rule on the coupon.
```json
{
"binRules": [
{
"bin": "411111"
},
{
"bin": "41111112"
}
]
}
```
If multiple eligible coupons match the BIN, ONVO applies the highest discount. If the discount amount ties, it uses the more specific BIN rule, meaning the one with more digits.
Real eligibility depends on `bin` and whether the rule is active.
Each rule can include `isActive`. This lets you pause a specific BIN without disabling the whole coupon. If you update a coupon through the API and send `binRules`, ONVO replaces the previous list with the list you sent, so include every rule you want to keep.
### Promotion codes
A coupon can have promotion codes attached:
```json
{
"promotionCodes": [
{
"code": "SUMMER25"
}
]
}
```
ONVO stores the code in uppercase. In the one-time link creation payload, `promotionCode` expects the promotion code object `id`, not the text code:
```json
{
"discounts": [
{
"promotionCode": "promo_abc123"
}
]
}
```
For new integrations, sending `coupon` directly is the simplest path. Use `promotionCode` when you already manage promotion codes as separate objects in your system.
If you update a coupon through the API and send `promotionCodes`, ONVO also replaces the previous list with the list you sent.
### Apply the coupon to the link
To create a discounted link, add `discounts` to the session payload. ONVO accepts one discount per session. That discount can point to a direct coupon or to a promotion code:
```json
{
"discounts": [
{
"coupon": "cpn_abc123"
}
]
}
```
Send `coupon` or `promotionCode`, but not both in the same object. The value must be the `id` of the coupon or promotion code.
The coupon must be active, belong to the same session mode (`test` or `live`), have `checkout_session` scope, and apply to `one_time_links`. If you use a fixed-amount coupon, the coupon currency must match the link currency.
For one-time links, do not use `allowPromotionCodes`: Checkout receives the specific discount from `discounts` and applies it during payment.
### Checklist
- The coupon and session must be in the same mode: `test` or `live`.
- The coupon must be active.
- For one-time links, use `scope: "checkout_session"` and `appliesTo: ["one_time_links"]`.
- For fixed-amount discounts, `currency` must match the link currency.
- Add at least one active BIN rule so Checkout can apply the discount to eligible cards.
- Copy the coupon `id` from the dashboard or from the `POST /v1/coupons` response.
---
# Customer chooses what to pay
URL: https://docs.onvopay.com/en/checkout/open-amount
Markdown: https://docs.onvopay.com/en/checkout/open-amount.md
# Customer chooses what to pay
Letting the customer choose what to pay does not require a third price type. In ONVO, a price still uses `type: "one_time"` or `type: "recurring"`; this experience is enabled with `customUnitAmount` on the price. For Checkout, use `type: "one_time"` when you want the buyer to choose an amount for a one-time payment.
This flow uses the same catalog model as a standard charge: create a product, create a price with `customUnitAmount` for that product, and create a Checkout session that references that price.
## When to use it
- Donations or voluntary contributions.
- Tips.
- Reservations or payments where the buyer defines the amount within a range.
- Forms where you want to suggest an initial amount but allow changes.
## 1. Create the product
Create the product that Checkout displays. The description and images help the buyer understand what they are paying for.
```bash
curl https://api.onvopay.com/v1/products \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Blue Foundation donation",
"description": "Voluntary contribution for the annual campaign",
"images": [
"https://example.com/donation.png"
]
}'
```
Save the product `id` so you can create the price.
## 2. Create the price
Create a `one_time` price with `customUnitAmount`. Values are sent in the currency's minor unit: cents for `USD` and centimos for `CRC`.
```bash
curl https://api.onvopay.com/v1/prices \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"currency": "CRC",
"type": "one_time",
"productId": "prod_abc123",
"customUnitAmount": {
"preset": 1000000,
"minimum": 500000,
"maximum": 5000000
}
}'
```
In this example, Checkout suggests `CRC 10,000.00`, allows the buyer to go down to `CRC 5,000.00`, and allows the buyer to go up to `CRC 50,000.00`.
Do not send `unitAmount` on this price. When a price uses `customUnitAmount`, ONVO stores the fixed amount as `0` and uses `preset`, `minimum`, and `maximum` for the Checkout experience.
## 3. Create the Checkout session
Create the session with the `priceId` for the price you just created. Use a single line item with `quantity: 1`.
```bash
curl https://api.onvopay.com/v1/checkout/sessions/one-time-link \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"lineItems": [
{
"priceId": "price_abc123",
"quantity": 1
}
],
"redirectUrl": "https://example.com/thanks",
"cancelUrl": "https://example.com/canceled",
"metadata": {
"campaignId": "donations-2026"
}
}'
```
The session does not receive `customUnitAmount` directly. Checkout reads that configuration from the associated price and shows the suggested amount, minimum, and maximum to the buyer.
ONVO Checkout saves the amount the buyer chooses before confirming the payment. The merchant does not need to call an additional endpoint to apply that amount to the session.
## Important rules
- Do not send `unitAmount` and `customUnitAmount` on the same price.
- Send either `productId` or `productData` when creating the price, but not both.
- `preset` is required and must be within `minimum` and `maximum` when you send those limits.
- For this experience, use a single line item with `quantity: 1`.
- Use `type: "one_time"` when the customer chooses what to pay in Checkout. `recurring` is still for recurring charges.
---
# Checkout
URL: https://docs.onvopay.com/en/checkout/overview
Markdown: https://docs.onvopay.com/en/checkout/overview.md
# Checkout
Checkout lets you create a payment experience hosted by ONVO so you do not need to build the entire payment form.
## Related API reference
- [Create a Checkout session](/en/api/crear-una-sesion-de-checkout)
- [List Checkout sessions](/en/api/listar-sesiones-de-checkout)
- [Expire a Checkout session](/en/api/expirar-una-sesion-de-checkout)
- [Checkout sessions](/en/api/sesiones-de-checkout)
## When to use Checkout
- You want to reach production quickly.
- You prefer to delegate payment UI and validation.
- You need a payment URL to send to the buyer.
- You want to let the [customer choose what to pay](/en/checkout/open-amount) for donations, tips, or variable charges.
## Base flow
1. Create a session or payment link.
2. Redirect the buyer to the Checkout URL.
3. Receive the result by webhook.
4. Update your order internally.
---
# AI Markdown
URL: https://docs.onvopay.com/en/developer-tools/ai-markdown
Markdown: https://docs.onvopay.com/en/developer-tools/ai-markdown.md
# AI Markdown
ONVO publishes Markdown versions so agents, editors, and assistants can read the documentation without processing HTML.
## Available files
| File | Use |
| --- | --- |
| [`/en/llms.txt`](https://docs.onvopay.com/en/llms.txt) | Short index with the main pages. |
| [`/en/llms-full.txt`](https://docs.onvopay.com/en/llms-full.txt) | Full documentation context. |
| [`/openapi.yaml`](https://docs.onvopay.com/openapi.yaml) | Source OpenAPI schema. |
| `/en/*.md` | Markdown version of each English page. |
## Example
```bash
curl https://docs.onvopay.com/en/llms.txt
curl https://docs.onvopay.com/en/llms-full.txt
curl https://docs.onvopay.com/openapi.yaml
```
Every page includes an action to copy its Markdown.
---
# Getting started
URL: https://docs.onvopay.com/en/getting-started
Markdown: https://docs.onvopay.com/en/getting-started.md
# Getting started
This guide summarizes the base ONVO integration flow.
## Related API reference
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Create a Checkout session](/en/api/crear-una-sesion-de-checkout)
## 1. Get your keys
Open the ONVO Dashboard and copy a test secret key and publishable key. Test keys do not interact with real banking networks.
```bash
export ONVO_SECRET_KEY="onvo_test_secret_key_..."
export ONVO_PUBLISHABLE_KEY="onvo_test_publishable_key_..."
```
## PCI and card data
To reduce PCI scope in card integrations, create the payment method client-side with the publishable key and send only the `paymentMethodId` to your backend. Do not pass PAN, CVV, or full card data through your server. If you prefer to delegate card collection to ONVO, use [Checkout](/en/checkout/overview) or the [web SDK](/en/integrations/sdk).
## 2. Create a payment intent
A payment intent represents the charge lifecycle for an order.
```bash
curl https://api.onvopay.com/v1/payment-intents \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 250000,
"currency": "CRC",
"description": "Order #1001"
}'
```
## 3. Confirm the payment
Confirm the intent with the buyer's payment method, or use Checkout if you want ONVO to host the payment experience.
## 4. Listen for webhooks
Register an endpoint to receive events like `payment-intent.succeeded` and reconcile your order internally.
## 5. Move to live mode
After the account is activated, switch to an `onvo_live_` key and repeat end-to-end testing before opening the flow to buyers.
---
# Magento Extension
URL: https://docs.onvopay.com/en/integrations/magento
Markdown: https://docs.onvopay.com/en/integrations/magento.md
# Magento Extension
ONVO provides an extension for Magento sites. Use it to enable ONVO Pay payments in your e-commerce site.
## Related API reference
- [Create a Checkout session](/en/api/crear-una-sesion-de-checkout)
- [Payment intents](/en/api/intenciones-de-pago)
- [Refunds](/en/api/reembolsos)
## Prerequisites
- Magento `2.4.3` or later.
- PHP `7.1` or later.
- Secret key and publishable key from the ONVO Dashboard.
## Install with Composer
From the console, go to the Magento project root and run:
```bash
composer require logeek-io/onvo-magento
```
## Install by directory
Download the plugin and upload it to:
```text
/app/code/ONVO/
```
## Activation
Run the Magento commands:
```bash
bin/magento setup:upgrade
bin/magento setup:di:compile
```
Then open `Stores -> Configuration -> Sales -> Payment Methods -> ONVO Pay` and configure:
- Secret key.
- Publishable key.
Use test or live keys depending on the mode you want to operate.
---
# Web SDK
URL: https://docs.onvopay.com/en/integrations/sdk
Markdown: https://docs.onvopay.com/en/integrations/sdk.md
# Web SDK
The ONVO web SDK lets you render a payment component on your site using a publishable key and a resource created from your server.
## Related API reference
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Create a subscription](/en/api/crear-un-cargo-recurrente)
- [Create a customer](/en/api/crear-un-cliente)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
## Installation
Include the SDK script.
```html
```
## Prerequisites
- Get your secret key and publishable key from the ONVO Dashboard.
- Create a payment intent or subscription from your server using the secret key.
- Pass the identifier to the frontend to render the SDK.
## One-time payment
Create the payment intent server-side.
```js
const { data, status } = await axios.post(
"https://api.onvopay.com/v1/payment-intents",
{
currency: "USD",
amount: 1000,
description: "my first payment intent",
},
{
headers: {
Authorization: "Bearer your_secret_key",
},
},
);
if (status === 201) {
console.log(data.id);
}
```
Render the component on the frontend.
```html
```
## Handling card errors
When card verification fails, `onError(data)` can include `details.card`. The object is optional, so use the top-level fields as a fallback:
```js
onError: (data) => {
const card = data?.details?.card;
if (!card) {
console.error(data.message);
return;
}
switch (card.reason) {
case "issuer_declined":
showCardMessage("Contact the issuer or use another card.");
break;
case "gateway_declined":
showCardMessage("The card could not be accepted.");
break;
default:
showCardMessage(data.message);
}
},
```
Use `reason` for general logic. `declineCode` is not part of a universal code namespace, and `declineMessage` is informational; do not parse it or depend on it for localization.
## Subscription
Create the subscription server-side.
```js
const { data, status } = await axios.post(
"https://api.onvopay.com/v1/subscriptions",
{
customerId: "cl40wvnby1653akslv93ktgdk",
paymentBehavior: "allow_incomplete",
items: [
{
priceId: "cl4ojmusz299201ldilvdfs8y",
quantity: 1,
},
],
},
{
headers: {
Authorization: "Bearer your_secret_key",
},
},
);
if (status === 201) {
console.log(data.id);
}
```
Render the SDK with `paymentType: "subscription"`.
```html
```
## Submit from an external button
Use `manualSubmit: true` to hide the form's internal button and call `submitPayment` from your own control.
```html
```
## Locale
You can send `locale: "es"` or `locale: "en"`. If you omit it, Spanish is the default.
---
# WordPress Plugin
URL: https://docs.onvopay.com/en/integrations/wordpress
Markdown: https://docs.onvopay.com/en/integrations/wordpress.md
# WordPress Plugin
ONVO provides a plugin for WordPress sites that use WooCommerce. Use it to enable ONVO Pay payments in your e-commerce site without building an API integration from scratch.
[View the WordPress plugin](https://wordpress.org/plugins/onvo-pay/)
## Related API reference
- [Create a Checkout session](/en/api/crear-una-sesion-de-checkout)
- [Payment intents](/en/api/intenciones-de-pago)
- [Refunds](/en/api/reembolsos)
## Prerequisites
- WordPress `4.0` or later.
- PHP `7.1` or later.
- WooCommerce installed.
- Secret key and publishable key from the ONVO Dashboard.
## Install from the dashboard
1. Go to `Plugins` and select `Add New Plugin`.
2. Search for `ONVO Pay`.
3. Install and activate the plugin.
4. In the ONVO Dashboard, copy your secret key and publishable key.
5. In WooCommerce, open `Payments` and select `ONVO Pay`.
6. Paste both keys into their corresponding fields.
7. Save the changes and start receiving payments.
## Direct server installation
1. Download the WordPress plugin.
2. Upload it to `/wp-content/plugins/`.
3. Activate the plugin from `Plugins`.
4. Configure the keys in WooCommerce under `Payments` and `ONVO Pay`.
5. Save the changes.
---
# Home
URL: https://docs.onvopay.com/en/
Markdown: https://docs.onvopay.com/en/index.md
# ONVO Documentation
Integrate payments with ONVO using clear guides, API examples, and AI-ready files.
ONVO exposes a REST API with JSON responses, test keys, and live mode. These docs are organized to help you move from a local integration to production with less friction.
## Quick paths
| I need to | Start here |
| --- | --- |
| Create my first integration | [Getting started](/en/getting-started) |
| Authenticate requests | [Authentication](/en/authentication) |
| Collect a payment | [Payment intents](/en/payments/payment-intents) |
| Use hosted Checkout | [Checkout](/en/checkout/overview) |
| Receive async events | [Webhooks](/en/webhooks) |
| Browse endpoints and schemas | [API reference](/en/api) |
## For developers and agents
Every page includes an action to copy its Markdown. We also publish:
- [`/en/llms.txt`](https://docs.onvopay.com/en/llms.txt): short AI index.
- [`/en/llms-full.txt`](https://docs.onvopay.com/en/llms-full.txt): full Markdown context.
## Environments
Use keys prefixed with `onvo_test_` for testing and `onvo_live_` for real transactions. The mode is determined by the key sent in the `Authorization` header.
```bash
curl https://api.onvopay.com/v1/payment-intents \
-H "Authorization: Bearer onvo_test_secret_key_..." \
-H "Content-Type: application/json"
```
---
# Credix
URL: https://docs.onvopay.com/en/payments/credix
Markdown: https://docs.onvopay.com/en/payments/credix.md
# Credix
Credix lets you collect a payment when the buyer uses their Credix card to pay in monthly installments or in full.
Unlike SINPE, Credix is a card authorization: the charge is processed at the moment you confirm the payment intent, with no transfers or redirect to an external system. The intent moves straight to `succeeded` once the authorization is approved.
This payment method is available by request only and supports `CRC` and `USD` payments. The available installment terms and minimum amounts depend on your merchant configuration.
:::info Enablement
Credix must be enabled for your account by the ONVO team, along with the per-term fee configuration. Request enablement before integrating.
:::
## Related API reference
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Webhooks](/en/webhooks)
## Before you start
- Request Credix enablement from the ONVO support team.
- Configure webhooks and listen for `payment-intent.succeeded`.
- Use `CRC` or `USD` as the payment intent currency.
- Keep in mind the per-term minimum amounts defined for your merchant account.
- Only Credix cards are accepted.
## Available installments
When you confirm the intent, you set the number of installments in `credixInstallmentMonths`:
- `1` — pay in full (a single charge with the Credix card, no financing).
- `3`, `6`, `10`, `12`, `18`, `24` — monthly installment plans.
The terms actually available depend on the fees your merchant account has configured in the dashboard and on the transaction amount. Each term can have a minimum amount, so not all of them are available for every amount.
## Flow
1. Create a payment intent for the exact amount to collect.
2. Create a payment method with `type: "credix"` and the Credix card details.
3. Confirm the intent with the `paymentMethodId` and `credixInstallmentMonths`.
4. Credix authorizes the payment immediately: the intent moves to `succeeded` if approved or to `failed` if declined.
5. Wait for the `payment-intent.succeeded` webhook before marking the payment as complete.
## Create the payment intent
```bash
curl https://api.onvopay.com/v1/payment-intents \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 500000,
"currency": "CRC",
"description": "Credix payment #1001"
}'
```
## Create the payment method
Provide the Credix card details inside the `credix` object.
```bash
curl https://api.onvopay.com/v1/payment-methods \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "credix",
"credix": {
"number": "4111111111111111",
"expMonth": 12,
"expYear": 2026,
"cvv": "123",
"holderName": "Maria Rodriguez"
},
"billing": {
"name": "Maria Rodriguez",
"email": "maria@example.com"
}
}'
```
## Confirm the intent
When confirming an intent with a Credix payment method, the `credixInstallmentMonths` field is **required**. Use `1` to pay in full or one of the installment terms your merchant account has configured in the dashboard.
```bash
curl https://api.onvopay.com/v1/payment-intents/$PAYMENT_INTENT_ID/confirm \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentMethodId": "cl502zv0d0127ebdp3zt27651",
"credixInstallmentMonths": 3
}'
```
The API validates the installments on confirmation:
- If you omit `credixInstallmentMonths`, it responds with the `payment_intents.credix_missing_installment_months` error (`400`).
- If you send a term that is not configured or enabled for your merchant account, or that does not meet that term's minimum amount, it responds with the `payment_intents.credix_fee_not_configured` error (`400`).
In that case, adjust the term (or the amount) according to the terms your merchant account has configured in the dashboard. Do not mark the payment as successful in your system until you receive `payment-intent.succeeded`.
## Checkout and SDK
If you collect through [Checkout](/en/checkout/overview) or the [SDK](/en/integrations/sdk), you do not need to implement this API flow. When Credix is enabled for your merchant account and the amount meets the minimums, it shows up automatically as a payment option and the buyer selects the installment plan within the payment interface. In that case, installment selection is handled in Checkout and you do not have to send `credixInstallmentMonths` manually.
Credix is not available for subscriptions or for unsupported currencies.
## Testing
In test mode, using `onvo_test_` keys, the numbers defined in [Credix test payment methods](/en/payments/testing#credix) simulate different authorization scenarios. You do not need to use a real Credix card.
Use those numbers to simulate approved and declined authorizations.
---
# Fraud Monitoring
URL: https://docs.onvopay.com/en/payments/fraud-monitoring
Markdown: https://docs.onvopay.com/en/payments/fraud-monitoring.md
# Fraud Monitoring
For 100% API integrations, we recommend adding the ONVO web library to collect browser signals from the buyer. These signals improve the accuracy of fraud prevention tools.
This implementation is optional, but highly recommended. It is not required for integrations that use plugins, payment links, or the embedded SDK, because those flows already include the necessary collection.
## Install the library
Include the script in the page `head`, preferably before other scripts.
```html
```
## Start the signal session
Initialize the library with your publishable key. When you have the `paymentIntentId`, and before confirming the payment, call `startSignalSession`.
```html
```
ONVO takes these signals into account during payment intent confirmation.
---
# Separate Authorization and Capture
URL: https://docs.onvopay.com/en/payments/manual-capture
Markdown: https://docs.onvopay.com/en/payments/manual-capture.md
# Separate Authorization and Capture
When you create a payment, you can authorize an amount and capture it later. This flow is useful when you need to reserve funds before completing the charge, for example in hotels, rentals, or orders that require final confirmation.
:::info
Manual capture is only available for card payments in 100% API integrations. It is not available for Checkout or the embedded payment SDK.
:::
## Related API reference
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Capture a payment intent](/en/api/capturar-una-intencion-de-pago)
- [Cancel a payment intent](/en/api/cancelar-una-intencion-de-pago)
## Create the intent
Set `captureMethod: "manual"` when creating the payment intent.
```json
{
"amount": 1000,
"currency": "USD",
"captureMethod": "manual"
}
```
Then confirm the intent with a card payment method.
If the authorization is approved, the intent moves to `requires_capture`. If it is declined, it returns to `requires_payment_method` and you can retry with another payment method.
## Capture funds
To capture the authorized amount, call the payment intent capture endpoint. By default, ONVO captures the full authorized amount.
To capture less than the original amount, send `amountToCapture`. A partial capture automatically releases the remaining amount.
```json
{
"amountToCapture": 750
}
```
If the capture succeeds, the intent moves to `succeeded`. If the capture fails, the intent moves to `requires_payment_method` and you need to start a new authorization.
## Cancel an authorization
If you need to release the funds before capturing them, cancel the payment intent. If the authorization expires before capture, ONVO releases the funds and the intent moves to `canceled`.
---
# Marketplaces
URL: https://docs.onvopay.com/en/payments/marketplaces
Markdown: https://docs.onvopay.com/en/payments/marketplaces.md
# Marketplaces
Marketplaces allow merchants that operate as intermediaries between buyers and sellers to process payments and settle funds to sellers automatically and securely.
## Authentication and isolation
Use a Secret API Key from the standard primary account that manages the marketplace:
```text
Authorization: Bearer
```
The key determines the primary account and the immutable `test` or `live` mode. Publishable API Keys are not allowed for these operations.
Every read and mutation validates the connected account ID together with the primary account, mode, and account type. A missing ID, an ID owned by another primary account, or an ID from another mode returns the same `404` error without revealing whether the resource exists.
Connected accounts do not receive their own API keys. To charge on behalf of the seller, keep using the primary account key and send the connected account ID in `onBehalfOf`.
## Create a connected account
You can create the account from the Marketplace section in the ONVO Dashboard or with [`POST /v1/connected-accounts`](/en/api/crear-una-cuenta-conectada).
```bash
curl https://api.onvopay.com/v1/connected-accounts \
-X POST \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-d '{
"businessName": "Connected Store",
"marketplaceAppFee": 5
}'
```
`businessName` is required, trimmed, and must contain 1 to 50 characters. `marketplaceAppFee` is an optional percentage from 0 through 100 with at most two decimal places. For example, `5` represents 5%. If you omit it, ONVO stores and returns `0`.
Creation returns HTTP `201`:
```json
{
"id": "cl502zv0d0127ebdp3zt27651",
"mode": "test",
"status": "pending_onboarding",
"businessName": "Connected Store",
"marketplaceAppFee": 5,
"createdAt": "2026-07-25T17:00:00.000Z",
"onboardingUrl": "https://onvopay.com/setup/account_onboarding_test_example"
}
```
`onboardingUrl` is returned only when creating the account or regenerating the link. Treat this value as sensitive: give it to the correct seller and do not write it to logs.
## List, retrieve, and update
List the accounts in the authenticated mode with [`GET /v1/connected-accounts`](/en/api/listar-cuentas-conectadas). `limit` accepts 1 through 100 and defaults to `10`. `startingAfter` and `endingBefore` are mutually exclusive, and the cursor must belong to the same primary account, mode, and filter.
You can filter by `pending_onboarding`, `awaiting_approval`, `active`, `inactive`, `temporally_suspended`, `permanently_suspended`, or `deleted`. The `restricted` value is not part of the Secret API Key contract.
```bash
curl "https://api.onvopay.com/v1/connected-accounts?status=pending_onboarding&limit=10" \
-H "Authorization: Bearer "
```
The list returns the same public object in the `{ data, meta }` envelope:
```json
{
"data": [
{
"id": "cl502zv0d0127ebdp3zt27651",
"mode": "test",
"status": "pending_onboarding",
"businessName": "Connected Store",
"marketplaceAppFee": 5,
"createdAt": "2026-07-25T17:00:00.000Z"
}
],
"meta": {
"total": 1,
"pages": 1,
"limit": 10,
"cursorNext": "cl502zv0d0127ebdp3zt27651",
"cursorBefore": "cl502zv0d0127ebdp3zt27651"
}
}
```
[`GET /v1/connected-accounts/{id}`](/en/api/obtener-una-cuenta-conectada) returns exactly the same public object. On legacy accounts without a business profile, `businessName` can be `null`; when marketplace fee settings are missing, `marketplaceAppFee` returns `0`.
Update `businessName`, `marketplaceAppFee`, or both with [`POST /v1/connected-accounts/{id}`](/en/api/actualizar-una-cuenta-conectada). You must send at least one:
```bash
curl https://api.onvopay.com/v1/connected-accounts/cl502zv0d0127ebdp3zt27651 \
-X POST \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-d '{
"businessName": "Updated Connected Store",
"marketplaceAppFee": 6.25
}'
```
This generic endpoint does not allow updates to status, onboarding, payout frequency, weekly fees, bank data, or processor configuration. List, retrieve, and update responses never include `onboardingUrl`.
## Configure a weekly fee
Create or update the fixed weekly fee with [`POST /v1/connected-accounts/{id}/weekly-fees`](/en/api/configurar-una-tarifa-semanal). Send at least one of `marketplaceWeeklyFeeEnabled`, `marketplaceWeeklyFeeAmount`, or `marketplaceWeeklyFeeCurrency`:
```bash
curl https://api.onvopay.com/v1/connected-accounts/cl502zv0d0127ebdp3zt27651/weekly-fees \
-X POST \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-d '{
"marketplaceWeeklyFeeEnabled": true,
"marketplaceWeeklyFeeAmount": 1000,
"marketplaceWeeklyFeeCurrency": "CRC"
}'
```
`marketplaceWeeklyFeeAmount` is an integer expressed in the currency's minor unit, from `1` through `2147483647`. The weekly fee is available for connected accounts in Costa Rica, Guatemala, and Peru. Supported currencies are `USD`, `CRC` for Costa Rica, `GTQ` for Guatemala, and `PEN` for Peru.
To enable the fee, the effective configuration must have an amount and currency. The primary account and connected account must also have a payout bank account in that same currency. You can save the amount and currency while the fee is disabled before meeting those requirements; to disable it later, send `marketplaceWeeklyFeeEnabled: false`.
`null` values are not allowed. To preserve a field's current value, omit it from the payload. Each request is applied atomically: the first creates the configuration, and later requests update only the supplied values.
The response returns only the public configuration:
```json
{
"id": "cl502zv0d0127ebdp3zt27651",
"marketplaceWeeklyFeeEnabled": true,
"marketplaceWeeklyFeeAmount": 1000,
"marketplaceWeeklyFeeCurrency": "CRC"
}
```
### Cutoff and collection
The fixed weekly fee is separate from `marketplaceAppFee`: it is created once per week, not once per payment.
Every Friday at `02:00` in `America/Costa_Rica`, ONVO snapshots the effective configuration. If the fee is enabled and the connected account is `active`, ONVO creates the full obligation in the configured currency. A change made after the cutoff applies to the following Friday. If the connected account is not `active` at the cutoff, ONVO does not create that week's fee.
Disabling the fee before the cutoff prevents a new obligation, but disabling it does not remove pending obligations. ONVO deducts them from future payouts in the same currency, after other deductions, and preserves at least `100` minor units in the payout. If the available balance is insufficient, ONVO collects a partial amount and carries the remainder to future payouts, applying the oldest obligations first.
ONVO credits the primary account only for the amount collected when the payout reaches `paid`. If a paid payout is reversed, ONVO reverses the corresponding credit and reopens the obligation balance. The `test` and `live` modes are processed separately.
The [weekly fee configuration reference](/en/api/configurar-una-tarifa-semanal) includes complete payloads for `null` values, an invalid amount, incomplete configuration, unsupported currency, missing bank accounts, a disabled feature, and a connected account that was not found.
## Seller onboarding
The seller must complete ONVO-hosted onboarding before receiving payments. During this process, they provide the IBAN accounts where settlements should be sent.
The link expires after 7 days. You can regenerate it from the Dashboard or with [`POST /v1/connected-accounts/{id}/onboarding-link`](/en/api/regenerar-enlace-de-onboarding); when you do, the previous link expires:
```bash
curl https://api.onvopay.com/v1/connected-accounts/cl502zv0d0127ebdp3zt27651/onboarding-link \
-X POST \
-H "Authorization: Bearer "
```
```json
{
"id": "cl502zv0d0127ebdp3zt27651",
"onboardingUrl": "https://onvopay.com/setup/account_onboarding_test_example"
}
```
Regeneration is available only before onboarding is complete. If the account is already active, ONVO returns `409` with `marketplaces.onboarding_already_completed`.
Once onboarding is complete, the connected account is enabled to accept payments on its behalf.
## Errors
Marketplace domain errors use a typed payload with `statusCode`, `type`, `code`, `message`, `path`, and `timestamp`; validation and authentication errors use their own payloads. The [`POST /v1/connected-accounts`](/en/api/crear-una-cuenta-conectada), [`GET /v1/connected-accounts`](/en/api/listar-cuentas-conectadas), [`POST /v1/connected-accounts/{id}`](/en/api/actualizar-una-cuenta-conectada), and [`POST /v1/connected-accounts/{id}/weekly-fees`](/en/api/configurar-una-tarifa-semanal) references show the `400` and `401` cases. [`GET /v1/connected-accounts/{id}`](/en/api/obtener-una-cuenta-conectada) shows the `404` response, while [`POST /v1/connected-accounts/{id}/onboarding-link`](/en/api/regenerar-enlace-de-onboarding) includes the operation-specific `409` and `500` responses.
Here is a complete example payload for a domain error:
```json
{
"statusCode": 404,
"type": "OnvoAPIError",
"code": "marketplaces.connected_account_not_found",
"message": "The connected account was not found",
"path": "/v1/connected-accounts/cl502zv0d0127ebdp3zt27651",
"timestamp": "2026-07-25T17:00:00.000Z"
}
```
Handle at least these cases:
| HTTP | Stable code | Meaning |
| --- | --- | --- |
| `400` | `marketplaces.parent_configuration_invalid` | The primary account is missing required configuration. |
| `400` | `marketplaces.invalid_cursor` | The cursor is invalid, foreign, or does not match the filter. |
| `400` | `marketplaces.invalid_status` | The status filter is unsupported. |
| `400` | `marketplaces.unsupported_public_field` | The payload includes a field outside the public contract. |
| `400` | `marketplaces.weekly_fee.configuration_required` | No weekly configuration field was provided. |
| `400` | `marketplaces.weekly_fee.feature_disabled` | The feature is not enabled for the primary account. |
| `400` | `marketplaces.weekly_fee.amount_required` | The effective amount is missing when enabling the fee. |
| `400` | `marketplaces.weekly_fee.currency_required` | The effective currency is missing when enabling the fee. |
| `400` | `marketplaces.weekly_fee.currency_not_supported` | The currency is not supported for the connected account's country. |
| `400` | `marketplaces.weekly_fee.child_bank_account_required` | The connected account has no bank account in the configured currency. |
| `400` | `marketplaces.weekly_fee.parent_bank_account_required` | The primary account has no bank account in the configured currency. |
| `401` | — | The key is invalid or publishable, or a live key belongs to an inactive primary account. |
| `404` | `marketplaces.connected_account_not_found` | The ID does not belong to the authenticated primary account and mode. |
| `409` | `marketplaces.onboarding_already_completed` | The account has already completed onboarding. |
| `500` | `marketplaces.error_creating_onboarding_link` | ONVO could not persist the link; no partial writes remain. |
## Payment flow
Always use the API keys from the primary account, meaning the account that created the marketplace.
Payment methods, customers, products, and prices must also be created in the primary account. Send `onBehalfOf` with the seller's `Account ID` when the charge should belong to a marketplace account.
You can use marketplace with payment intents, one-time Checkout Sessions, and subscriptions.
### Payment intents
1. [Create a payment intent](/en/api/crear-una-intencion-de-pago) with the `onBehalfOf` attribute, using the `id` returned when you [create the connected account](/en/api/crear-una-cuenta-conectada).
```json
{
"amount": 10000,
"currency": "USD",
"onBehalfOf": "cl502zv0d0127ebdp3zt27651"
}
```
2. [Confirm the payment intent](/en/api/confirmar-una-intencion-de-pago) with the `paymentMethodId` returned when you create the payment method in the primary account.
```json
{
"paymentMethodId": "cl502zv0d0127ebdp3zt27652"
}
```
### Checkout Sessions
Create the Checkout Session with `onBehalfOf`. ONVO stores that account on the session and uses it on the payment intent generated for the charge.
```json
{
"redirectUrl": "https://example.com/success",
"cancelUrl": "https://example.com/cancel",
"onBehalfOf": "ma502zv0d0127ebdp3zt27651",
"lineItems": [
{
"quantity": 1,
"unitAmount": 10000,
"currency": "USD",
"description": "Order #1001"
}
]
}
```
### Subscriptions
Create the subscription with `onBehalfOf`. ONVO uses that marketplace account on the payment intent for the first period and on future renewals.
```json
{
"customerId": "cus502zv0d0127ebdp3zt27651",
"paymentMethodId": "pm502zv0d0127ebdp3zt27651",
"description": "Monthly Pro Plan",
"onBehalfOf": "ma502zv0d0127ebdp3zt27651",
"items": [
{
"priceId": "price502zv0d0127ebdp3zt27651",
"quantity": 1
}
]
}
```
Checkout Session and subscription lists can also be filtered by seller with the `onvo-on-behalf-of` header.
If the charge succeeds, ONVO calculates ONVO fees, withholdings, and the marketplace commission on the gross amount.
You can then [retrieve a payment intent](/en/api/obtener-una-intencion-de-pago) by ID or [list payment intents](/en/api/listar-todas-las-intenciones-de-pago) for the account.
Example for a `100.00 USD` transaction:
| Concept | Amount |
| --- | --- |
| Gross amount | `100.00 USD` |
| ONVO fee 3.5% | `3.50 USD` |
| Withholding 2% | `2.00 USD` |
| Net amount | `94.50 USD` |
| Marketplace commission 5% | `5.00 USD` |
| Amount settled to seller | `89.50 USD` |
The marketplace commission is deposited into the primary account and the net amount is deposited to the seller.
## Test and live mode
You can create connected accounts in test or live mode based on the Secret API Key or the active Dashboard mode.
Accounts created in test mode only work with test keys. Accounts created in live mode only work with live keys. You cannot change an account's mode after it is created.
---
# Payments
URL: https://docs.onvopay.com/en/payments/overview
Markdown: https://docs.onvopay.com/en/payments/overview.md
# Payments
ONVO payment flows are built around payment intents, payment methods, refunds, and asynchronous events.
## Related API reference
- [Payment intents](/en/api/intenciones-de-pago)
- [Payment methods](/en/api/metodos-de-pago)
- [Subscriptions](/en/api/cargos-recurrentes)
- [Refunds](/en/api/reembolsos)
- [Checkout sessions](/en/api/sesiones-de-checkout)
## Main resources
| Resource | Description |
| --- | --- |
| Payment intent | Represents the attempt to charge an order. |
| Payment method | Instrument used by the buyer. |
| Subscription | Charges a customer periodically using a recurring price. |
| Refund | Full or partial return of a payment. |
| Webhook | Event sent by ONVO when state changes. |
For most integrations, create one intent per order and listen to webhooks to confirm the final result.
## Card verification declines {#card-declines}
When you create or update a `card` payment method, ONVO tokenizes and verifies the card before storing its details. If verification fails, the response preserves the general `cards.invalid_card_info` error and can include `details.card` with structured information for the merchant.
`details.card` is optional. When present, it contains these fields:
- `reason`: stable category for choosing the general treatment.
- `declineCode`: safe code from the gateway or issuer, or an ONVO fallback value.
- `declineMessage`: safe informational text for logging or support.
For example, a decline can return this response:
```json
{
"statusCode": 400,
"type": "OnvoAPIError",
"code": "cards.invalid_card_info",
"message": "There was an error with the card information provided. Please review card number, expiration date and cvv",
"path": "/v1/payment-methods",
"details": {
"card": {
"reason": "issuer_declined",
"declineCode": "55",
"declineMessage": "Incorrect PIN"
}
},
"timestamp": "2026-04-29T17:36:28.477Z"
}
```
### How to interpret `reason`
| Value | When it is used |
| --- | --- |
| `issuer_declined` | The issuer declined verification, for example because of incorrect details or a card restriction. |
| `gateway_declined` | The gateway or acquirer explicitly reported a non-technical acceptance, authentication, merchant, or risk rule. |
| `onvo_declined` | ONVO applied an eligibility or security rule, such as a disallowed brand or BIN. |
| `processor_error` | A technical, communication, or configuration problem prevented verification from completing. |
| `unknown` | There was not enough information to attribute the decline safely. |
Use `reason` for general logic. `declineCode` is not part of a universal code namespace and can vary by provider; do not build global rules that assume the same code always has the same meaning. `declineMessage` is also informational: do not parse it for decisions or depend on it for localization.
When no specific decline information is available, ONVO returns the default values: `unknown` in `reason`, `generic_decline` in `declineCode`, and a generic message in `declineMessage`.
### Recommended handling
1. Check the top-level `code` first to identify `cards.invalid_card_info`.
2. If `details.card` exists, use `reason` to choose the general buyer experience.
3. Show your own safe guidance to the buyer; do not expose internal messages or promise that retrying will resolve the decline.
4. Record `declineCode` and `declineMessage` only as context for diagnostics and support.
### Reference and examples
- [Payment methods API reference](/en/api/metodos-de-pago)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
- [Update a payment method](/en/api/actualizar-un-metodo-de-pago)
- [Complete response and recovery example](/en/payments/payment-intents#structured-decline-details)
- [SDK `onError` handling example](/en/integrations/sdk#handling-card-errors)
---
# Payment intents
URL: https://docs.onvopay.com/en/payments/payment-intents
Markdown: https://docs.onvopay.com/en/payments/payment-intents.md
# Payment intents
A payment intent guides the lifecycle of a payment. Use exactly one intent per payment to keep traceability clear.
## Related API reference
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
- [Peru merchant account requirement](#peru-merchant-account-requirement)
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Retrieve a payment intent](/en/api/obtener-una-intencion-de-pago)
- [Capture a payment intent](/en/api/capturar-una-intencion-de-pago)
- [Cancel a payment intent](/en/api/cancelar-una-intencion-de-pago)
- [List all payment intents](/en/api/listar-todas-las-intenciones-de-pago)
## Basic flow
1. Create or collect a payment method for the buyer.
2. Create a payment intent with the amount and currency.
3. Confirm the intent using the `paymentMethodId`.
4. Listen for webhooks before marking the payment as complete in your system.
## Create a payment method
Create the payment method client-side with a publishable key. For cards, the response returns an `id` that you later send as `paymentMethodId` when confirming the intent from your server.
:::warning PCI scope
To reduce PCI scope, collect card data client-side with a publishable key, [Checkout](/en/checkout/overview), or the [web SDK](/en/integrations/sdk). Do not pass untokenized card data through your server. If your backend receives or transmits PAN, CVV, or full card data, that integration is in your PCI scope and may require SAQ D validation.
:::
### Peru merchant account requirement {#peru-merchant-account-requirement}
:::important
For merchant accounts created in Peru, the customer attached to the payment method must have an email address when creating payment methods.
You can meet this requirement in two ways:
- Send `customer.email` in the payment method creation payload to create and attach the customer in the same request.
- Send the `customerId` of a customer previously created with the `email` attribute.
:::
### Card example and validation rules
```bash
curl https://api.onvopay.com/v1/payment-methods \
-X POST \
-H "Authorization: Bearer $ONVO_PUBLISHABLE_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "card",
"card": {
"number": "4242424242424242",
"expMonth": 12,
"expYear": 2028,
"cvv": "123",
"holderName": "Maria Rodriguez"
},
"billing": {
"name": "Maria Rodriguez",
"address": {
"country": "CR"
}
},
"customer": {
"name": "Maria Rodriguez",
"email": "maria@example.com"
}
}'
```
To avoid `400` validation errors before the card is tokenized, validate these fields in your form:
- `card.holderName`: non-empty text.
- `card.number`: a digits-only string, without spaces or separators, and a number that passes Luhn validation.
- `card.expMonth`: integer between `1` and `12`.
- `card.expYear`: integer between `2023` and `2100`. Also validate that the card is not expired before sending it.
- `card.cvv`: string with `3` or `4` digits when you send it.
If the payload does not meet these rules, ONVO responds with `400` and a validation error. For example, an invalid card number can return:
```json
{
"statusCode": 400,
"message": ["card.number Card number is invalid"],
"error": "Bad Request"
}
```
When you create a `card` payment method, ONVO tokenizes and verifies the card before creating the object. If tokenization fails because the card details are invalid, the endpoint responds with `400` and no payment method is created.
```json
{
"statusCode": 400,
"type": "OnvoAPIError",
"code": "cards.invalid_card_info",
"message": "There was an error with the card information provided. Please review card number, expiration date and cvv",
"path": "/v1/payment-methods",
"details": {
"card": {
"reason": "issuer_declined",
"declineCode": "55",
"declineMessage": "Incorrect PIN"
}
},
"timestamp": "2026-04-29T17:36:28.477Z"
}
```
### Structured decline details
`details.card` is optional and only appears when ONVO has safe information about a handled card-verification decline. Use `reason` to choose the general treatment:
| Reason | Meaning |
| --- | --- |
| `issuer_declined` | The issuer declined the verification. |
| `gateway_declined` | The gateway or acquirer explicitly reported a non-technical acceptance, authentication, merchant, or risk rule. |
| `onvo_declined` | ONVO applied an eligibility or security rule. |
| `processor_error` | A technical failure occurred while processing the verification. |
| `unknown` | There was not enough information to attribute the decline. |
`declineCode` can come from the gateway or issuer, or be a stable ONVO fallback; it is not a universal code. `declineMessage` is informational: do not parse it for business logic or depend on it for localization.
When no specific decline information is available, ONVO returns the default values: `unknown` in `reason`, `generic_decline` in `declineCode`, and a generic message in `declineMessage`.
Show useful guidance to the buyer based on `reason`. Do not promise that a retry will resolve the decline; for `issuer_declined`, you can suggest checking the card details, contacting the issuer, or using another payment method.
## Create an intent
```bash
curl https://api.onvopay.com/v1/payment-intents \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 500000,
"currency": "CRC",
"description": "Order #1001"
}'
```
## Confirm the intent
Use the intent `id` and the `id` from the payment method created earlier.
```bash
curl https://api.onvopay.com/v1/payment-intents/$PAYMENT_INTENT_ID/confirm \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentMethodId": "cl502zv0d0127ebdp3zt27651"
}'
```
## Common states
| State | Meaning |
| --- | --- |
| `requires_payment_method` | Initial state. The intent also stays in this state if confirmation fails, for example because a card is declined. |
| `requires_action` | The payment method needs an additional buyer action, such as 3DS authentication. |
| `processing` | ONVO is processing the payment. |
| `succeeded` | The payment succeeded. |
| `canceled` | The intent was canceled. |
## Best practices
- Store the intent `id` with your payment.
- Use `metadata` for internal cart, payment, or customer IDs.
- Confirm the final state by webhook before delivering digital goods or marking the payment as complete.
---
# Refunds
URL: https://docs.onvopay.com/en/payments/refunds
Markdown: https://docs.onvopay.com/en/payments/refunds.md
# Refunds
A refund returns all or part of a successful payment intent amount.
## Related API reference
- [Create a refund](/en/api/crear-un-reembolso)
- [Retrieve a refund](/en/api/obtener-un-reembolso)
- [Refunds](/en/api/reembolsos)
```bash
curl https://api.onvopay.com/v1/refunds \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentIntentId": "pi_...",
"amount": 100000
}'
```
## Recommendations
- Validate that the order can be refunded in your system before calling ONVO.
- Store the refund ID for reconciliation.
- Listen for webhook events to know the final result.
---
# SINPE Movil
URL: https://docs.onvopay.com/en/payments/sinpe-mobile
Markdown: https://docs.onvopay.com/en/payments/sinpe-mobile.md
# SINPE Movil
SINPE Movil lets you collect a payment when the buyer sends a transfer to ONVO's mobile number and ONVO automatically associates it with a payment intent.
This flow currently supports `CRC` payments only.
## Related API reference
| Step | Reference | Payloads |
| --- | --- | --- |
| Create the intent | [POST /v1/payment-intents](/en/api/crear-una-intencion-de-pago) | [Request](/en/api/crear-una-intencion-de-pago#request) · [Response](/en/api/crear-una-intencion-de-pago#responses) |
| Create the payment method | [POST /v1/payment-methods](/en/api/crear-un-metodo-de-pago) | [Request](/en/api/crear-un-metodo-de-pago#request) · [Response](/en/api/crear-un-metodo-de-pago#responses) |
| Confirm the intent | [POST /v1/payment-intents/\{id\}/confirm](/en/api/confirmar-una-intencion-de-pago) | [Request](/en/api/confirmar-una-intencion-de-pago#request) · [Response](/en/api/confirmar-una-intencion-de-pago#responses) |
| Reconcile transfers | [GET /v1/mobile-transfers/list](/en/api/listar-pagos-por-sinpe-movil) | [Parameters](/en/api/listar-pagos-por-sinpe-movil#request) · [Response](/en/api/listar-pagos-por-sinpe-movil#responses) |
| Receive confirmation | [Webhooks](/en/webhooks) | [Event payloads](/en/webhooks#payloads-by-event) |
## Before you start
- Configure webhooks and listen for `payment-intent.succeeded`.
- Use `CRC` as the payment intent currency.
- Send the real identification of the person or entity that will make the transfer in the payment method.
- Ask the buyer to transfer from an account whose identification matches `mobileNumber.identification`.
ONVO tries to associate the incoming transfer by identification number first. If the bank reports a different identification than the one you sent, automatic association can fail.
The default destination number for receiving SINPE Movil transfers is `+506 70196686`. If your merchant account requested a custom number, use the number provided by the ONVO support team.
## Flow
1. Create a payment intent for the exact amount to collect.
2. Create a payment method with `type: "mobile_number"`.
3. Confirm the intent with the `paymentMethodId`.
4. Show the buyer the destination SINPE Movil number and the exact amount.
5. Wait for the `payment-intent.succeeded` webhook before marking the payment as complete.
When you confirm the intent with this payment method, the intent moves to `processing`. That state means ONVO is waiting to receive and associate the transfer.
## Create the payment intent
```bash
curl https://api.onvopay.com/v1/payment-intents \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 500000,
"currency": "CRC",
"description": "SINPE Movil payment #1001"
}'
```
## Create the payment method
`mobileNumber.number` is the buyer's SINPE Movil number. The destination number the buyer should transfer to is ONVO's number shown in your payment instructions.
```bash
curl https://api.onvopay.com/v1/payment-methods \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "mobile_number",
"mobileNumber": {
"identification": "01-1393-1919",
"identificationType": 0,
"number": "+50688888888"
},
"billing": {
"name": "Maria Rodriguez",
"email": "maria@example.com"
}
}'
```
## Confirm the intent
```bash
curl https://api.onvopay.com/v1/payment-intents/$PAYMENT_INTENT_ID/confirm \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentMethodId": "cl502zv0d0127ebdp3zt27651"
}'
```
After confirmation, tell the buyer to transfer the exact amount to ONVO's SINPE Movil number. Do not mark the payment as successful in your system until you receive `payment-intent.succeeded`.
## Reconciliation
The SINPE Movil payments list reflects incoming transfers received on a SINPE Movil number. It is useful for reviewing transfers that could not be associated automatically.
If `paymentIntentId` is `null`, the transfer is not yet linked to a payment intent.
## Testing
In test mode, using `onvo_test_` keys, the numbers defined in [SINPE Movil test payment methods](/en/payments/testing#sinpe-movil) simulate different transfer scenarios. You do not need to make a real transfer or send funds to ONVO's SINPE Movil number.
Use those numbers to simulate successful, delayed, failed, and partial transfers.
---
# SINPE PIN
URL: https://docs.onvopay.com/en/payments/sinpe-pin
Markdown: https://docs.onvopay.com/en/payments/sinpe-pin.md
# SINPE PIN
SINPE PIN lets you collect a payment when the buyer sends a bank transfer to an IBAN provided by ONVO and ONVO automatically associates it with a payment intent.
This payment method is available by request only and currently supports `CRC` payments only.
:::warning Real-time transfers
SINPE PIN only works if the buyer sends the transfer in real time. If they use a scheduled, delayed, or non-immediate transfer, ONVO will not be able to associate it automatically and the payment will not complete with this flow.
:::
## Related API reference
| Step | Reference | Payloads |
| --- | --- | --- |
| Create the intent | [POST /v1/payment-intents](/en/api/crear-una-intencion-de-pago) | [Request](/en/api/crear-una-intencion-de-pago#request) · [Response](/en/api/crear-una-intencion-de-pago#responses) |
| Create the payment method | [POST /v1/payment-methods](/en/api/crear-un-metodo-de-pago) | [Request](/en/api/crear-un-metodo-de-pago#request) · [Response](/en/api/crear-un-metodo-de-pago#responses) |
| Confirm the intent | [POST /v1/payment-intents/\{id\}/confirm](/en/api/confirmar-una-intencion-de-pago) | [Request](/en/api/confirmar-una-intencion-de-pago#request) · [Response](/en/api/confirmar-una-intencion-de-pago#responses) |
| Receive confirmation | [Webhooks](/en/webhooks) | [Event payloads](/en/webhooks#payloads-by-event) |
## Before you start
- Request SINPE PIN enablement from the ONVO support team.
- Use the destination IBAN provided by ONVO so the buyer can make the transfer.
- Configure webhooks and listen for `payment-intent.succeeded`.
- Use `CRC` as the payment intent currency.
- Send the real identification of the person or entity that will make the transfer in the payment method.
ONVO tries to associate the incoming transfer by identification number first. The identification sent in `bankDeposit.identification` must match the identification reported by the bank in the incoming transfer.
## Flow
1. Create a payment intent for the exact amount to collect.
2. Create a payment method with `type: "bank_deposit"`.
3. Confirm the intent with the `paymentMethodId`.
4. Show the buyer the destination IBAN provided by ONVO, the exact amount, and the instruction to send the transfer in real time.
5. Wait for the `payment-intent.succeeded` webhook before marking the payment as complete.
When you confirm the intent with this payment method, the intent moves to `processing`. That state means ONVO is waiting to receive and associate the transfer.
## Create the payment intent
```bash
curl https://api.onvopay.com/v1/payment-intents \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 500000,
"currency": "CRC",
"description": "SINPE PIN payment #1001"
}'
```
## Create the payment method
`bankDeposit.identification` must represent the person or entity that will make the bank transfer.
```bash
curl https://api.onvopay.com/v1/payment-methods \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "bank_deposit",
"bankDeposit": {
"identification": "01-1393-1919",
"identificationType": 1
},
"billing": {
"name": "Maria Rodriguez",
"email": "maria@example.com"
}
}'
```
## Confirm the intent
```bash
curl https://api.onvopay.com/v1/payment-intents/$PAYMENT_INTENT_ID/confirm \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentMethodId": "cl502zv0d0127ebdp3zt27651"
}'
```
After confirmation, tell the buyer to transfer the exact amount to the IBAN provided by ONVO using a real-time transfer. Do not mark the payment as successful in your system until you receive `payment-intent.succeeded`.
## Testing
In test mode, using `onvo_test_` keys, the identifications defined in [SINPE PIN test payment methods](/en/payments/testing#bank-deposit-sinpe-pin) simulate different deposit scenarios. You do not need to make a real transfer or send funds to ONVO's IBAN.
Use those identifications to simulate successful, delayed, failed, and partial deposits.
---
# Subscriptions
URL: https://docs.onvopay.com/en/payments/subscriptions
Markdown: https://docs.onvopay.com/en/payments/subscriptions.md
# Subscriptions
A subscription charges a customer on a recurring schedule. The flow starts by creating a product and a recurring price; then you attach a payment method to the customer and create the subscription with that price.
You can charge the first period immediately or create the subscription first and confirm it in an additional request.
## Related API reference
- [Create a product](/en/api/crear-un-producto)
- [Create a price](/en/api/crear-un-precio)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
- [Create a subscription](/en/api/crear-un-cargo-recurrente)
- [Confirm a subscription](/en/api/confirmar-un-cargo-recurrente)
- [Retrieve a subscription](/en/api/obtener-un-cargo-recurrente)
- [List invoices](/en/api/listar-renovaciones)
## Basic flow
1. Create a product to represent what you sell.
2. Create a price with `type: "recurring"` and define the billing interval.
3. Create or collect a payment method for the customer.
4. Create the subscription with the `customerId`, `paymentMethodId`, and `priceId`.
5. Listen for webhooks to confirm the first charge and every renewal.
## Create a product
```bash
curl https://api.onvopay.com/v1/products \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Pro Plan",
"description": "Monthly access to the Pro Plan",
"isActive": true
}'
```
Store the product `id` so you can create the recurring price.
## Create a recurring price
Amounts are sent in the smallest denomination of the currency. For example, `250000` represents CRC 2,500.00.
```bash
curl https://api.onvopay.com/v1/prices \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"productId": "$PRODUCT_ID",
"unitAmount": 250000,
"currency": "CRC",
"type": "recurring",
"nickname": "Monthly Pro Plan",
"recurring": {
"interval": "month",
"intervalCount": 1
}
}'
```
Store the price `id`. You send it as `priceId` inside `items`.
## Create a payment method
The payment method must belong to the same customer used for the subscription. You can send an existing `customerId` or send `customer` to create and attach the customer in the same request.
```bash
curl https://api.onvopay.com/v1/payment-methods \
-X POST \
-H "Authorization: Bearer $ONVO_PUBLISHABLE_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "card",
"card": {
"number": "4242424242424242",
"expMonth": 12,
"expYear": 2028,
"cvv": "123",
"holderName": "Maria Rodriguez"
},
"billing": {
"name": "Maria Rodriguez",
"email": "maria@example.com",
"address": {
"country": "CR"
}
},
"customer": {
"name": "Maria Rodriguez",
"email": "maria@example.com",
"phone": "+50688880000"
}
}'
```
Store the payment method `id` and the associated `customerId`.
## Charge immediately
To charge the first period when creating the subscription, send `paymentMethodId`. If you omit `paymentBehavior`, ONVO uses the default behavior and confirms the first charge immediately.
```bash
curl https://api.onvopay.com/v1/subscriptions \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "$CUSTOMER_ID",
"paymentMethodId": "$PAYMENT_METHOD_ID",
"description": "Monthly Pro Plan",
"items": [
{
"priceId": "$PRICE_ID",
"quantity": 1
}
],
"metadata": {
"accountPlan": "pro",
"internalSubscriptionId": "sub_123"
}
}'
```
ONVO creates the initial invoice, creates a payment intent for that period, and confirms it with the payment method. Check the status of the subscription, invoice, and payment intent before activating the service in your system.
## Marketplace
If the subscription belongs to a seller in your marketplace, send `onBehalfOf` with that marketplace account's `Account ID` when creating the subscription.
```json
{
"customerId": "$CUSTOMER_ID",
"paymentMethodId": "$PAYMENT_METHOD_ID",
"description": "Monthly Pro Plan",
"onBehalfOf": "$MARKETPLACE_ACCOUNT_ID",
"items": [
{
"priceId": "$PRICE_ID",
"quantity": 1
}
]
}
```
ONVO keeps that marketplace account on the subscription, the initial invoice, and future renewals. Each payment intent generated for the subscription uses that context to calculate the marketplace commission.
## Defer confirmation
Use `paymentBehavior: "allow_incomplete"` when you want to create the subscription first and confirm the charge in a later request. In this mode, you can omit `paymentMethodId` when creating the subscription.
```bash
curl https://api.onvopay.com/v1/subscriptions \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "$CUSTOMER_ID",
"paymentBehavior": "allow_incomplete",
"description": "Monthly Pro Plan",
"items": [
{
"priceId": "$PRICE_ID",
"quantity": 1
}
],
"metadata": {
"accountPlan": "pro",
"internalSubscriptionId": "sub_123"
}
}'
```
When the payment method is ready, confirm the subscription:
```bash
curl https://api.onvopay.com/v1/subscriptions/$SUBSCRIPTION_ID/confirm \
-X POST \
-H "Authorization: Bearer $ONVO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"paymentMethodId": "$PAYMENT_METHOD_ID"
}'
```
## Invoices
Each subscription generates invoices. The first invoice is created at the start of the subscription and later invoices are created for each successful period. Each invoice is associated with a payment intent, so you can use it to reconcile the charged period.
## Best practices
- Store the product, price, customer, payment method, and subscription IDs in your system.
- Use `metadata` to attach internal IDs, such as your platform plan or subscription.
- Use `onBehalfOf` when creating marketplace subscriptions so renewals keep the same seller.
- Listen for `subscription.renewal.succeeded` and `subscription.renewal.failed` to sync local state.
- Query invoices to audit each period and its associated payment intent.
---
# Testing
URL: https://docs.onvopay.com/en/payments/testing
Markdown: https://docs.onvopay.com/en/payments/testing.md
# Testing
Keys prefixed with `onvo_test_` operate in test mode. Use them to validate flows, states, webhooks, and error handling.
The payment methods on this page only work in test mode. If you try to use them with `onvo_live_` keys, ONVO rejects the payment method creation.
## Related API reference
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
- [Create a payment intent](/en/api/crear-una-intencion-de-pago)
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Create a refund](/en/api/crear-un-reembolso)
## Checklist before production
- Create a payment intent.
- Confirm a successful payment.
- Test a payment-method error.
- Test a refund.
- Validate webhook delivery and signature verification.
- Confirm that your system handles idempotent retries.
## Cards
To create a test card, use `card` in the `type` attribute when creating a payment method and include the number in `card.number`.
Use any future expiration date, any valid CVV for the brand, and any cardholder name.
| Scenario | Brand | Number |
| --- | --- | --- |
| Approved | Visa | `4242424242424242` |
| 3DS challenge | Visa | `4000000000003220` |
| Approved | Mastercard | `5555555555554444` |
| Approved | American Express | `378282246310005` |
| Declined payment | Visa | `4000000000000002` |
| Creation fails due to invalid verification | Visa | `4000000000000127` |
| External card processor error | Visa | `4000000000000119` |
## Credix
To create a Credix test card, use `credix` in the `type` attribute and include the number in `credix.number`.
| Scenario | Number |
| --- | --- |
| Approved | `4111111111111111` |
| Declined | `4000000000000002` |
## Bank Deposit (SINPE PIN)
To create a bank deposit test method, use `bank_deposit` in `type` and include `identification` and `identificationType` in `bankDeposit`.
| Scenario | Identification | Behavior |
| --- | --- | --- |
| Successful | `00-0000-8888` | Simulates a successful deposit 15 seconds after confirming the payment intent. |
| Failed | `00-0000-9521` | Marks the charge as failed and the intent returns to `requires_payment_method`. |
| Successful with delay | `00-0000-4444` | Simulates a successful deposit 30 seconds later. |
| Partial | `00-0000-3333` | Simulates a 50% deposit followed by another deposit for the remaining 50%. |
## SINPE Movil
To create a SINPE Movil test method, use `mobile_number` in `type` and include the number in `mobileNumber.number`.
| Scenario | Number | Behavior |
| --- | --- | --- |
| Successful | `+50688888888` | Simulates a successful transfer 15 seconds later. |
| Successful with delay | `+50688884444` | Simulates a successful transfer 6 minutes later. |
| Failed | `+50688889521` | Does not simulate a transfer and the intent state does not change. |
| Partial | `+50688883333` | Simulates a 50% transfer followed by another transfer for the remaining 50%. |
## Zunify
To create a Zunify test method, use `zunify` in `type` and include `phoneNumber` and `pin` in the `zunify` object.
| Scenario | Number | PIN | Behavior |
| --- | --- | --- | --- |
| Successful | `11223344` | `1234` | Simulates a Zunify charge and marks the intent as successful approximately 10 seconds later. |
---
# 3DS Authentication
URL: https://docs.onvopay.com/en/payments/three-ds
Markdown: https://docs.onvopay.com/en/payments/three-ds.md
# 3DS Authentication
3D Secure adds an authentication layer for card payments. When the issuer requires it, the customer must complete a verification, usually on the bank's page or in a modal within your site.
In 100% API integrations, you identify this case when payment intent confirmation returns `requires_action` and a `nextAction` object.
## Related API reference
- [Confirm a payment intent](/en/api/confirmar-una-intencion-de-pago)
- [Retrieve a payment intent](/en/api/obtener-una-intencion-de-pago)
- [Create a payment method](/en/api/crear-un-metodo-de-pago)
## Redirect
Send `returnUrl` when confirming the payment intent.
```json
{
"paymentMethodId": "cl502zv0d0127ebdp3zt27651",
"returnUrl": "https://www.example.com/return"
}
```
If 3DS is required, the response includes the URL where you should redirect the customer.
```json
{
"status": "requires_action",
"nextAction": {
"type": "redirect_to_url",
"redirectToUrl": {
"url": "https://checkout.onvopay.com/authorize/test_clv...",
"returnUrl": "https://www.example.com/return"
}
}
}
```
After authentication is completed, ONVO redirects the customer to your `returnUrl` with the `payment_intent_id` parameter.
```text
https://www.example.com/return?payment_intent_id=cl502zv0d0127ebdp3zt27651
```
Retrieve the payment intent to confirm the final status before marking the order as paid.
## Modal
You can also handle 3DS with the ONVO web library.
```html
```
Initialize the library with your publishable key and call `handleNextAction` when the intent requires action.
```html
```
Even if 3DS authentication succeeds, validate the final payment intent status. The transaction can still be declined for other reasons.
You can test this flow with card `4000000000003220` in test mode.
---
# Errors
URL: https://docs.onvopay.com/en/reference/errors
Markdown: https://docs.onvopay.com/en/reference/errors.md
# Errors
The ONVO API uses standard HTTP codes and JSON responses to describe errors.
| Code | Meaning |
| --- | --- |
| `400` | Invalid request. |
| `401` | Missing authentication or invalid key. |
| `403` | The key does not have permission for the action. |
| `404` | The resource does not exist. |
| `409` | State conflict. |
| `422` | The request could not be processed with the submitted data. |
| `500` | Internal error. |
Store the request identifier when contacting support.
---
# Pagination
URL: https://docs.onvopay.com/en/reference/pagination
Markdown: https://docs.onvopay.com/en/reference/pagination.md
# Pagination
List endpoints use cursor-based pagination. In the API reference, these fields appear as optional query parameters on list endpoints, for example `GET /v1/customers`, `GET /v1/payment-intents/account`, `GET /v1/products`, and other endpoints that return collections.
In the interactive API reference explorer, optional parameters appear under **Request > Parameters**.
## Parameters
| Parameter | Type | Description |
| --- | --- | --- |
| `limit` | number | Number of objects to return. Accepts values from `1` to `100`. When omitted, the API uses `10`. |
| `startingAfter` | string | Cursor for the next page. Use the `id` of the last object received in the current page. |
| `endingBefore` | string | Cursor for the previous page. Use the `id` of the first object received in the current page. |
Send only one cursor per request. If you send both `startingAfter` and `endingBefore`, the API returns an error because the backend can only navigate one direction per request.
The request parameter names are `startingAfter` and `endingBefore`. In list responses, the API returns those cursor values under `meta.cursorNext` and `meta.cursorBefore`; use `meta.cursorNext` as `startingAfter` to move forward and `meta.cursorBefore` as `endingBefore` to move backward.
## Examples
First page:
```bash
curl "https://api.onvopay.com/v1/customers?limit=10" \
-H "Authorization: Bearer onvo_test_secret_key_..."
```
Next page:
```bash
curl "https://api.onvopay.com/v1/customers?limit=10&startingAfter=cl40muorw00493ndp0okzk2g3" \
-H "Authorization: Bearer onvo_test_secret_key_..."
```
Previous page:
```bash
curl "https://api.onvopay.com/v1/customers?limit=10&endingBefore=cl40muorw00493ndp0okzk2g3" \
-H "Authorization: Bearer onvo_test_secret_key_..."
```
When the response includes `meta`, use the response cursors to build the next request.
## Recommendations
- Use filters to limit data volume.
- Process pages incrementally.
- Do not assume two consecutive pages are immutable if data changes while you are iterating through the list.
---
# Webhooks
URL: https://docs.onvopay.com/en/webhooks
Markdown: https://docs.onvopay.com/en/webhooks.md
# Webhooks
ONVO uses webhooks to notify your application when a result is produced while processing a payment intent, subscription, checkout session, or incoming transfer.
To receive them, configure a callback URL in your ONVO account. ONVO sends a `POST` request to that URL whenever a supported event is processed. The payload includes a `type` attribute that identifies the event and a `data` object with the related information.
## Related API reference
- [Payment intents](/en/api/intenciones-de-pago)
- [Subscriptions](/en/api/cargos-recurrentes)
- [Checkout sessions](/en/api/sesiones-de-checkout)
- [SINPE Movil](/en/api/sinpe-movil)
## Recommended flow
1. Expose an HTTPS endpoint.
2. Register the endpoint in the ONVO Dashboard under developers.
3. Verify the event origin with the webhook secret.
4. Process the event idempotently.
5. Respond with a `2xx` status when processing succeeds.
## Supported events
| Event | When it happens |
| --- | --- |
| `payment-intent.succeeded` | A payment intent is processed successfully. |
| `payment-intent.failed` | A payment intent fails. |
| `payment-intent.deferred` | A payment intent is waiting for approval, for example in a SINPE flow. |
| `subscription.renewal.succeeded` | A subscription renews successfully. |
| `subscription.renewal.failed` | A subscription renewal fails. |
| `checkout-session.succeeded` | A checkout session is processed successfully. |
| `mobile-transfer.received` | An incoming transfer is received on a custom SINPE Movil number. |
`mobile-transfer.received` is an additional notification for merchants with this capability enabled. It does not represent a successful payment by itself and is not sent by default. Contact support to enable it.
## Payload format
ONVO sends every webhook as a `POST` request with `Content-Type: application/json`. The body always has this structure:
```json
{
"type": "payment-intent.succeeded",
"data": {
"id": "clpiment0001"
}
}
```
| Field | Type | Description |
| --- | --- | --- |
| `type` | `string` | Name of the event received. Use it to decide which logic to run. |
| `data` | `object` | Snapshot of the object related to the event. Its shape depends on `type`. |
Amounts are sent as integers in the smallest currency unit. For example, `500000` represents ₡5,000.00 in `CRC` and `5000` represents $50.00 in `USD`. Dates are sent as ISO 8601 timestamps in UTC. The examples show the most important fields for integrations; depending on the payment method or flow, `data` can include additional fields or `null` values.
## Payloads by event
### `payment-intent.succeeded`
`data` contains the updated payment intent. When available, it includes the customer and the list of charges generated for that intent.
```json
{
"type": "payment-intent.succeeded",
"data": {
"id": "clpiment0001",
"accountId": "clacct0001",
"mode": "test",
"amount": 500000,
"baseAmount": 500000,
"baseExchangeRate": 1,
"capturableAmount": 0,
"receivedAmount": 500000,
"currency": "CRC",
"status": "succeeded",
"confirmationAttempts": 1,
"description": "Order #1001",
"paymentMethodId": "clpm0001",
"customerId": "clcus0001",
"metadata": {
"orderId": "order_1001"
},
"customer": {
"id": "clcus0001",
"name": "Ana Mora",
"email": "ana@example.com",
"phone": "+50688888888"
},
"charges": [
{
"id": "clch0001",
"amount": 500000,
"baseAmount": 500000,
"baseExchangeRate": 1,
"refNumber": "123456",
"mode": "test",
"currency": "CRC",
"status": "succeeded",
"failureCode": null,
"failureMessage": null,
"isApproved": true,
"isCaptured": true,
"createdAt": "2026-04-29T16:10:00.000Z",
"updatedAt": "2026-04-29T16:10:01.000Z"
}
],
"lastPaymentError": null,
"createdAt": "2026-04-29T16:09:50.000Z",
"updatedAt": "2026-04-29T16:10:01.000Z"
}
}
```
### `payment-intent.failed`
`data` contains the payment intent and an `error` object with the failure reason.
```json
{
"type": "payment-intent.failed",
"data": {
"id": "clpiment0002",
"accountId": "clacct0001",
"currency": "CRC",
"capturableAmount": 0,
"status": "requires_payment_method",
"metadata": {
"orderId": "order_1002"
},
"customer": {
"id": "clcus0002",
"name": "Luis Vega",
"email": "luis@example.com",
"phone": "+50688887777"
},
"error": {
"id": "clerr0001",
"mode": "test",
"paymentMethodType": "card",
"type": "processing_error",
"code": "declined",
"message": "Transaction declined due to test payment method used",
"createdAt": "2026-04-29T16:12:00.000Z",
"updatedAt": "2026-04-29T16:12:00.000Z"
}
}
}
```
### `payment-intent.deferred`
`data` contains the payment intent while it is waiting for external confirmation, for example when ONVO is waiting for a transfer confirmation.
```json
{
"type": "payment-intent.deferred",
"data": {
"id": "clpiment0003",
"accountId": "clacct0001",
"mode": "test",
"amount": 250000,
"currency": "CRC",
"status": "processing",
"paymentMethodId": "clpm0003",
"customerId": "clcus0003",
"metadata": {
"orderId": "order_1003"
},
"createdAt": "2026-04-29T16:13:00.000Z",
"updatedAt": "2026-04-29T16:13:02.000Z"
}
}
```
### `subscription.renewal.succeeded`
`data` contains the renewal associated with the charged period. Each renewal is tied to a subscription and to the payment intent created for that period.
```json
{
"type": "subscription.renewal.succeeded",
"data": {
"id": "clinv0001",
"accountId": "clacct0001",
"mode": "test",
"status": "paid",
"currency": "CRC",
"attemptCount": 1,
"attempted": true,
"description": "Monthly plan",
"total": 1200000,
"subTotal": 1200000,
"originalTotal": null,
"periodStart": "2026-04-01T00:00:00.000Z",
"periodEnd": "2026-05-01T00:00:00.000Z",
"paymentIntentId": "clpiment0004",
"subscriptionId": "clsub0001",
"customerId": "clcus0004",
"metadata": {
"plan": "pro"
},
"createdAt": "2026-04-01T00:00:00.000Z",
"updatedAt": "2026-04-01T00:00:05.000Z"
}
}
```
### `subscription.renewal.failed`
`data` contains the renewal status, the subscription status, the next retry date, and the error returned while processing the payment intent.
```json
{
"type": "subscription.renewal.failed",
"data": {
"subscriptionId": "clsub0002",
"paymentIntentId": "clpiment0005",
"currency": "CRC",
"lastPaymentAttempt": "2026-04-29T16:20:00.000Z",
"attemptCount": 2,
"invoiceStatus": "open",
"subscriptionStatus": "past_due",
"metadata": {
"accountTier": "pro"
},
"invoiceMetadata": {
"period": "2026-04"
},
"invoicePeriodStart": "2026-04-01T00:00:00.000Z",
"invoicePeriodEnd": "2026-05-01T00:00:00.000Z",
"currentPeriodStart": "2026-04-01T00:00:00.000Z",
"currentPeriodEnd": "2026-05-01T00:00:00.000Z",
"nextPaymentAttempt": "2026-04-30T16:20:00.000Z",
"customer": {
"id": "clcus0005",
"name": "María Solís",
"email": "maria@example.com",
"phone": "+50688886666"
},
"error": {
"id": "clerr0002",
"mode": "test",
"paymentMethodType": "card",
"type": "processing_error",
"code": "declined",
"message": "Transaction declined due to test payment method used",
"createdAt": "2026-04-29T16:20:00.000Z",
"updatedAt": "2026-04-29T16:20:00.000Z"
}
}
}
```
### `checkout-session.succeeded`
`data` contains the completed Checkout Session, its line items, and the customer from the associated payment intent.
```json
{
"type": "checkout-session.succeeded",
"data": {
"id": "clcs0001",
"url": "https://checkout.onvopay.com/pay/clcs0001",
"mode": "test",
"status": "complete",
"paymentStatus": "paid",
"paymentMode": "payment",
"amountSubTotal": 350000,
"amountTotal": 350000,
"currency": "CRC",
"successUrl": "https://example.com/success",
"cancelUrl": "https://example.com/cancel",
"paymentIntentId": "clpiment0006",
"customerId": "clcus0006",
"metadata": {
"cartId": "cart_123"
},
"customer": {
"id": "clcus0006",
"name": "Sofía Rojas",
"email": "sofia@example.com",
"phone": "+50688885555"
},
"lineItems": [
{
"name": "Test product",
"description": "Product description",
"currency": "CRC",
"amount": 350000,
"priceId": "clprice0001"
}
],
"createdAt": "2026-04-29T16:25:00.000Z",
"updatedAt": "2026-04-29T16:25:10.000Z"
}
}
```
### `mobile-transfer.received`
`data` contains the incoming transfer information. This event does not confirm a payment intent by itself.
```json
{
"type": "mobile-transfer.received",
"data": {
"amount": 1450000,
"currency": "CRC",
"description": "PAGO DE SERVICIOS",
"SINPERefNumber": "2025110312774577852010",
"authorizationDate": "2026-04-29T16:30:00.000Z",
"originId": "01-1393-1919",
"originName": "JUAN PEREZ CASTRO",
"originPhone": "72940567"
}
}
```
## Security
Each webhook has an assigned secret. You can view it in the ONVO Dashboard next to the webhook configuration.
ONVO includes that value in the `X-Webhook-Secret` header. The backend generates secrets with the `webhook_secret_` prefix. Use it to verify that the request comes from ONVO before processing the event.
```http
X-Webhook-Secret: webhook_secret_...
```
## Responses and errors
When an event represents an error, the payload object can include an `error` attribute. That object can contain:
| Field | Description |
| --- | --- |
| `message` | Human-readable error description. |
| `code` | Error code, when available. |
| `type` | Error type, when available. |
Your endpoint should respond with a `2xx` status only when the event was received and processed correctly. If you respond with another status, ONVO records the delivery as failed.
Your system should tolerate events received out of order.
---
# Update a Checkout Session Customer
URL: https://docs.onvopay.com/en/api/actualizar-cliente-de-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/actualizar-cliente-de-una-sesion-de-checkout.md
# Update a Checkout Session Customer
Updates the customer's contact information in a Checkout Session.
Endpoint: `PATCH /v1/checkout/sessions/{id}/customer`
Human page: https://docs.onvopay.com/en/api/actualizar-cliente-de-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Subscription Item
URL: https://docs.onvopay.com/en/api/actualizar-item-de-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/actualizar-item-de-un-cargo-recurrente.md
# Update a Subscription Item
See the ONVO documentation for integration details and examples.
Endpoint: `PATCH /v1/subscriptions/{id}/items/{item}`
Human page: https://docs.onvopay.com/en/api/actualizar-item-de-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Checkout Session Item
URL: https://docs.onvopay.com/en/api/actualizar-item-de-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/actualizar-item-de-una-sesion-de-checkout.md
# Update a Checkout Session Item
Updates the selected item in an open Checkout Session.
Endpoint: `POST /v1/checkout/sessions/{id}/line-item`
Human page: https://docs.onvopay.com/en/api/actualizar-item-de-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Subscription
URL: https://docs.onvopay.com/en/api/actualizar-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/actualizar-un-cargo-recurrente.md
# Update a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/subscriptions/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Customer
URL: https://docs.onvopay.com/en/api/actualizar-un-cliente
Markdown: https://docs.onvopay.com/en/api/actualizar-un-cliente.md
# Update a Customer
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/customers/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Coupon
URL: https://docs.onvopay.com/en/api/actualizar-un-cupon
Markdown: https://docs.onvopay.com/en/api/actualizar-un-cupon.md
# Update a Coupon
Updates a coupon. When you send `binRules` or `promotionCodes`, ONVO replaces the previous list with the list you sent.
Endpoint: `POST /v1/coupons/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-cupon
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Payment Method
URL: https://docs.onvopay.com/en/api/actualizar-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/actualizar-un-metodo-de-pago.md
# Update a Payment Method
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-methods/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Price
URL: https://docs.onvopay.com/en/api/actualizar-un-precio
Markdown: https://docs.onvopay.com/en/api/actualizar-un-precio.md
# Update a Price
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/prices/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-precio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Product
URL: https://docs.onvopay.com/en/api/actualizar-un-producto
Markdown: https://docs.onvopay.com/en/api/actualizar-un-producto.md
# Update a Product
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/products/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-un-producto
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Connected Account
URL: https://docs.onvopay.com/en/api/actualizar-una-cuenta-conectada
Markdown: https://docs.onvopay.com/en/api/actualizar-una-cuenta-conectada.md
# Update a Connected Account
Updates the connected account business name, marketplace fee percentage, or both.
Endpoint: `POST /v1/connected-accounts/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-una-cuenta-conectada
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Payment Intent
URL: https://docs.onvopay.com/en/api/actualizar-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/actualizar-una-intencion-de-pago.md
# Update a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-intents/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Update a Shipping Rate
URL: https://docs.onvopay.com/en/api/actualizar-una-tarifa-de-envio
Markdown: https://docs.onvopay.com/en/api/actualizar-una-tarifa-de-envio.md
# Update a Shipping Rate
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/shipping-rates/{id}`
Human page: https://docs.onvopay.com/en/api/actualizar-una-tarifa-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Add an Item to a Subscription
URL: https://docs.onvopay.com/en/api/agregar-item-a-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/agregar-item-a-un-cargo-recurrente.md
# Add an Item to a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/subscriptions/{id}/items`
Human page: https://docs.onvopay.com/en/api/agregar-item-a-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Subscription Item
URL: https://docs.onvopay.com/en/api/borrar-item-de-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/borrar-item-de-un-cargo-recurrente.md
# Delete a Subscription Item
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/subscriptions/{id}/items/{itemId}`
Human page: https://docs.onvopay.com/en/api/borrar-item-de-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Customer
URL: https://docs.onvopay.com/en/api/borrar-un-cliente
Markdown: https://docs.onvopay.com/en/api/borrar-un-cliente.md
# Delete a Customer
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/customers/{id}`
Human page: https://docs.onvopay.com/en/api/borrar-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Coupon
URL: https://docs.onvopay.com/en/api/borrar-un-cupon
Markdown: https://docs.onvopay.com/en/api/borrar-un-cupon.md
# Delete a Coupon
Deletes a coupon by its identifier.
Endpoint: `DELETE /v1/coupons/{id}`
Human page: https://docs.onvopay.com/en/api/borrar-un-cupon
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Price
URL: https://docs.onvopay.com/en/api/borrar-un-precio
Markdown: https://docs.onvopay.com/en/api/borrar-un-precio.md
# Delete a Price
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/prices/{id}`
Human page: https://docs.onvopay.com/en/api/borrar-un-precio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Product
URL: https://docs.onvopay.com/en/api/borrar-un-producto
Markdown: https://docs.onvopay.com/en/api/borrar-un-producto.md
# Delete a Product
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/products/{id}`
Human page: https://docs.onvopay.com/en/api/borrar-un-producto
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Delete a Shipping Rate
URL: https://docs.onvopay.com/en/api/borrar-una-tarifa-de-envio
Markdown: https://docs.onvopay.com/en/api/borrar-una-tarifa-de-envio.md
# Delete a Shipping Rate
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/shipping-rates/{id}`
Human page: https://docs.onvopay.com/en/api/borrar-una-tarifa-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Cancel a Subscription
URL: https://docs.onvopay.com/en/api/cancelar-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/cancelar-un-cargo-recurrente.md
# Cancel a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `DELETE /v1/subscriptions/{id}`
Human page: https://docs.onvopay.com/en/api/cancelar-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Cancel a Payment Intent
URL: https://docs.onvopay.com/en/api/cancelar-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/cancelar-una-intencion-de-pago.md
# Cancel a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-intents/{id}/cancel`
Human page: https://docs.onvopay.com/en/api/cancelar-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Capture a Payment Intent
URL: https://docs.onvopay.com/en/api/capturar-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/capturar-una-intencion-de-pago.md
# Capture a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-intents/{id}/capture`
Human page: https://docs.onvopay.com/en/api/capturar-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Subscriptions
URL: https://docs.onvopay.com/en/api/cargos-recurrentes
Markdown: https://docs.onvopay.com/en/api/cargos-recurrentes.md
# Subscriptions
Cargos recurrentes
Human page: https://docs.onvopay.com/en/api/cargos-recurrentes
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Customers
URL: https://docs.onvopay.com/en/api/clientes
Markdown: https://docs.onvopay.com/en/api/clientes.md
# Customers
Clientes
Human page: https://docs.onvopay.com/en/api/clientes
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Configure a Weekly Fee
URL: https://docs.onvopay.com/en/api/configurar-una-tarifa-semanal
Markdown: https://docs.onvopay.com/en/api/configurar-una-tarifa-semanal.md
# Configure a Weekly Fee
Creates or updates the fixed weekly fee configuration for a connected account owned by the authenticated primary account and mode.
Endpoint: `POST /v1/connected-accounts/{id}/weekly-fees`
Human page: https://docs.onvopay.com/en/api/configurar-una-tarifa-semanal
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Confirm a Subscription
URL: https://docs.onvopay.com/en/api/confirmar-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/confirmar-un-cargo-recurrente.md
# Confirm a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/subscriptions/{id}/confirm`
Human page: https://docs.onvopay.com/en/api/confirmar-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Confirm a Payment Intent
URL: https://docs.onvopay.com/en/api/confirmar-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/confirmar-una-intencion-de-pago.md
# Confirm a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-intents/{id}/confirm`
Human page: https://docs.onvopay.com/en/api/confirmar-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Confirm a Checkout Session
URL: https://docs.onvopay.com/en/api/confirmar-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/confirmar-una-sesion-de-checkout.md
# Confirm a Checkout Session
Confirms a Checkout Session with the selected payment method.
Endpoint: `POST /v1/checkout/sessions/{id}/confirm`
Human page: https://docs.onvopay.com/en/api/confirmar-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Subscription
URL: https://docs.onvopay.com/en/api/crear-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/crear-un-cargo-recurrente.md
# Create a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/subscriptions`
Human page: https://docs.onvopay.com/en/api/crear-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Customer
URL: https://docs.onvopay.com/en/api/crear-un-cliente
Markdown: https://docs.onvopay.com/en/api/crear-un-cliente.md
# Create a Customer
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/customers`
Human page: https://docs.onvopay.com/en/api/crear-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Coupon
URL: https://docs.onvopay.com/en/api/crear-un-cupon
Markdown: https://docs.onvopay.com/en/api/crear-un-cupon.md
# Create a Coupon
Creates a coupon that you can later attach to a one-time Checkout Session.
Endpoint: `POST /v1/coupons`
Human page: https://docs.onvopay.com/en/api/crear-un-cupon
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Payment Method
URL: https://docs.onvopay.com/en/api/crear-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/crear-un-metodo-de-pago.md
# Create a Payment Method
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-methods`
Human page: https://docs.onvopay.com/en/api/crear-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Price
URL: https://docs.onvopay.com/en/api/crear-un-precio
Markdown: https://docs.onvopay.com/en/api/crear-un-precio.md
# Create a Price
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/prices`
Human page: https://docs.onvopay.com/en/api/crear-un-precio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Product
URL: https://docs.onvopay.com/en/api/crear-un-producto
Markdown: https://docs.onvopay.com/en/api/crear-un-producto.md
# Create a Product
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/products`
Human page: https://docs.onvopay.com/en/api/crear-un-producto
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Refund
URL: https://docs.onvopay.com/en/api/crear-un-reembolso
Markdown: https://docs.onvopay.com/en/api/crear-un-reembolso.md
# Create a Refund
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/refunds`
Human page: https://docs.onvopay.com/en/api/crear-un-reembolso
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Connected Account
URL: https://docs.onvopay.com/en/api/crear-una-cuenta-conectada
Markdown: https://docs.onvopay.com/en/api/crear-una-cuenta-conectada.md
# Create a Connected Account
Creates a connected seller account in the primary account and mode determined by the Secret API Key. The response includes the ONVO-hosted onboarding URL.
Endpoint: `POST /v1/connected-accounts`
Human page: https://docs.onvopay.com/en/api/crear-una-cuenta-conectada
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Payment Intent
URL: https://docs.onvopay.com/en/api/crear-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/crear-una-intencion-de-pago.md
# Create a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-intents`
Human page: https://docs.onvopay.com/en/api/crear-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Checkout Session
URL: https://docs.onvopay.com/en/api/crear-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/crear-una-sesion-de-checkout.md
# Create a Checkout Session
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/checkout/sessions/one-time-link`
Human page: https://docs.onvopay.com/en/api/crear-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Session from a Payment Link
URL: https://docs.onvopay.com/en/api/crear-una-sesion-desde-un-link-de-pago
Markdown: https://docs.onvopay.com/en/api/crear-una-sesion-desde-un-link-de-pago.md
# Create a Session from a Payment Link
Creates a Checkout Session from an existing payment link.
Endpoint: `GET /v1/checkout/sessions/link/{paymentLinkId}`
Human page: https://docs.onvopay.com/en/api/crear-una-sesion-desde-un-link-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Create a Shipping Rate
URL: https://docs.onvopay.com/en/api/crear-una-tarifa-de-envio
Markdown: https://docs.onvopay.com/en/api/crear-una-tarifa-de-envio.md
# Create a Shipping Rate
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/shipping-rates`
Human page: https://docs.onvopay.com/en/api/crear-una-tarifa-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Coupons
URL: https://docs.onvopay.com/en/api/cupones
Markdown: https://docs.onvopay.com/en/api/cupones.md
# Coupons
Create and manage coupons that can be applied to Checkout.
Human page: https://docs.onvopay.com/en/api/cupones
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Disconnect a Payment Method
URL: https://docs.onvopay.com/en/api/desconectar-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/desconectar-un-metodo-de-pago.md
# Disconnect a Payment Method
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/payment-methods/{id}/detach`
Human page: https://docs.onvopay.com/en/api/desconectar-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Expire a Checkout Session
URL: https://docs.onvopay.com/en/api/expirar-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/expirar-una-sesion-de-checkout.md
# Expire a Checkout Session
See the ONVO documentation for integration details and examples.
Endpoint: `POST /v1/checkout/sessions/{id}/expire`
Human page: https://docs.onvopay.com/en/api/expirar-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Payment Intents
URL: https://docs.onvopay.com/en/api/intenciones-de-pago
Markdown: https://docs.onvopay.com/en/api/intenciones-de-pago.md
# Payment Intents
Intenciones de pago
Human page: https://docs.onvopay.com/en/api/intenciones-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List Connected Accounts
URL: https://docs.onvopay.com/en/api/listar-cuentas-conectadas
Markdown: https://docs.onvopay.com/en/api/listar-cuentas-conectadas.md
# List Connected Accounts
Lists connected seller accounts owned by the primary account in the Secret API Key mode, using cursor pagination.
Endpoint: `GET /v1/connected-accounts`
Human page: https://docs.onvopay.com/en/api/listar-cuentas-conectadas
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List Coupons
URL: https://docs.onvopay.com/en/api/listar-cupones
Markdown: https://docs.onvopay.com/en/api/listar-cupones.md
# List Coupons
Lists coupons created in the API key mode.
Endpoint: `GET /v1/coupons`
Human page: https://docs.onvopay.com/en/api/listar-cupones
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List SINPE Movil Payments
URL: https://docs.onvopay.com/en/api/listar-pagos-por-sinpe-movil
Markdown: https://docs.onvopay.com/en/api/listar-pagos-por-sinpe-movil.md
# List SINPE Movil Payments
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/mobile-transfers/list`
Human page: https://docs.onvopay.com/en/api/listar-pagos-por-sinpe-movil
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Invoices
URL: https://docs.onvopay.com/en/api/listar-renovaciones
Markdown: https://docs.onvopay.com/en/api/listar-renovaciones.md
# List all Invoices
Lists invoices for the account. Invoices represent each billing period for a subscription. ONVO creates an invoice at the start of the subscription and on each successful renewal. Each invoice is associated with a payment intent and lets you inspect the charge for that period. The URL examples show how to send pagination, range, metadata, and expand filters.
Endpoint: `GET /v1/invoices`
Human page: https://docs.onvopay.com/en/api/listar-renovaciones
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List Checkout Sessions
URL: https://docs.onvopay.com/en/api/listar-sesiones-de-checkout
Markdown: https://docs.onvopay.com/en/api/listar-sesiones-de-checkout.md
# List Checkout Sessions
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/checkout/sessions/one-time-link/account`
Human page: https://docs.onvopay.com/en/api/listar-sesiones-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Payment Intents
URL: https://docs.onvopay.com/en/api/listar-todas-las-intenciones-de-pago
Markdown: https://docs.onvopay.com/en/api/listar-todas-las-intenciones-de-pago.md
# List all Payment Intents
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/payment-intents/account`
Human page: https://docs.onvopay.com/en/api/listar-todas-las-intenciones-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Shipping Rates
URL: https://docs.onvopay.com/en/api/listar-todas-las-tarifas-de-envio
Markdown: https://docs.onvopay.com/en/api/listar-todas-las-tarifas-de-envio.md
# List all Shipping Rates
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/shipping-rates`
Human page: https://docs.onvopay.com/en/api/listar-todas-las-tarifas-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Subscriptions
URL: https://docs.onvopay.com/en/api/listar-todos-los-cargos-recurrentes
Markdown: https://docs.onvopay.com/en/api/listar-todos-los-cargos-recurrentes.md
# List all Subscriptions
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/subscriptions`
Human page: https://docs.onvopay.com/en/api/listar-todos-los-cargos-recurrentes
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Customers
URL: https://docs.onvopay.com/en/api/listar-todos-los-clientes
Markdown: https://docs.onvopay.com/en/api/listar-todos-los-clientes.md
# List all Customers
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/customers`
Human page: https://docs.onvopay.com/en/api/listar-todos-los-clientes
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Payment Methods
URL: https://docs.onvopay.com/en/api/listar-todos-los-metodos-de-pago
Markdown: https://docs.onvopay.com/en/api/listar-todos-los-metodos-de-pago.md
# List all Payment Methods
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/payment-methods`
Human page: https://docs.onvopay.com/en/api/listar-todos-los-metodos-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Prices
URL: https://docs.onvopay.com/en/api/listar-todos-los-precios
Markdown: https://docs.onvopay.com/en/api/listar-todos-los-precios.md
# List all Prices
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/prices`
Human page: https://docs.onvopay.com/en/api/listar-todos-los-precios
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List all Products
URL: https://docs.onvopay.com/en/api/listar-todos-los-productos
Markdown: https://docs.onvopay.com/en/api/listar-todos-los-productos.md
# List all Products
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/products`
Human page: https://docs.onvopay.com/en/api/listar-todos-los-productos
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Marketplaces
URL: https://docs.onvopay.com/en/api/marketplaces
Markdown: https://docs.onvopay.com/en/api/marketplaces.md
# Marketplaces
Create and manage connected seller accounts from a standard primary account.
Human page: https://docs.onvopay.com/en/api/marketplaces
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Payment Methods
URL: https://docs.onvopay.com/en/api/metodos-de-pago
Markdown: https://docs.onvopay.com/en/api/metodos-de-pago.md
# Payment Methods
Métodos de pago
Human page: https://docs.onvopay.com/en/api/metodos-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List a Customer's Payment Intents
URL: https://docs.onvopay.com/en/api/obtener-las-intenciones-de-pago-de-un-cliente
Markdown: https://docs.onvopay.com/en/api/obtener-las-intenciones-de-pago-de-un-cliente.md
# List a Customer's Payment Intents
Lists the payment intents associated with a customer.
Endpoint: `GET /v1/customers/{id}/payment-intents`
Human page: https://docs.onvopay.com/en/api/obtener-las-intenciones-de-pago-de-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List a Customer's Subscriptions
URL: https://docs.onvopay.com/en/api/obtener-los-cargos-recurrentes-de-un-cliente
Markdown: https://docs.onvopay.com/en/api/obtener-los-cargos-recurrentes-de-un-cliente.md
# List a Customer's Subscriptions
Lists the subscriptions associated with a customer.
Endpoint: `GET /v1/customers/{id}/subscriptions`
Human page: https://docs.onvopay.com/en/api/obtener-los-cargos-recurrentes-de-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# List a Customer's Payment Methods
URL: https://docs.onvopay.com/en/api/obtener-los-metodos-de-pago-de-un-cliente
Markdown: https://docs.onvopay.com/en/api/obtener-los-metodos-de-pago-de-un-cliente.md
# List a Customer's Payment Methods
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/customers/{id}/payment-methods`
Human page: https://docs.onvopay.com/en/api/obtener-los-metodos-de-pago-de-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Subscription
URL: https://docs.onvopay.com/en/api/obtener-un-cargo-recurrente
Markdown: https://docs.onvopay.com/en/api/obtener-un-cargo-recurrente.md
# Retrieve a Subscription
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/subscriptions/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-cargo-recurrente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Customer
URL: https://docs.onvopay.com/en/api/obtener-un-cliente
Markdown: https://docs.onvopay.com/en/api/obtener-un-cliente.md
# Retrieve a Customer
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/customers/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-cliente
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Coupon
URL: https://docs.onvopay.com/en/api/obtener-un-cupon
Markdown: https://docs.onvopay.com/en/api/obtener-un-cupon.md
# Retrieve a Coupon
Returns a coupon by its identifier.
Endpoint: `GET /v1/coupons/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-cupon
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Payment Link
URL: https://docs.onvopay.com/en/api/obtener-un-link-de-pago
Markdown: https://docs.onvopay.com/en/api/obtener-un-link-de-pago.md
# Retrieve a Payment Link
Returns a payment link created from Checkout.
Endpoint: `GET /v1/checkout/sessions/one-time-link/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-link-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Payment Method
URL: https://docs.onvopay.com/en/api/obtener-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/obtener-un-metodo-de-pago.md
# Retrieve a Payment Method
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/payment-methods/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Price
URL: https://docs.onvopay.com/en/api/obtener-un-precio
Markdown: https://docs.onvopay.com/en/api/obtener-un-precio.md
# Retrieve a Price
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/prices/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-precio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Product
URL: https://docs.onvopay.com/en/api/obtener-un-producto
Markdown: https://docs.onvopay.com/en/api/obtener-un-producto.md
# Retrieve a Product
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/products/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-producto
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Refund
URL: https://docs.onvopay.com/en/api/obtener-un-reembolso
Markdown: https://docs.onvopay.com/en/api/obtener-un-reembolso.md
# Retrieve a Refund
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/refunds/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-un-reembolso
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Connected Account
URL: https://docs.onvopay.com/en/api/obtener-una-cuenta-conectada
Markdown: https://docs.onvopay.com/en/api/obtener-una-cuenta-conectada.md
# Retrieve a Connected Account
Returns the public connected account object when it belongs to the authenticated primary account and mode.
Endpoint: `GET /v1/connected-accounts/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-una-cuenta-conectada
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Payment Intent
URL: https://docs.onvopay.com/en/api/obtener-una-intencion-de-pago
Markdown: https://docs.onvopay.com/en/api/obtener-una-intencion-de-pago.md
# Retrieve a Payment Intent
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/payment-intents/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-una-intencion-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve an Invoice
URL: https://docs.onvopay.com/en/api/obtener-una-renovacion
Markdown: https://docs.onvopay.com/en/api/obtener-una-renovacion.md
# Retrieve an Invoice
Returns a specific invoice. Invoices represent each billing period for a subscription. ONVO creates an invoice at the start of the subscription and on each successful renewal. Each invoice is associated with a payment intent and lets you inspect the charge for that period.
Endpoint: `GET /v1/invoices/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-una-renovacion
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Checkout Session
URL: https://docs.onvopay.com/en/api/obtener-una-sesion-de-checkout
Markdown: https://docs.onvopay.com/en/api/obtener-una-sesion-de-checkout.md
# Retrieve a Checkout Session
Returns a Checkout Session by its identifier.
Endpoint: `GET /v1/checkout/sessions/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-una-sesion-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Shipping Rate
URL: https://docs.onvopay.com/en/api/obtener-una-tarifa-de-envio
Markdown: https://docs.onvopay.com/en/api/obtener-una-tarifa-de-envio.md
# Retrieve a Shipping Rate
See the ONVO documentation for integration details and examples.
Endpoint: `GET /v1/shipping-rates/{id}`
Human page: https://docs.onvopay.com/en/api/obtener-una-tarifa-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Retrieve a Payment Method Verification
URL: https://docs.onvopay.com/en/api/obtener-verificacion-de-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/obtener-verificacion-de-un-metodo-de-pago.md
# Retrieve a Payment Method Verification
Returns the verification status associated with a payment method.
Endpoint: `GET /v1/payment-methods/{id}/verification`
Human page: https://docs.onvopay.com/en/api/obtener-verificacion-de-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Prices
URL: https://docs.onvopay.com/en/api/precios
Markdown: https://docs.onvopay.com/en/api/precios.md
# Prices
Precios
Human page: https://docs.onvopay.com/en/api/precios
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Products
URL: https://docs.onvopay.com/en/api/productos
Markdown: https://docs.onvopay.com/en/api/productos.md
# Products
Productos
Human page: https://docs.onvopay.com/en/api/productos
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Refunds
URL: https://docs.onvopay.com/en/api/reembolsos
Markdown: https://docs.onvopay.com/en/api/reembolsos.md
# Refunds
Reembolsos
Human page: https://docs.onvopay.com/en/api/reembolsos
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Regenerate an Onboarding Link
URL: https://docs.onvopay.com/en/api/regenerar-enlace-de-onboarding
Markdown: https://docs.onvopay.com/en/api/regenerar-enlace-de-onboarding.md
# Regenerate an Onboarding Link
Expires the prior onboarding link and creates a new ONVO-hosted link for a connected account that has not completed onboarding.
Endpoint: `POST /v1/connected-accounts/{id}/onboarding-link`
Human page: https://docs.onvopay.com/en/api/regenerar-enlace-de-onboarding
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Invoices
URL: https://docs.onvopay.com/en/api/renovaciones
Markdown: https://docs.onvopay.com/en/api/renovaciones.md
# Invoices
Renovaciones
Human page: https://docs.onvopay.com/en/api/renovaciones
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Checkout Sessions
URL: https://docs.onvopay.com/en/api/sesiones-de-checkout
Markdown: https://docs.onvopay.com/en/api/sesiones-de-checkout.md
# Checkout Sessions
Sesiones de Checkout
Human page: https://docs.onvopay.com/en/api/sesiones-de-checkout
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# SINPE Movil
URL: https://docs.onvopay.com/en/api/sinpe-movil
Markdown: https://docs.onvopay.com/en/api/sinpe-movil.md
# SINPE Movil
SINPE Móvil
Human page: https://docs.onvopay.com/en/api/sinpe-movil
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Shipping Rates
URL: https://docs.onvopay.com/en/api/tarifas-de-envio
Markdown: https://docs.onvopay.com/en/api/tarifas-de-envio.md
# Shipping Rates
Tarifas de envío
Human page: https://docs.onvopay.com/en/api/tarifas-de-envio
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Validate Bank Account Information
URL: https://docs.onvopay.com/en/api/validar-informacion-de-una-cuenta-bancaria
Markdown: https://docs.onvopay.com/en/api/validar-informacion-de-una-cuenta-bancaria.md
# Validate Bank Account Information
Validates a bank account's status, currency, and verification before creating or confirming a payment method.
Endpoint: `POST /v1/bank-accounts/check-info`
Human page: https://docs.onvopay.com/en/api/validar-informacion-de-una-cuenta-bancaria
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# Verify a Payment Method
URL: https://docs.onvopay.com/en/api/verificar-un-metodo-de-pago
Markdown: https://docs.onvopay.com/en/api/verificar-un-metodo-de-pago.md
# Verify a Payment Method
Verifies a payment method that requires manual confirmation, such as a bank account.
Endpoint: `POST /v1/payment-methods/{id}/verify`
Human page: https://docs.onvopay.com/en/api/verificar-un-metodo-de-pago
OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
---
# ONVO API Reference
The ONVO API reference is generated from the OpenAPI document and rendered in the documentation site.
- API reference: https://docs.onvopay.com/en/api
- OpenAPI YAML: https://docs.onvopay.com/openapi.yaml
Use the OpenAPI file for code generation, API clients, and agentic integration workflows.