Documentación de la API
La API de integración es la que consume tu sistema para vender con nosotros: consultar tu catálogo y tus precios, comprar recargas, seguir cada pedido, revisar tu saldo y tus movimientos, y recibir avisos. Las rutas marcadas «En desarrollo» tienen el contrato definitivo y se activan por fases; puedes integrar contra él desde ya.
Referencia
Cada ruta con sus parámetros, lo que recibe, lo que devuelve dentro de data y sus códigos de error propios.
GET/v1/merchantRequiere token
Los datos de tu cuenta: nombre, estado, moneda, modo de facturación (prepago o pospago) y límites diarios.
Respuesta (data)
{
"code": "ACME",
"tradeName": "Acme Recargas",
"legalName": "Acme Recargas LLC",
"countryCode": "JM",
"currency": "USD",
"status": "ACTIVE",
"billingMode": "PREPAID",
"billingEmail": "facturas@acme.example",
"limits": {
"dailyAmount": {
"amount": 1050,
"currency": "USD"
},
"dailyOrders": 500
},
"createdAt": "2026-01-01T00:00:00.000Z"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/merchant" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/merchant/balanceRequiere token
Tu saldo, el crédito concedido y available, lo máximo que admite el siguiente pedido.
Respuesta (data)
{
"currency": "USD",
"balance": 250000,
"creditLimit": 0,
"available": 250000,
"lowBalanceThreshold": 20000,
"updatedAt": "2026-01-01T00:00:00.000Z"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/merchant/balance" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/catalog/countriesRequiere token
Los países en los que puedes vender, con cuántos operadores y qué tipos de producto tiene cada uno.
Parámetros
- localeconsulta
- Idioma de nombres y descripciones; es si no se indica
Respuesta (data)
{
"items": [
{
"code": "JM",
"name": "Jamaica",
"callingCode": "+1876",
"carrierCount": 2,
"productTypes": [
"TOPUP"
]
}
]
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/catalog/countries" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/catalog/countries/{country}/carriersRequiere token
Los operadores habilitados de un país (country en ISO 3166-1, p. ej. JM).
Parámetros
- countryruta · obligatorio
- ISO 3166-1 alfa-2
- localeconsulta
- Idioma de nombres y descripciones; es si no se indica
Respuesta (data)
{
"items": [
{
"name": "Digicel",
"countryCode": "JM",
"logoUrl": "string",
"productTypes": [
"TOPUP"
]
}
]
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/catalog/countries/JM/carriers" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/catalog/carriers/{carrier}/productsRequiere token
Los productos de un operador con lo que recibe el número (delivers) y lo que te cuesta (price). Filtra con type.
Parámetros
- carrierruta · obligatorio
- localeconsulta
- Idioma de nombres y descripciones; es si no se indica
- typeconsulta
- Solo productos de este tipo
Respuesta (data)
{
"items": [
{
"sku": "JM-DIGICEL-TOPUP-500-K7Q2M9XA",
"carrierId": "jm-digicel",
"countryCode": "JM",
"type": "TOPUP",
"name": "Recarga 500 JMD",
"description": "string",
"delivers": {
"amount": 1050,
"currency": "USD"
},
"price": {
"amount": 1050,
"currency": "USD"
},
"promotion": {
"name": "Doble saldo",
"endsAt": "2026-01-01T00:00:00.000Z"
}
}
]
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/catalog/carriers/jm-digicel/products" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/catalog/products/{sku}Requiere token
Un producto por su sku, con tu precio de hoy. Útil para confirmar el precio justo antes de comprar.
Parámetros
- skuruta · obligatorio
- localeconsulta
- Idioma de nombres y descripciones; es si no se indica
Respuesta (data)
{
"sku": "JM-DIGICEL-TOPUP-500-K7Q2M9XA",
"carrierId": "jm-digicel",
"countryCode": "JM",
"type": "TOPUP",
"name": "Recarga 500 JMD",
"description": "string",
"delivers": {
"amount": 1050,
"currency": "USD"
},
"price": {
"amount": 1050,
"currency": "USD"
},
"promotion": {
"name": "Doble saldo",
"endsAt": "2026-01-01T00:00:00.000Z"
}
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/catalog/products/JM-DIGICEL-TOPUP-500-K7Q2M9XA" \
-H "authorization: Bearer $ACCESS_TOKEN"
POST/v1/destination/detectRequiere token
El país y el operador de un número. Con portabilidad el operador puede ser otro: confírmalo con tu cliente.
Cuerpo de la petición
{
"phoneNumber": "+18765550123"
}
Respuesta (data)
{
"phoneNumber": "+18765550123",
"countryCode": "JM",
"carrier": {
"name": "Digicel",
"countryCode": "JM",
"logoUrl": "string",
"productTypes": [
"TOPUP"
]
}
}
Códigos de error
DESTINATION_INVALIDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X POST "https://b2b.recargadoble.com/v1/destination/detect" \
-H "authorization: Bearer $ACCESS_TOKEN" \
-H "content-type: application/json" \
-d '{"phoneNumber":"+18765550123"}'
GET/v1/ordersRequiere token
Tus pedidos, del más reciente al más antiguo. Filtra por fechas, estado, número o tu externalReference.
Parámetros
- cursorconsulta
- El `nextCursor` de la pagina anterior
- limitconsulta
- Entre 1 y 100; 50 si no se indica
- fromconsulta
- Desde (incluido)
- toconsulta
- Hasta (excluido)
- statusconsulta
- PARTIAL: unas recargas se entregaron y otras no; lo no entregado se devuelve al saldo
- phoneNumberconsulta
- Pedidos con alguna recarga a este numero
- externalReferenceconsulta
Respuesta (data)
{
"items": [
{
"reference": "B2B-7KQ2M9XH4P",
"externalReference": "string",
"livemode": true,
"status": "PENDING",
"total": {
"amount": 1050,
"currency": "USD"
},
"refunded": {
"amount": 1050,
"currency": "USD"
},
"createdAt": "2026-01-01T00:00:00.000Z",
"completedAt": "2026-01-01T00:00:00.000Z",
"itemCount": 1
}
],
"nextCursor": "string"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/orders" \
-H "authorization: Bearer $ACCESS_TOKEN"
POST/v1/ordersRequiere token
Compra una o varias recargas (hasta 50). Exige Idempotency-Key. El total se descuenta de tu saldo al crear el pedido y lo que no se entregue se devuelve.
Parámetros
- Idempotency-Keycabecera · obligatorio
- Unica por compra en tu cuenta. Repetir la peticion con la misma clave devuelve el mismo pedido sin cobrar otro; con otro cuerpo, IDEMPOTENCY_CONFLICT. Una compra rechazada no consume la clave
Cuerpo de la petición
{
"items": [
{
"sku": "JM-DIGICEL-TOPUP-500-K7Q2M9XA",
"phoneNumber": "+18765550123",
"expectedPrice": {
"amount": 1050,
"currency": "USD"
}
}
],
"externalReference": "venta-000123"
}
Respuesta (data)
{
"reference": "B2B-7KQ2M9XH4P",
"externalReference": "string",
"livemode": true,
"status": "PENDING",
"total": {
"amount": 1050,
"currency": "USD"
},
"refunded": {
"amount": 1050,
"currency": "USD"
},
"items": [
{
"index": 0,
"sku": "JM-DIGICEL-TOPUP-500-K7Q2M9XA",
"name": "Recarga 500 JMD",
"type": "TOPUP",
"phoneNumber": "+18765550123",
"countryCode": "JM",
"carrierName": "Digicel",
"delivers": {
"amount": 1050,
"currency": "USD"
},
"price": {
"amount": 1050,
"currency": "USD"
},
"status": "PENDING",
"failureCode": "INVALID_NUMBER",
"carrierReference": "string",
"completedAt": "2026-01-01T00:00:00.000Z"
}
],
"createdAt": "2026-01-01T00:00:00.000Z",
"completedAt": "2026-01-01T00:00:00.000Z"
}
Códigos de error
MERCHANT_BLOCKEDIDEMPOTENCY_KEY_REQUIREDIDEMPOTENCY_CONFLICTPRODUCT_UNAVAILABLEPRICE_CHANGEDCURRENCY_MISMATCHDESTINATION_INVALIDINSUFFICIENT_BALANCEDAILY_LIMIT_EXCEEDEDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X POST "https://b2b.recargadoble.com/v1/orders" \
-H "authorization: Bearer $ACCESS_TOKEN" \
-H "idempotency-key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{"items":[{"sku":"JM-DIGICEL-TOPUP-500-K7Q2M9XA","phoneNumber":"+18765550123","expectedPrice":{"amount":1050,"currency":"USD"}}],"externalReference":"venta-000123"}'
GET/v1/orders/{reference}Requiere token
Un pedido con el estado de cada recarga y, si falló, el motivo en failureCode.
Parámetros
- referenceruta · obligatorio
Respuesta (data)
{
"reference": "B2B-7KQ2M9XH4P",
"externalReference": "string",
"livemode": true,
"status": "PENDING",
"total": {
"amount": 1050,
"currency": "USD"
},
"refunded": {
"amount": 1050,
"currency": "USD"
},
"items": [
{
"index": 0,
"sku": "JM-DIGICEL-TOPUP-500-K7Q2M9XA",
"name": "Recarga 500 JMD",
"type": "TOPUP",
"phoneNumber": "+18765550123",
"countryCode": "JM",
"carrierName": "Digicel",
"delivers": {
"amount": 1050,
"currency": "USD"
},
"price": {
"amount": 1050,
"currency": "USD"
},
"status": "PENDING",
"failureCode": "INVALID_NUMBER",
"carrierReference": "string",
"completedAt": "2026-01-01T00:00:00.000Z"
}
],
"createdAt": "2026-01-01T00:00:00.000Z",
"completedAt": "2026-01-01T00:00:00.000Z"
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/orders/B2B-7KQ2M9XH4P" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/orders/{reference}/eventsRequiere token
La historia del pedido, paso a paso: los mismos eventos que reciben los avisos.
Parámetros
- referenceruta · obligatorio
Respuesta (data)
{
"items": [
{
"type": "order.created",
"itemIndex": 0,
"status": "string",
"at": "2026-01-01T00:00:00.000Z"
}
]
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/orders/B2B-7KQ2M9XH4P/events" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/ledgerRequiere token
Los movimientos de tu saldo: depósitos, cobros de pedidos, devoluciones, pagos de facturas y ajustes, con el saldo tras cada uno.
Parámetros
- cursorconsulta
- El `nextCursor` de la pagina anterior
- limitconsulta
- Entre 1 y 100; 50 si no se indica
- fromconsulta
- Desde (incluido)
- toconsulta
- Hasta (excluido)
- kindconsulta
- ORDER_DEBIT: cobro de una recarga. ORDER_REVERSAL: devolucion de una que no se entrego
Respuesta (data)
{
"items": [
{
"kind": "DEPOSIT",
"amount": {
"amount": 1050,
"currency": "USD"
},
"balanceAfter": {
"amount": 1050,
"currency": "USD"
},
"orderReference": "string",
"invoiceNumber": "string",
"description": "string",
"createdAt": "2026-01-01T00:00:00.000Z"
}
],
"nextCursor": "string"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/ledger" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/reports/salesRequiere token
Lo vendido en un periodo: pedidos, recargas entregadas y fallidas, importe cobrado y devuelto, por día, país u operador.
Parámetros
- fromconsulta
- Desde (incluido)
- toconsulta
- Hasta (excluido)
- groupByconsulta
- Como se agrupan las filas; day si no se indica
Respuesta (data)
{
"from": "2026-01-01T00:00:00.000Z",
"to": "2026-01-01T00:00:00.000Z",
"groupBy": "day",
"totals": {
"orders": 120,
"itemsDelivered": 118,
"itemsFailed": 2,
"spent": {
"amount": 1050,
"currency": "USD"
},
"refunded": {
"amount": 1050,
"currency": "USD"
}
},
"rows": [
{
"orders": 120,
"itemsDelivered": 118,
"itemsFailed": 2,
"spent": {
"amount": 1050,
"currency": "USD"
},
"refunded": {
"amount": 1050,
"currency": "USD"
},
"key": "2026-10-14",
"countryCode": "JM"
}
]
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/reports/sales" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/webhooksRequiere token
La URL a la que se envían tus avisos, los eventos suscritos y si está activa.
Respuesta (data)
{
"url": "https://api.acme.example/rd/webhooks",
"events": [
"order.item.completed"
],
"isActive": true,
"secretHint": "whsec_...9f2a",
"disabledReason": "string"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/webhooks" \
-H "authorization: Bearer $ACCESS_TOKEN"
PUT/v1/webhooksRequiere token
Configura la URL de avisos y los eventos. Con rotateSecret emite un secreto nuevo, que solo se muestra en esta respuesta; el anterior sigue valiendo 24 horas. La URL y el secreto son los mismos para pruebas y real, asi que una credencial de pruebas no puede cambiarlos (FORBIDDEN): hazlo con una credencial real.
Cuerpo de la petición
{
"url": "https://api.acme.example/rd/webhooks",
"events": [
"order.item.completed"
],
"rotateSecret": true
}
Respuesta (data)
{
"url": "https://api.acme.example/rd/webhooks",
"events": [
"order.item.completed"
],
"isActive": true,
"secretHint": "whsec_...9f2a",
"disabledReason": "string",
"secret": "string"
}
Códigos de error
WEBHOOK_URL_INVALIDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X PUT "https://b2b.recargadoble.com/v1/webhooks" \
-H "authorization: Bearer $ACCESS_TOKEN" \
-H "content-type: application/json" \
-d '{"url":"https://api.acme.example/rd/webhooks","events":["order.item.completed"],"rotateSecret":true}'
GET/v1/webhooks/deliveriesRequiere token
Los avisos enviados, con cuántos intentos llevan y la respuesta de tu servidor.
Parámetros
- cursorconsulta
- El `nextCursor` de la pagina anterior
- limitconsulta
- Entre 1 y 100; 50 si no se indica
- fromconsulta
- Desde (incluido)
- toconsulta
- Hasta (excluido)
- statusconsulta
Respuesta (data)
{
"items": [
{
"eventType": "order.item.completed",
"eventId": "evt_01J9ZK7QXN",
"status": "PENDING",
"attempts": 1,
"lastStatusCode": 200,
"nextAttemptAt": "2026-01-01T00:00:00.000Z",
"createdAt": "2026-01-01T00:00:00.000Z",
"deliveredAt": "2026-01-01T00:00:00.000Z"
}
],
"nextCursor": "string"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/webhooks/deliveries" \
-H "authorization: Bearer $ACCESS_TOKEN"
POST/v1/webhooks/deliveries/{id}/resendRequiere token
Reenvía un aviso, con el mismo id de evento.
Respuesta (data)
{
"eventType": "order.item.completed",
"eventId": "evt_01J9ZK7QXN",
"status": "PENDING",
"attempts": 1,
"lastStatusCode": 200,
"nextAttemptAt": "2026-01-01T00:00:00.000Z",
"createdAt": "2026-01-01T00:00:00.000Z",
"deliveredAt": "2026-01-01T00:00:00.000Z"
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X POST "https://b2b.recargadoble.com/v1/webhooks/deliveries/{id}/resend" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/invoicesRequiere token
Tus facturas (pospago) o extractos (prepago), con su estado.
Parámetros
- cursorconsulta
- El `nextCursor` de la pagina anterior
- limitconsulta
- Entre 1 y 100; 50 si no se indica
- statusconsulta
- ISSUED: emitida y pendiente. OVERDUE: vencida sin pagar. PAID: pagada. VOID: anulada
Respuesta (data)
{
"items": [
{
"number": "INV-ACME-12",
"kind": "INVOICE",
"status": "ISSUED",
"periodStart": "2026-01-01T00:00:00.000Z",
"periodEnd": "2026-01-01T00:00:00.000Z",
"issuedAt": "2026-01-01T00:00:00.000Z",
"dueAt": "2026-01-01T00:00:00.000Z",
"total": {
"amount": 1050,
"currency": "USD"
},
"paidAt": "2026-01-01T00:00:00.000Z"
}
],
"nextCursor": "string"
}
Códigos de error
VALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/invoices" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/invoices/{number}Requiere token
Una factura con sus líneas y el resumen del periodo: saldo inicial, abonos y saldo final.
Parámetros
- numberruta · obligatorio
Respuesta (data)
{
"number": "INV-ACME-12",
"kind": "INVOICE",
"status": "ISSUED",
"periodStart": "2026-01-01T00:00:00.000Z",
"periodEnd": "2026-01-01T00:00:00.000Z",
"issuedAt": "2026-01-01T00:00:00.000Z",
"dueAt": "2026-01-01T00:00:00.000Z",
"total": {
"amount": 1050,
"currency": "USD"
},
"paidAt": "2026-01-01T00:00:00.000Z",
"lines": [
{
"type": "RECHARGES",
"description": "Recargas: Digicel (JM)",
"countryCode": "JM",
"carrierName": "Digicel",
"quantity": 118,
"amount": {
"amount": 1050,
"currency": "USD"
}
}
],
"summary": {
"openingBalance": {
"amount": 1050,
"currency": "USD"
},
"credits": {
"amount": 1050,
"currency": "USD"
},
"closingBalance": {
"amount": 1050,
"currency": "USD"
}
}
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/invoices/INV-ACME-12" \
-H "authorization: Bearer $ACCESS_TOKEN"
GET/v1/invoices/{number}/pdfRequiere token
El PDF de la factura, en base64. Se genera desde el documento emitido, así que siempre dice lo mismo.
Parámetros
- numberruta · obligatorio
Respuesta (data)
{
"filename": "INV-ACME-12.pdf",
"contentType": "application/pdf",
"contentBase64": "string"
}
Códigos de error
NOT_FOUNDVALIDATION_FAILEDRATE_LIMITEDUNAUTHORIZEDFORBIDDENINTERNAL_ERROR
Ejemplo
curl -X GET "https://b2b.recargadoble.com/v1/invoices/INV-ACME-12/pdf" \
-H "authorization: Bearer $ACCESS_TOKEN"