Integraciones

API REST para código propio

Tres pasos: creas el cobro, mandas al comprador a la página de pago, y recibes un aviso firmado cuando el pago se confirma.

Base
https://pagos.cardoflix.com/api/v1
Autenticación
Cabecera X-API-Key: <tu clave>. La generas en Integraciones; se muestra una sola vez.
Formato
JSON en la petición y en la respuesta.

1. Crear un cobro

POST /checkouts

curl -X POST https://pagos.cardoflix.com/api/v1/checkouts \
  -H "X-API-Key: TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "orderId": "4821",
    "priceAmount": "24.50",
    "priceCurrency": "USD",
    "webhookUrl": "https://tutienda.com/avisos/cobros",
    "verificationToken": "un-texto-tuyo-que-te-devolvemos",
    "successRedirectUrl": "https://tutienda.com/gracias"
  }'

orderId y priceAmount son obligatorios. El resto es opcional.

Respuesta 201:

{
  "id": "ch_9f3a12c7d4",
  "orderId": "4821",
  "priceCurrency": "USD",
  "priceAmount": "24.50",
  "uniqueAmount": "24.57",
  "status": "OPEN",
  "checkoutUrl": "https://pagos.cardoflix.com/pay/ch_9f3a12c7d4",
  "expiresAt": "2026-09-06T04:12:00Z",
  "createdAt": "2026-09-06T02:12:00Z",
  "successRedirectUrl": "https://tutienda.com/gracias"
}
Manda al comprador a checkoutUrl. Ahí ve el importe, el QR y la cuenta atrás. El importe que debe pagar es uniqueAmount, y tiene que pagarlo exacto: si no coincide, el cobro no se da por pagado.

2. Consultar un cobro

GET /checkouts/{id} con tu X-API-Key:

{
  "id": "ch_9f3a12c7d4",
  "orderId": "4821",
  "priceCurrency": "USD",
  "priceAmount": "24.50",
  "uniqueAmount": "24.57",
  "status": "COMPLETED",
  "estado": "pagado",
  "checkoutUrl": "https://pagos.cardoflix.com/pay/ch_9f3a12c7d4",
  "expiresAt": "2026-09-06T04:12:00Z",
  "createdAt": "2026-09-06T02:12:00Z",
  "successRedirectUrl": "https://tutienda.com/gracias"
}

status es el estado interno (OPEN, COMPLETED, EXPIRED, CANCELED) y estado es el que ve el comprador (esperando, detectado, pagado, caducado).

Sin la cabecera, este mismo endpoint devuelve solo id, status, estado, uniqueAmount y expiresAt. Es a propósito: la pagina de pago lo consulta desde el navegador del comprador, y así quien solo conozca el identificador no puede leer los datos del pedido.

Existe también GET /cobros/{id}, con los mismos datos y los nombres en español: pedido, importe, importeAEnviar, urlDePago, transaccion, urlDeAviso.

3. El aviso a tu tienda

Cuando el pago se confirma, hacemos POST a tu webhookUrl con este cuerpo:

{
  "data": {
    "status": "COMPLETED",
    "orderId": "4821",
    "id": "ch_9f3a12c7d4",
    "priceAmount": "24.50",
    "priceCurrency": "USD",
    "verificationToken": "un-texto-tuyo-que-te-devolvemos",
    "checkoutUrl": "https://pagos.cardoflix.com/pay/ch_9f3a12c7d4",
    "createdAt": "2026-09-06T02:12:00Z"
  }
}

Y con dos cabeceras para que compruebes que viene de nosotros:

X-CardoPagos-Fecha: 1788660000
X-CardoPagos-Firma: sha256=<hmac>

La firma es HMAC-SHA256 sobre fecha + "." + cuerpo —el cuerpo tal cual llega, sin volver a serializarlo— con el secreto de avisos de tu cuenta. En PHP:

$cuerpo = file_get_contents('php://input');
$fecha  = $_SERVER['HTTP_X_CARDOPAGOS_FECHA'] ?? '';
$firma  = $_SERVER['HTTP_X_CARDOPAGOS_FIRMA'] ?? '';
$mio    = 'sha256=' . hash_hmac('sha256', $fecha . '.' . $cuerpo, TU_SECRETO);
if (!hash_equals($mio, $firma)) { http_response_code(401); exit; }

Responde 200 para que lo demos por entregado. Si no, reintentamos con esperas crecientes.

POST /cobros/{id}/reenviar-aviso vuelve a mandarlo si tu servidor estaba caído.

4. Estado de tu cuenta

GET /cuenta devuelve tu plan, cuánto llevas consumido este mes y si tu detección está viva. Útil para vigilar desde tu propio panel.

Errores

CódigoQué pasó
400Falta orderId o priceAmount.
401La cabecera X-API-Key falta o no es válida.
402 limite_planHas llegado al tope de cobros de tu plan este mes.
403 cuenta_inactivaLa cuenta está suspendida o la prueba terminó.
409 sin_binanceTodavía no has conectado tu cuenta de Binance.
503La cuenta tiene demasiados cobros abiertos a la vez. Reintenta en unos minutos o conecta otra cuenta de Binance.