Saltar al contenido principal

Pagos con Stablecoins

Una vez completado el onboarding, ya puedes empezar a aceptar pagos con SP Cuvex.
Aquí te mostramos los endpoints principales y cómo usarlos.

1. Crear un pago

Endpoint:

POST /v1/payments

Idempotencia

Para garantizar la creación segura de recursos, es obligatorio enviar el header x-idempotency-key:

  • Valor: UUID v4 generado por el cliente, único para cada nuevo recurso
  • Comportamiento:
    • Mismo payload + misma key = retorna el objeto creado anteriormente
    • Misma key + payload diferente = error HTTP 409
  • Duración: Las keys tienen validez de 24 horas

Ejemplo de request:

{
"network": "TRON",
"token": "USDT",
"title": "My new payment",
"description": "Purchase of food and groceries on March 3, 2025",
"amount": "1234.56",
"merchant_reference": "INV-25-AUG-0001",
"validity_period": 20
}

Headers requeridos:

Content-Type: application/json
x-idempotency-key: 550e8400-e29b-41d4-a716-446655440000

Ejemplo de respuesta:

{
"message": "OK",
"timestamp": "2024-04-16T17:44:51Z",
"data": {
"id": "263600a1-1514-4e57-a11d-be91e9c8e9d4",
"merchant_reference": "INV-25-AUG-0001",
"title": "My new payment",
"description": "Purchase of food and groceries on March 3, 2025",
"network": "TRON",
"currency": "USDT",
"amount": "1234.56",
"confirmed_amount": "0",
"status": "OPEN",
"valid_until": 1755532150,
"link": "https://dapp.example.sp.cuvex.io/payment?idsession=123456&amount=1234.56&contract=TVAKUM28o1pNj6pkcckvWHFUs1foRcSwAt",
"created_at": "2024-04-16T17:44:51Z",
"updated_at": "2024-04-16T17:44:51Z"
}
}

Nota: El campo link es lo que debes presentar a tus clientes (como un botón, código QR, o cualquier método que prefieras) para proceder con el pago. Este enlace dirige a una dApp donde los clientes completan su pago usando su wallet preferida. Este enfoque garantiza compatibilidad con todos los tipos de wallet.

Ejemplos de código

import requests
import uuid
import os

# Sandbox URL for testing - use production URL for live environment
url = "https://sp-dev.cuvex.io/ecommerce/v1/payments"

headers = {
"Content-Type": "application/json",
"x-idempotency-key": str(uuid.uuid4()),
# Never hardcode API keys in source code - always use environment variables
"x-api-key": os.getenv("API_KEY")
}

