PUBLIC API · V1
Charge from your code
Create a checkout link with one API call. Your customer pays with the methods available in their country. You get notified when the money clears.
01 — OVERVIEW
What you can do with the API
The API is small on purpose. Almost everything starts with creating a checkout and listening for payment updates.
Create payment links
POST a Checkout Preference and get a checkout_url you can send to any customer.
Accept local payment methods
Checkout detects the payer's country and shows cards, bank transfer, PIX, or crypto when available. Currency conversion is handled for you.
Know when you got paid
Receive webhooks on every Payment Order status change, then fetch the full order when you need the details.
02 — MODEL
Two objects you need to know
Checkout Preference is the link you create. Payment Order is what appears once a customer starts paying.
You create a Checkout Preference
Your backend calls the API with amount, currency, and title. ONE returns a checkout_url.
Your customer pays
They open the link, pick a local method, and complete the payment. That creates a Payment Order.
You get a webhook
ONE POSTs a small event to your URL when the order status changes (opened, closed, expired…).
You fetch the order
Use the entity_id from the webhook to GET the Payment Order and confirm the final state.
03 — QUICKSTART
Go live in three steps
You do not need an SDK. Keys, a staging base URL, and one POST are enough to see a real checkout.
- 01
Create API keys
In the ONE Dashboard go to Integrations and generate your x-api-key and x-api-secret.
- 02
Use staging first
Build against api.stg.one.lat. You can only request a staging account if you already have an approved, active production account — contact support.
- 03
Create your first checkout
POST /v1/checkout_preferences, open the checkout_url, complete a test payment, and watch the webhook arrive.
04 — AUTH
Authentication
Every request to the API must include both security headers.
Send x-api-key and x-api-secret on every call. Create and rotate keys from the dashboard under Integrations.
05 — ENV
Environments
Same paths in staging and production. Only the host changes.
Staging
https://api.stg.one.latProduction
https://api.one.lat06 — CORE
Create a checkout
This is the main endpoint. It creates a one-time payment request and returns the URL your customer uses to pay.
/v1/checkout_preferencesRequest body
| Field | Type | Required | Description |
|---|---|---|---|
amount | float | Yes | Charge amount. Equivalent limits apply around 10–1500 USD. |
currency | string | Yes | ISO currency of the amount (USD, ARS, BRL, COP, MXN). |
title | string | Yes | What the customer sees on checkout, e.g. course name. |
origin | string | Yes | API |
external_id | string | No | Your own unique id to reconcile the payment later. |
expiration_date | string (RFC3339) | No | RFC3339 date. Max 1 week ahead. Defaults to 15 minutes if omitted. |
payer.email | string | No | If provided, checkout can skip asking for email. |
payer.first_name | string | No | Payer first name. |
payer.last_name | string | No | Payer last name. |
payer.phone_number | string | No | Payer phone with country code. |
selected_payment_method_id | string | No | Skip method selection and lock a specific payment method. |
custom_urls.status_changes_webhook | string (URL) | No | Your endpoint for Payment Order status-change notifications. |
Example request
curl 'https://api.one.lat/v1/checkout_preferences' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'x-api-secret: YOUR_API_SECRET' \
--header 'Content-Type: application/json' \
--data '{
"amount": 25,
"currency": "USD",
"origin": "API",
"title": "Introductory course to Blockchain",
"external_id": "order_1234",
"payer": {
"email": "luca@test.com",
"first_name": "Luca",
"last_name": "Dorain",
"phone_number": "+521142567689"
},
"custom_urls": {
"status_changes_webhook": "https://api.mycompany.io/webhook"
}
}'Example response
Share checkout_url with your customer. Checkout shows only the payment methods available in their country.
{
"id": "qwDsh9aMoywPOiUx0O",
"amount": 25,
"currency": "USD",
"created_at": "2025-02-25T14:11:29Z",
"expiration_date": "2025-02-26T15:02:50Z",
"origin": "API",
"external_id": "order_1234",
"title": "Introductory course to Blockchain",
"type": "PAYMENT",
"checkout_url": "https://one.lat/checkout/qwDsh9aMoywPOiUx0O",
"payer": {
"email": "luca@test.com",
"first_name": "Luca",
"last_name": "Dorain",
"phone_number": "+521142567689"
}
}07 — LOOKUPS
Lookup endpoints
Use these after creating a checkout, or when a webhook tells you something changed.
Get a Checkout Preference
Retrieve a preference you already created by id.
/v1/checkout_preferences/:idGet a Payment Order
A Payment Order is created when the payer enters checkout, selects a method, and submits their details. Fetch it to confirm status after a webhook.
/v1/payment_orders/:id{
"id": "gRV8xTZHPv9lNxSLPw",
"amount": 16.9,
"currency": "USD",
"created_at": "2024-06-12T15:26:47Z",
"expired_at": "2024-06-12T15:56:47Z",
"updated_at": "2024-06-12T15:31:28Z",
"status": "CLOSED",
"title": "Test product",
"origin": "PAYMENT_LINK",
"external_id": "1234",
"payment_method_type": "BANK_TRANSFER",
"payer": {
"email": "payer@gmail.com",
"first_name": "Joan",
"last_name": "Kohler",
"phone_number": "+542614215688"
}
}Get a Refund
When you receive REFUND.SUCCEEDED, use the entity_id to fetch the refund and confirm amount, currency, and linked payment order.
/v1/refunds/:idcurl 'https://api.one.lat/v1/refunds/1dUPlZbsDABq3bIEOG' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'x-api-secret: YOUR_API_SECRET'{
"id": "1dUPlZbsDABq3bIEOG",
"payment_order_id": "IwyOQSzfuEt80W9WNS",
"amount": 100,
"currency": "USD",
"status": "SUCCEEDED",
"created_at": "2025-12-08T22:42:52Z",
"updated_at": "2025-12-08T23:12:48Z"
}List payment methods
See which methods are enabled for your account, with limits, currency, and country.
/v1/payment_methods[
{
"id": "vJKtkYs8Vf",
"status": "ENABLED",
"type": "BANK_TRANSFER",
"country_id": "ARG",
"currency": "ARS",
"max_amount": 10000000,
"min_amount": 0
},
{
"id": "qacV3z31cz",
"status": "ENABLED",
"type": "CRYPTO_ONCHAIN",
"country_id": "ALL",
"currency": "USDT",
"network": { "id": "TRON", "name": "Tron" },
"min_amount": 0.1,
"max_amount": 100000
}
]Common types: BANK_TRANSFER · PIX · CRYPTO_ONCHAIN
08 — EVENTS
Webhooks
Webhooks are status-change alerts. They are intentionally small: treat them as a signal, then fetch the entity.
Configure a webhook URL
Pass custom_urls.status_changes_webhook when you create the Checkout Preference.
{
"custom_urls": {
"status_changes_webhook": "https://api.mycompany.io/webhook"
}
}Need one URL for every notification on the account? Contact support to set it at account level.
Notification payload
For Payment Order events, call GET /v1/payment_orders/:id with entity_id to get the latest version.
{
"id": "uCEarm1kXJsroMQ6dt",
"event_type": "PAYMENT_ORDER.CLOSED",
"entity_type": "PAYMENT_ORDER",
"entity_id": "rcAaNfKdKJRmrnj4l5"
}Refund notifications
When a refund completes you get REFUND.SUCCEEDED. Then call GET /v1/refunds/:id with entity_id.
{
"id": "nR8kLm2pQxYtVw4HsZ",
"event_type": "REFUND.SUCCEEDED",
"entity_type": "REFUND",
"entity_id": "1dUPlZbsDABq3bIEOG"
}Event types
Payment Order
PAYMENT_ORDER.OPENEDPAYMENT_ORDER.CLOSEDPAYMENT_ORDER.REJECTEDPAYMENT_ORDER.EXPIRED
Refund
REFUND.SUCCEEDED
Your webhook handler should be idempotent. The id field is unique per notification.
09 — REFERENCE
Status codes & currencies
Quick lookup tables for Payment Order statuses, refunds, and supported currencies.
Payment Order statuses
| Code | Description |
|---|---|
OPENED | Created and waiting for the customer to pay. |
CLOSED | Paid successfully. The process is complete. |
REJECTED | Declined by the processor or the customer's bank. |
EXPIRED | Expired before payment was received. |
Refund statuses
| Code | Description |
|---|---|
SUCCEEDED | The refund completed successfully. |
Currencies
| Code | Description |
|---|---|
USD | US dollars |
ARS | Argentine pesos |
BRL | Brazilian reais |
COP | Colombian pesos |
MXN | Mexican pesos |