Payment links are useful when you want to collect without building your own checkout UI. You define the amount, allowed payment methods, destination account, customer requirements, and redirect URLs. Conomy returns a checkout token that can be opened by the payer.
Note Use payment links for invoices, manual collections, low-code checkout, or support-driven payment flows. Use direct POST /payments when your product owns the full payment UI.
01 Create link Define items, methods, destination, and duration.
02 Share checkout Send the hosted checkout URL to the customer.
03 Customer pays The customer completes the hosted flow.
04 Reconcile Use webhooks and payment reads as the source of truth.
Request HTTP curl JavaScript Python Go Rust
POST /sandbox/payment-links 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
{
" checkoutToken " : " invoice-1001 " ,
" currency " : " CLP " ,
" items " : [
{
" preTaxAmount " : " 49990 " ,
" totalAmount " : " 49990 " ,
" description " : " Invoice 1001 "
}
],
" paymentMethodsAllowed " : [
" ETPAY " ,
" WEBPAY "
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
],
" duration " : 86400 ,
" owner " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" customerRequirements " : [
" firstName " ,
" email "
],
" successUrl " : " https://yourapp.com/invoices/1001/success " ,
" failedUrl " : " https://yourapp.com/invoices/1001/failed "
} curl -X POST ' https://api.conomyhq.com/sandbox/payment-links ' \
-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 ' {
"checkoutToken": "invoice-1001",
"currency": "CLP",
"items": [
{
"preTaxAmount": "49990",
"totalAmount": "49990",
"description": "Invoice 1001"
}
],
"paymentMethodsAllowed": [
"ETPAY",
"WEBPAY"
],
"destinations": [
{
"type": "ACCOUNT",
"amount": "49990",
"currency": "CLP",
"identity": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"account": {
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>"
}
}
],
"duration": 86400,
"owner": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"customerRequirements": [
"firstName",
"email"
],
"successUrl": "https://yourapp.com/invoices/1001/success",
"failedUrl": "https://yourapp.com/invoices/1001/failed"
} ' const response = await fetch ( ' https://api.conomyhq.com/sandbox/payment-links ' , {
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 ({
" checkoutToken " : " invoice-1001 " ,
" currency " : " CLP " ,
" items " : [
{
" preTaxAmount " : " 49990 " ,
" totalAmount " : " 49990 " ,
" description " : " Invoice 1001 "
}
],
" paymentMethodsAllowed " : [
" ETPAY " ,
" WEBPAY "
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
],
" duration " : 86400 ,
" owner " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" customerRequirements " : [
" firstName " ,
" email "
],
" successUrl " : " https://yourapp.com/invoices/1001/success " ,
" failedUrl " : " https://yourapp.com/invoices/1001/failed "
}),
});
const data = await response . json (); import requests
payload = {
" checkoutToken " : " invoice-1001 " ,
" currency " : " CLP " ,
" items " : [
{
" preTaxAmount " : " 49990 " ,
" totalAmount " : " 49990 " ,
" description " : " Invoice 1001 "
}
],
" paymentMethodsAllowed " : [
" ETPAY " ,
" WEBPAY "
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
],
" duration " : 86400 ,
" owner " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" customerRequirements " : [
" firstName " ,
" email "
],
" successUrl " : " https://yourapp.com/invoices/1001/success " ,
" failedUrl " : " https://yourapp.com/invoices/1001/failed "
}
response = requests . post (
' https://api.conomyhq.com/sandbox/payment-links ' ,
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 ( ` {
"checkoutToken": "invoice-1001",
"currency": "CLP",
"items": [
{
"preTaxAmount": "49990",
"totalAmount": "49990",
"description": "Invoice 1001"
}
],
"paymentMethodsAllowed": [
"ETPAY",
"WEBPAY"
],
"destinations": [
{
"type": "ACCOUNT",
"amount": "49990",
"currency": "CLP",
"identity": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"account": {
"accountNumber": "<MERCHANT_ACCOUNT_NUMBER>"
}
}
],
"duration": 86400,
"owner": {
"identityId": "<MERCHANT_IDENTITY_ID>"
},
"customerRequirements": [
"firstName",
"email"
],
"successUrl": "https://yourapp.com/invoices/1001/success",
"failedUrl": "https://yourapp.com/invoices/1001/failed"
} ` )
body := bytes . NewReader ( payload )
req , _ := http . NewRequest ( " POST " , " https://api.conomyhq.com/sandbox/payment-links " , 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! ({
" checkoutToken " : " invoice-1001 " ,
" currency " : " CLP " ,
" items " : [
{
" preTaxAmount " : " 49990 " ,
" totalAmount " : " 49990 " ,
" description " : " Invoice 1001 "
}
],
" paymentMethodsAllowed " : [
" ETPAY " ,
" WEBPAY "
],
" destinations " : [
{
" type " : " ACCOUNT " ,
" amount " : " 49990 " ,
" currency " : " CLP " ,
" identity " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" account " : {
" accountNumber " : " <MERCHANT_ACCOUNT_NUMBER> "
}
}
],
" duration " : 86400 ,
" owner " : {
" identityId " : " <MERCHANT_IDENTITY_ID> "
},
" customerRequirements " : [
" firstName " ,
" email "
],
" successUrl " : " https://yourapp.com/invoices/1001/success " ,
" failedUrl " : " https://yourapp.com/invoices/1001/failed "
});
let response = client
. post ( " https://api.conomyhq.com/sandbox/payment-links " )
. 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_LINK_ID> " ,
" checkoutToken " : " invoice-1001 " ,
" status " : " ACTIVE " ,
" url " : " https://checkout.conomyhq.com/invoice-1001 "
}
Use this when your application needs a fresh checkout session from an existing payment link token.
Request HTTP curl JavaScript Python Go Rust
POST /sandbox/payment-links/token/{CHECKOUT_TOKEN}/checkout-sessions 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
{
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
} curl -X POST ' https://api.conomyhq.com/sandbox/payment-links/token/{CHECKOUT_TOKEN}/checkout-sessions ' \
-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 ' {
"customer": {
"firstName": "Jane",
"email": "jane@example.com"
}
} ' const response = await fetch ( ' https://api.conomyhq.com/sandbox/payment-links/token/{CHECKOUT_TOKEN}/checkout-sessions ' , {
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 ({
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}),
});
const data = await response . json (); import requests
payload = {
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
}
response = requests . post (
' https://api.conomyhq.com/sandbox/payment-links/token/ {CHECKOUT_TOKEN} /checkout-sessions ' ,
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 ( ` {
"customer": {
"firstName": "Jane",
"email": "jane@example.com"
}
} ` )
body := bytes . NewReader ( payload )
req , _ := http . NewRequest ( " POST " , " https://api.conomyhq.com/sandbox/payment-links/token/{CHECKOUT_TOKEN}/checkout-sessions " , 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! ({
" customer " : {
" firstName " : " Jane " ,
" email " : " jane@example.com "
}
});
let response = client
. post ( " https://api.conomyhq.com/sandbox/payment-links/token/ { CHECKOUT_TOKEN } /checkout-sessions " )
. 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 " : " <CHECKOUT_SESSION_ID> " ,
" checkoutToken " : " invoice-1001 " ,
" status " : " PENDING " ,
" expiresAt " : " 2026-05-18T11:00:00Z "
}