A PURCHASE payment is used when an end customer pays for goods, services, invoices, or a checkout event. The origin is the customer’s pay-in rail. The destination is the merchant or platform ACCOUNT that should receive the collected value.
Note Use PURCHASE when the payment represents a commercial event. Use TOPUP_ACCOUNT when the user is only funding an internal balance.
01 Discover rails Call available products for the customer currency.
02 Create purchase Send a PURCHASE payment with a pay-in origin and account destination.
03 Send customer Redirect or show the provider instruction returned by the rail.
04 Capture Capture when authorization is complete.
05 Fulfill Use webhooks as the final source of truth.
Request HTTP curl JavaScript Python Go Rust
POST /sandbox/payments HTTP / 1.1
Host: api.conomyhq.com
x-api-key: {YOUR_API_KEY}
Authorization: Bearer {ACCESS_TOKEN}
conomyhq-api-version: 24-04-2025
User-Agent: MyApp/1.0
Content-Type: application/json
Accept: application/json
{
" externalId " : " order-1001 " ,
" identityId " : " <MERCHANT_IDENTITY_ID> " ,
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> " ,
" product " : " CLP:CLP " ,
" type " : " PURCHASE " ,
" purchaseAmount " : " 49990 " ,
" purchaseCurrency " : " CLP " ,
" currency " : " CLP " ,
" origins " : [
{
" type " : " ETPAY " ,
" currency " : " CLP " ,
" etpay " : {
" successUrl " : " https://yourapp.com/orders/1001/success " ,
" failedUrl " : " https://yourapp.com/orders/1001/failed " ,
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}
}
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
]
} curl -X POST ' https://api.conomyhq.com/sandbox/payments ' \
-H ' x-api-key: {YOUR_API_KEY} ' \
-H ' Authorization: Bearer {ACCESS_TOKEN} ' \
-H ' conomyhq-api-version: 24-04-2025 ' \
-H ' User-Agent: MyApp/1.0 ' \
-H ' Content-Type: application/json ' \
-H ' Accept: application/json ' \
-d ' {
"externalId": "order-1001",
"identityId": "<MERCHANT_IDENTITY_ID>",
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>",
"product": "CLP:CLP",
"type": "PURCHASE",
"purchaseAmount": "49990",
"purchaseCurrency": "CLP",
"currency": "CLP",
"origins": [
{
"type": "ETPAY",
"currency": "CLP",
"etpay": {
"successUrl": "https://yourapp.com/orders/1001/success",
"failedUrl": "https://yourapp.com/orders/1001/failed",
"customer": {
"firstName": "Jane",
"email": "jane@example.com"
}
}
}
],
"destinations": [
{
"type": "ACCOUNT",
"amount": "49990",
"currency": "CLP",
"identity": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"account": {
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>"
}
}
]
} ' const response = await fetch ( ' https://api.conomyhq.com/sandbox/payments ' , {
method : ' POST ' ,
headers : {
' x-api-key ' : ' {YOUR_API_KEY} ' ,
' Authorization ' : ' Bearer {ACCESS_TOKEN} ' ,
' conomyhq-api-version ' : ' 24-04-2025 ' ,
' User-Agent ' : ' MyApp/1.0 ' ,
' Content-Type ' : ' application/json ' ,
' Accept ' : ' application/json ' ,
},
body : JSON . stringify ({
" externalId " : " order-1001 " ,
" identityId " : " <MERCHANT_IDENTITY_ID> " ,
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> " ,
" product " : " CLP:CLP " ,
" type " : " PURCHASE " ,
" purchaseAmount " : " 49990 " ,
" purchaseCurrency " : " CLP " ,
" currency " : " CLP " ,
" origins " : [
{
" type " : " ETPAY " ,
" currency " : " CLP " ,
" etpay " : {
" successUrl " : " https://yourapp.com/orders/1001/success " ,
" failedUrl " : " https://yourapp.com/orders/1001/failed " ,
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}
}
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
]
}),
});
const data = await response . json (); import requests
payload = {
" externalId " : " order-1001 " ,
" identityId " : " <MERCHANT_IDENTITY_ID> " ,
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> " ,
" product " : " CLP:CLP " ,
" type " : " PURCHASE " ,
" purchaseAmount " : " 49990 " ,
" purchaseCurrency " : " CLP " ,
" currency " : " CLP " ,
" origins " : [
{
" type " : " ETPAY " ,
" currency " : " CLP " ,
" etpay " : {
" successUrl " : " https://yourapp.com/orders/1001/success " ,
" failedUrl " : " https://yourapp.com/orders/1001/failed " ,
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}
}
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
]
}
response = requests . post (
' https://api.conomyhq.com/sandbox/payments ' ,
headers ={
' x-api-key ' : ' {YOUR_API_KEY} ' ,
' Authorization ' : ' Bearer {ACCESS_TOKEN} ' ,
' conomyhq-api-version ' : ' 24-04-2025 ' ,
' User-Agent ' : ' MyApp/1.0 ' ,
' Content-Type ' : ' application/json ' ,
' Accept ' : ' application/json ' ,
},
json = payload ,
)
data = response . json () package main
import (
" bytes "
" net/http "
)
func main () {
payload := [] byte ( ` {
"externalId": "order-1001",
"identityId": "<MERCHANT_IDENTITY_ID>",
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>",
"product": "CLP:CLP",
"type": "PURCHASE",
"purchaseAmount": "49990",
"purchaseCurrency": "CLP",
"currency": "CLP",
"origins": [
{
"type": "ETPAY",
"currency": "CLP",
"etpay": {
"successUrl": "https://yourapp.com/orders/1001/success",
"failedUrl": "https://yourapp.com/orders/1001/failed",
"customer": {
"firstName": "Jane",
"email": "jane@example.com"
}
}
}
],
"destinations": [
{
"type": "ACCOUNT",
"amount": "49990",
"currency": "CLP",
"identity": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"account": {
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>"
}
}
]
} ` )
body := bytes . NewReader ( payload )
req , _ := http . NewRequest ( " POST " , " https://api.conomyhq.com/sandbox/payments " , body )
req . Header . Set ( " x-api-key " , " {YOUR_API_KEY} " )
req . Header . Set ( " Authorization " , " Bearer {ACCESS_TOKEN} " )
req . Header . Set ( " conomyhq-api-version " , " 24-04-2025 " )
req . Header . Set ( " User-Agent " , " MyApp/1.0 " )
req . Header . Set ( " Content-Type " , " application/json " )
req . Header . Set ( " Accept " , " application/json " )
client := & http . Client {}
resp , _ := client . Do ( req )
defer resp . Body . Close ()
} use reqwest :: Client ;
use serde_json :: json ;
#[ tokio :: main ]
async fn main () -> Result <(), Box < dyn std :: error :: Error >> {
let client = Client :: new ();
let payload = json! ({
" externalId " : " order-1001 " ,
" identityId " : " <MERCHANT_IDENTITY_ID> " ,
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> " ,
" product " : " CLP:CLP " ,
" type " : " PURCHASE " ,
" purchaseAmount " : " 49990 " ,
" purchaseCurrency " : " CLP " ,
" currency " : " CLP " ,
" origins " : [
{
" type " : " ETPAY " ,
" currency " : " CLP " ,
" etpay " : {
" successUrl " : " https://yourapp.com/orders/1001/success " ,
" failedUrl " : " https://yourapp.com/orders/1001/failed " ,
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}
}
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
]
});
let response = client
. post ( " https://api.conomyhq.com/sandbox/payments " )
. header ( " x-api-key " , " { YOUR_API_KEY } " )
. header ( " Authorization " , " Bearer { ACCESS_TOKEN } " )
. header ( " conomyhq-api-version " , " 24-04-2025 " )
. header ( " User-Agent " , " MyApp/1.0 " )
. header ( " Content-Type " , " application/json " )
. header ( " Accept " , " application/json " )
. json ( & payload )
. send ()
. await ? ;
let data : serde_json :: Value = response . json () . await ? ;
Ok (())
} {
" id " : " <PAYMENT_ID> " ,
" externalId " : " order-1001 " ,
" type " : " PURCHASE " ,
" status " : " CREATED " ,
" product " : " CLP:CLP " ,
" origins " : [
{
" type " : " ETPAY " ,
" etpay " : {
" url " : " https://provider.example/authorize "
}
}
]
}
Request HTTP curl JavaScript Python Go Rust
POST /sandbox/payments/{PAYMENT_ID}/captured HTTP / 1.1
Host: api.conomyhq.com
x-api-key: {YOUR_API_KEY}
Authorization: Bearer {ACCESS_TOKEN}
conomyhq-api-version: 24-04-2025
User-Agent: MyApp/1.0
Content-Type: application/json
Accept: application/json
{} curl -X POST ' https://api.conomyhq.com/sandbox/payments/{PAYMENT_ID}/captured ' \
-H ' x-api-key: {YOUR_API_KEY} ' \
-H ' Authorization: Bearer {ACCESS_TOKEN} ' \
-H ' conomyhq-api-version: 24-04-2025 ' \
-H ' User-Agent: MyApp/1.0 ' \
-H ' Content-Type: application/json ' \
-H ' Accept: application/json ' \
-d ' {} ' const response = await fetch ( ' https://api.conomyhq.com/sandbox/payments/{PAYMENT_ID}/captured ' , {
method : ' POST ' ,
headers : {
' x-api-key ' : ' {YOUR_API_KEY} ' ,
' Authorization ' : ' Bearer {ACCESS_TOKEN} ' ,
' conomyhq-api-version ' : ' 24-04-2025 ' ,
' User-Agent ' : ' MyApp/1.0 ' ,
' Content-Type ' : ' application/json ' ,
' Accept ' : ' application/json ' ,
},
body : JSON . stringify ({}),
});
const data = await response . json (); import requests
payload = {}
response = requests . post (
' https://api.conomyhq.com/sandbox/payments/ {PAYMENT_ID} /captured ' ,
headers ={
' x-api-key ' : ' {YOUR_API_KEY} ' ,
' Authorization ' : ' Bearer {ACCESS_TOKEN} ' ,
' conomyhq-api-version ' : ' 24-04-2025 ' ,
' User-Agent ' : ' MyApp/1.0 ' ,
' Content-Type ' : ' application/json ' ,
' Accept ' : ' application/json ' ,
},
json = payload ,
)
data = response . json () package main
import (
" bytes "
" net/http "
)
func main () {
payload := [] byte ( ` {} ` )
body := bytes . NewReader ( payload )
req , _ := http . NewRequest ( " POST " , " https://api.conomyhq.com/sandbox/payments/{PAYMENT_ID}/captured " , body )
req . Header . Set ( " x-api-key " , " {YOUR_API_KEY} " )
req . Header . Set ( " Authorization " , " Bearer {ACCESS_TOKEN} " )
req . Header . Set ( " conomyhq-api-version " , " 24-04-2025 " )
req . Header . Set ( " User-Agent " , " MyApp/1.0 " )
req . Header . Set ( " Content-Type " , " application/json " )
req . Header . Set ( " Accept " , " application/json " )
client := & http . Client {}
resp , _ := client . Do ( req )
defer resp . Body . Close ()
} use reqwest :: Client ;
use serde_json :: json ;
#[ tokio :: main ]
async fn main () -> Result <(), Box < dyn std :: error :: Error >> {
let client = Client :: new ();
let payload = json! ({});
let response = client
. post ( " https://api.conomyhq.com/sandbox/payments/ { PAYMENT_ID } /captured " )
. header ( " x-api-key " , " { YOUR_API_KEY } " )
. header ( " Authorization " , " Bearer { ACCESS_TOKEN } " )
. header ( " conomyhq-api-version " , " 24-04-2025 " )
. header ( " User-Agent " , " MyApp/1.0 " )
. header ( " Content-Type " , " application/json " )
. header ( " Accept " , " application/json " )
. json ( & payload )
. send ()
. await ? ;
let data : serde_json :: Value = response . json () . await ? ;
Ok (())
} {
" id " : " <PAYMENT_ID> " ,
" type " : " PURCHASE " ,
" status " : " CAPTURED " ,
" capturedAt " : " 2026-05-18T10:00:00Z "
}
Do not fulfill the order only because the browser returned to successUrl. Use payment.settled, payment.failed, or GET /payments/{id} to mirror the final state in your own system.