Saltar al contenido

Tu primer canje

  1. Consigue tus claves

    Crea una clave de prueba en el portal de comercios. Verás la clave completa una sola vez; su última parte es también el secreto con el que firmas las peticiones.

  2. Reserva el voucher

    Envía el código, la moneda y la referencia de tu cliente. El voucher queda bloqueado para ese cliente y no se puede usar en ningún otro sitio.

  3. Abona y después captura

    Abona el saldo en tu sistema y después captura. Si la recarga falla, cancela en su lugar y el voucher se libera.

  4. Escucha los webhooks

    Registra un endpoint para recibir eventos firmados de capturas, cancelaciones, caducidades y checkouts.

Canjes · ejemplo
POST /v1/redemptions
Authorization: Bearer vch_test_…
Idempotency-Key: topup-88213
Vouchereto-Signature: t=1790500000,v1=9c1e5f07…
Content-Type: application/json

{ "code": "7K2M-9QXR-4HTB-2WNZ", "customer_ref": "acct_48213", "currency": "USD" }

# 201 Created
{ "id": "5f0c2a7e-…", "object": "redemption", "status": "reserved",
  "amount_minor": 5000, "currency": "USD", "voucher_last4": "2WNZ",
  "customer_ref": "acct_48213", "livemode": false,
  "expires_at": "2026-09-27T14:12:00Z", "captured_at": null }

El ciclo de vida de un canje

voucher activoreservado
  • capturadoEl voucher se ha gastado. Es irreversible.
  • canceladoLo has cancelado. El voucher vuelve a estar activo.
  • reserva caducadaNo se capturó a tiempo (15 minutos por defecto). El voucher vuelve a estar activo.

Con qué vas a trabajar

Firma de peticiones

Cada petición lleva una cabecera Vouchereto-Signature: una marca de tiempo y un HMAC-SHA256 de la marca de tiempo, el método, la ruta y el cuerpo, con el secreto de tu clave de API como clave. Aceptamos un desfase de reloj de hasta 300 segundos.

sign.js
// Sign every request with the secret part of your API key (the text after the last "_")
const t = Math.floor(Date.now() / 1000);
const payload = `${t}.${method} ${pathWithQuery}\n${body}`;
const v1 = crypto.createHmac("sha256", keySecret).update(payload).digest("hex");
headers["Vouchereto-Signature"] = `t=${t},v1=${v1}`;

Idempotencia

Cada POST necesita una cabecera Idempotency-Key. Si repites una petición con la misma clave, recibes la respuesta original, marcada con Idempotent-Replayed: true. Las claves se conservan durante al menos 30 días.

Vouchers del sandbox

Con una clave de prueba, POST /v1/sandbox/vouchers crea un voucher de prueba en el estado que pidas (active, reserved, redeemed, expired, risk_hold o void) y devuelve su código. Las claves de prueba solo ven datos de prueba.

Eventos de webhook

Eventos que enviamos a tu endpoint
EventoCuándo se envía
redemption.capturedSe capturó un voucher reservado. Puedes conservar el saldo abonado con seguridad.
redemption.cancelledSe canceló una reserva. El voucher vuelve a estar activo.
redemption.expiredUna reserva se quedó sin tiempo sin ser capturada.
checkout.completedSe pagó un checkout alojado y se aplicó el voucher.
checkout.expiredUna sesión de checkout alojado caducó sin pago.
checkout.failedSe revirtió un checkout pagado, por ejemplo tras un reembolso.

Errores

Códigos de error y qué decirle al cliente
EstadoCódigoQué decirle al cliente
404VOUCHER_INVALIDNo encontramos ese código. Revísalo e inténtalo de nuevo.
409VOUCHER_ALREADY_REDEEMEDEste voucher ya se ha usado.
409VOUCHER_RESERVEDEste voucher se está usando ahora mismo en otro pago.
422VOUCHER_EXPIREDEste voucher ha caducado.
422UNIVERSAL_NOT_ACCEPTEDNo aceptamos vouchers universales. Usa un voucher de este sitio.
422CURRENCY_MISMATCHEste voucher es de otra moneda.
429TOO_MANY_INVALID_ATTEMPTSDemasiados intentos. Espera unos minutos e inténtalo de nuevo.

Los errores siguen RFC 7807 (application/problem+json) con un código estable y un request_id.

Esta página resume la API. La referencia completa, con todos los campos, está publicada en www.vouchereto.com/docs/reference.

¿Te has atascado?

Escribe a [DEVELOPER SUPPORT EMAIL]. Un desarrollador lee cada mensaje.