payload = {
"network": "TRON",
"token": "USDT",
"title": "My new payment",
"description": "Purchase of food and groceries on March 3, 2025",
"amount": "1234.56",
"merchant_reference": "INV-25-AUG-0001",
"validity_period": 20
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

2. Consultar un pago

Endpoint:

GET /v1/payments/{paymentId}

Ejemplo de respuesta:

{
"message": "OK",
"timestamp": "2024-04-16T17:44:51Z",
"data": {
"id": "263600a1-1514-4e57-a11d-be91e9c8e9d4",
"merchant_reference": "INV-25-AUG-0001",
"title": "My new payment",
"description": "Purchase of food and groceries on March 3, 2025",
"network": "TRON",
"currency": "USDT",
"amount": "1234.56",
"confirmed_amount": "0",
"status": "OPEN",
"valid_until": 1755532150,
"link": "https://dapp.example.sp.cuvex.io/payment?idsession=123456&amount=1234.56&contract=TVAKUM28o1pNj6pkcckvWHFUs1foRcSwAt",
"created_at": "2024-04-16T17:44:51Z",
"updated_at": "2024-04-16T17:44:51Z"
}
}

Ejemplos de código

import requests
import os

# Sandbox URL for testing - use production URL for live environment
payment_id = "263600a1-1514-4e57-a11d-be91e9c8e9d4"
url = f"https://sp-dev.cuvex.io/ecommerce/v1/payments/{payment_id}"

headers = {
# Never hardcode API keys in source code - always use environment variables
"x-api-key": os.getenv("API_KEY")
}

response = requests.get(url, headers=headers)
print(response.json())

3. Listar pagos

Endpoint:

GET /v1/payments?page={page}&start_date={start_date}&end_date={end_date}

Los resultados se devuelven como una lista de pagos en orden cronológico inverso (más recientes primero), paginados en grupos de 25 registros por página.

Parámetros de consulta (opcionales):

  • page: Número de página (comenzando desde 0). Si no se especifica, se usa la página 0
  • start_date: Fecha inicial del rango en formato yyyy-mm-dd
  • end_date: Fecha final del rango en formato yyyy-mm-dd

Si no se especifican los filtros de fecha, se listan todos los pagos registrados.

Ejemplo de respuesta:

{
"message": "OK",
"timestamp": "2024-04-16T17:44:51Z",
"data": {
"total_count": 2551,
"count": 25,
"items": [
{
"id": "263600a1-1514-4e57-a11d-be91e9c8e9d4",
"merchant_reference": "Payment-25-AUG-0001",
"title": "My new payment",
"network": "TRON",
"currency": "USDT",
"amount": "1234.56",
"status": "OPEN",
"valid_until": 1755532150,
"created_at": "2024-04-16T17:44:51Z"
}
]
}
}

Ejemplos de código

import requests
import os
from urllib.parse import urlencode

# Sandbox URL for testing - use production URL for live environment
base_url = "https://sp-dev.cuvex.io/ecommerce/v1/payments"

headers = {
# Never hardcode API keys in source code - always use environment variables
"x-api-key": os.getenv("API_KEY")
}

# Example with pagination and date filters
params = {
"page": 0,
"start_date": "2024-01-01",
"end_date": "2024-12-31"
}

url = f"{base_url}?{urlencode(params)}"
response = requests.get(url, headers=headers)
print(response.json())

4. Estados de pago

Los pagos en SP Cuvex pueden tener los siguientes estados durante su ciclo de vida:

Estados disponibles

EstadoDescripción
OPENPago recién creado, en espera de confirmación de pago
FINISHEDPago completado exitosamente con el monto exacto
PARTIALLY_FILLEDPago recibido por un monto menor al especificado
OVER_FILLEDPago recibido por un monto mayor al especificado
EXPIREDPago vencido sin recibir confirmación dentro del tiempo de validez
LATE_PAYMENTPago confirmado después del tiempo de validez especificado
FAILEDError durante el procesamiento que impidió continuar

Flujo de estados

Flujo de estados de pago

Transiciones de estado

  1. Al crear: todo pago inicia en estado OPEN
  2. Confirmación exitosa: transición a FINISHED cuando se recibe el monto exacto
  3. Confirmación parcial: transición a PARTIALLY_FILLED si el monto es menor al esperado
  4. Sobrepago: transición a OVER_FILLED si el monto es mayor al esperado
  5. Expiración: transición a EXPIRED si no hay confirmación en el tiempo límite
  6. Pago tardío: transición a LATE_PAYMENT si llega confirmación después de expirar
  7. Error: transición a FAILED ante cualquier error de procesamiento

5. Formato de decimales

SP Cuvex maneja todas las cantidades monetarias como strings para garantizar precisión en operaciones financieras:

  • Formato: punto decimal (.) como separador, sin separadores de miles
  • Ejemplos válidos: "1234.56", "0.000001", "1000000"
  • Decimales por token: dependerá de cada token. Por ejemplo, USDC y USDT permiten hasta un máximo de 6 decimales. Otros tokens pueden llegar a soportar hasta 18 decimales.

Importante: Este es el único formato aceptado en requests y retornado en responses.

6. Confirmación en tiempo real

SP Cuvex ofrece un webhook para recibir notificaciones de pagos en tiempo real.
Consulta la sección Webhook para aprender a implementarlo.

Consejo: además del webhook, puedes usar el endpoint de consulta de pago como mecanismo de respaldo.