Ir al contenido

Crear Solicitud de Pago

Crea una nueva Solicitud de Pago para recibir pagos.

POST /v1/payment-links

Requiere API Key con el ability payment_links:create.

{
"amount": 100.0,
"currency": "COP",
"description": "Factura #1234 - Suscripción mensual",
"amount_type": "receive",
"customer_paid_fee": false,
"webhook_url": "https://tu-servidor.com/webhooks/orden/1234",
"success_url": "https://tu-servidor.com/pago-exitoso"
}
ParámetroTipoRequeridoDescripción
amountnumberMonto del pago (mínimo 1). La moneda depende de amount_type — ver abajo
currencystringMoneda del comprador. Valores: ARS, BRL, COP, CLP, MXN, BOB, USD — USD funciona distinto, ver Pagos en USD
descriptionstringDescripción del pago (máximo 255 caracteres)
amount_typestringNoInterpretación del monto. Valores: receive (default), charge
customer_paid_feebooleanNoSi es true, la comisión se suma al monto que paga el comprador. Default: false
sourcestringNoOrigen de la solicitud. Valores: integration (default), embedded_checkout, woocommerce
close_on_completebooleanNoSi es true, el checkout se cierra automáticamente al completar el pago. Default: false
webhook_urlstringNoURL para recibir notificaciones de esta solicitud (máximo 500 caracteres)
success_urlstringNoURL de redirección después de completar el pago exitosamente (máximo 500 caracteres)

Dos parámetros determinan cuánto paga el comprador y cuánto recibes tú. Conviene leerlos juntos, porque el resultado depende de la combinación:

  • amount_type define en qué moneda está expresado amount y quién absorbe el riesgo cambiario.
  • customer_paid_fee define quién paga la comisión de la transacción.
Valoramount se expresa enRiesgo cambiario
receive (default)La moneda de tu walletLo absorbe la plataforma. El comprador paga el equivalente en su moneda local
chargeLa moneda del comprador (currency)El comprador paga exactamente el monto que indicaste
ValorDescripción
false (default)La comisión la absorbe el comercio: se descuenta de los fondos que recibes
trueLa comisión se suma al monto que paga el comprador

Esta tabla describe el caso con conversión, que es donde amount_type decide algo. Si el comprador paga en la misma moneda de tu wallet — siempre con currency: "USD" — solo aplican las dos filas de customer_paid_fee, y “equivalente a amount” es simplemente amount.

amount_typecustomer_paid_feePaga el compradorRecibes tú
receivefalse (default)Equivalente a amount en su moneda localamount − comisión
receivetrueEquivalente a amount + comisiónamount completo
chargefalse (default)amount exactoEquivalente a amount − comisión
chargetrueamount + comisiónEquivalente a amount

Los cuatro ejemplos asumen un wallet en CLP y un comprador que paga en COP.

1. receive con el default (customer_paid_fee: false):

{
"amount": 100,
"currency": "COP",
"description": "Reserva de hotel",
"amount_type": "receive"
}

→ El comprador paga el equivalente a 100 CLP en COP (~150,000 COP). Tú recibes 100 CLP menos la comisión.

2. receive con customer_paid_fee: true:

{
"amount": 100,
"currency": "COP",
"description": "Reserva de hotel",
"amount_type": "receive",
"customer_paid_fee": true
}

→ El comprador paga ~150,000 COP más la comisión. Tú recibes los 100 CLP completos.

3. charge con el default (customer_paid_fee: false):

{
"amount": 150000,
"currency": "COP",
"description": "Reserva de hotel",
"amount_type": "charge"
}

→ El comprador paga exactamente 150,000 COP. Tú recibes el equivalente (~100 CLP) menos la comisión.

4. charge con customer_paid_fee: true:

{
"amount": 150000,
"currency": "COP",
"description": "Reserva de hotel",
"amount_type": "charge",
"customer_paid_fee": true
}

→ Si la comisión es de 3,000 COP, el comprador paga 153,000 COP. Tú recibes el equivalente a 150,000 COP.

currency: "USD" cobra por débito bancario en Estados Unidos, no por los métodos locales del resto de monedas. El cuerpo de la solicitud es el mismo — no hay ningún campo nuevo:

{
"amount": 100,
"currency": "USD",
"description": "Invoice #1234"
}

La moneda del wallet la determina currency: pidiendo USD, los fondos se liquidan en tu USD Bank Account. No tienes que elegir proveedor ni wallet en ningún momento.

Un débito bancario tarda días hábiles en liquidarse. Eso cambia dos cosas que probablemente ya tengas implementadas para las monedas locales:

Monedas localesUSD
Estados posiblesactivecompletedactivein_transitcompleted, y returned
Cuándo llega payment.completedAl momento de pagarAl liquidar el débito, días después
  • in_transit significa que el comprador ya autorizó el cobro y el débito está en camino. No es un fallo ni un pago confirmado: aún no hay dinero acreditado.
  • returned significa que el banco del comprador revirtió el débito después de haberse liquidado. Es el único estado en el que un pago que ya diste por bueno deja de serlo.
Ventana de terminal
curl -X POST "https://api.aloha.co/api/external/v1/payment-links" \
-H "X-API-KEY: tu_api_key_aqui" \
-H "Content-Type: application/json" \
-d '{
"amount": 100.00,
"currency": "COP",
"description": "Factura #1234 - Suscripción mensual",
"amount_type": "receive",
"success_url": "https://tu-servidor.com/pago-exitoso"
}'
{
"success": true,
"message": "Payment link created successfully",
"data": {
"id": "9d8f7a6b-5c4d-3e2f-1a0b-9c8d7e6f5a4b",
"url": "https://checkout.aloha.co/s/9d8f7a6b-5c4d-3e2f-1a0b-9c8d7e6f5a4b",
"expires_at": "2025-12-10T10:30:00.000000Z"
}
}
CampoTipoDescripción
idstring (UUID)Identificador único de la Solicitud de Pago
urlstringURL del checkout para compartir con el cliente
expires_atstringFecha de expiración (ISO 8601)
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"errors": {
"amount": ["The amount field is required."],
"currency": ["The currency must be 3 characters."],
"description": ["The description field is required."]
}
}
{
"success": false,
"code": "INVALID_API_KEY",
"message": "Invalid API key configuration"
}
{
"success": false,
"code": "WALLET_NOT_FOUND",
"message": "No virtual wallet configured for this account"
}
{
"success": false,
"code": "USD_ACCOUNT_NOT_ENABLED",
"message": "USD payment links are not enabled for this account."
}
Código HTTPCódigo de ErrorDescripción
401INVALID_API_KEYAPI Key inválida o expirada
401missing_api_keyNo se proporcionó API Key
403insufficient_scopeLa API Key no tiene el ability payment_links:create
422VALIDATION_FAILEDError de validación en los parámetros
422WALLET_NOT_FOUNDNo hay wallet virtual configurado
422USD_ACCOUNT_NOT_ENABLEDSe pidió currency: "USD" y la cuenta no tiene los pagos en USD habilitados