// guía de integración

Documentación para integrar KeyPay

Consulta endpoints, autenticación, ejemplos de request/response y errores comunes para preparar tu integración.

Solicitar acceso →
BASE URL
api.innovapp-soft.com
AUTH
Bearer Key
FORMAT
JSON
VERSION
v2 + legacy
Inicio rápido
1
Obtén tu API key

Solicita acceso y usa la credencial activa de tu portal.

2
Autentica la petición

Envía Authorization: Bearer {API_KEY}.

3
Procesa la respuesta

Comprueba el estado HTTP y los campos success, code, data y error.

Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Referencia completa en texto plano

El mismo contenido del portal, preparado para asistentes de IA, automatizaciones y lectura sin interfaz gráfica.

Estados HTTP comunes

200 / 201Solicitud procesada o creada
400 / 422Datos inválidos
401 / 403Autenticación o permiso
409Conflicto de operación
429Límite de peticiones
500 / 502 / 503Error o servicio no disponible

Cada endpoint muestra debajo solamente sus errores y notas específicas.

Vista de endpoints
Rates API V2

Tasas normalizadas para aplicaciones y servicios externos.

1 GET GET /v2/rates
Devuelve tasas V2 globales o por pais con secciones normalizadas, variacion y recursos de imagen.

Devuelve tasas V2 globales o por pais con secciones normalizadas, variacion y recursos de imagen.

Endpoint
https://api.innovapp-soft.com/v2/rates
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Query params

Nombre Requerido Tipo Descripción Ejemplo
country No string Codigo ISO alpha-2 o GLOBAL. CU
base No string Moneda base solicitada. USD
include_snapshot No integer Usa 1 para incluir el snapshot completo. 1

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v2/rates?country=CU' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/rates?country=CU', {
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": {
        "version": 2,
        "country": "CU",
        "base": "USD",
        "sections": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}

Notas

  • /v2/tasas es un alias compatible de /v2/rates.
  • Para nuevas integraciones usa /v2/rates.
Store V2 · Catálogo general KeyStore

Empieza aquí para conocer todos los productos habilitados antes de abrir un flujo específico.

1 POST Catálogo completo /v2/store/catalog/list
Catálogo general KeyStore: Devuelve el catálogo completo habilitado en KeyStore, incluidos VPN, KeyCode, productos físicos y las entradas V2 disponibles. La visibilidad sigue la configuración activa del Dashboard.

Catálogo general KeyStore: Devuelve el catálogo completo habilitado en KeyStore, incluidos VPN, KeyCode, productos físicos y las entradas V2 disponibles. La visibilidad sigue la configuración activa del Dashboard.

Endpoint
https://api.innovapp-soft.com/v2/store/catalog/list
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/catalog/list' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/catalog/list', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.catalog.list.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Store V2 · Recargas internacionales

Flujo recomendado: consultar catálogo, validar promoción si existe, comprar y después consultar la orden o su estado.

1 POST Consultar catálogo /v2/store/topups/catalog
Recargas internacionales: Lista paises, operadores y ofertas. Usa mode=countries para iniciar; despues envia country y finalmente country + brand.

Recargas internacionales: Lista paises, operadores y ofertas. Usa mode=countries para iniciar; despues envia country y finalmente country + brand.

Endpoint
https://api.innovapp-soft.com/v2/store/topups/catalog
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
mode No string Vista del catalogo solicitada. countries
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
brand Depende string Marca u operador devuelto por el catalogo. Cubacel
sub_type No string Subtipo de producto dentro de una marca. MOBILE
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/topups/catalog' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"mode":"countries","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/topups/catalog', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "mode": "countries",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.topups.catalog.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
2 POST Validar promoción /v2/store/topups/promo
Recargas internacionales: Valida un codigo promocional para una oferta antes de comprar.

Recargas internacionales: Valida un codigo promocional para una oferta antes de comprar.

Endpoint
https://api.innovapp-soft.com/v2/store/topups/promo
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
brand Depende string Marca u operador devuelto por el catalogo. Cubacel
offer_id Si en compra string Identificador exacto de la oferta seleccionada. 61
promo_code Depende string Codigo promocional que se desea validar o aplicar. PROMO2026
amount No number Monto elegido cuando la oferta permite un rango. 25.00
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/topups/promo' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"country":"CU","brand":"Cubacel","offer_id":"61","promo_code":"PROMO2026","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/topups/promo', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "country": "CU",
    "brand": "Cubacel",
    "offer_id": "61",
    "promo_code": "PROMO2026",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.topups.promo.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
3 POST Comprar /v2/store/topups/buy
Recargas internacionales: Compra una recarga internacional. client_purchase_id hace la operacion idempotente y no debe reutilizarse para otra compra.

Recargas internacionales: Compra una recarga internacional. client_purchase_id hace la operacion idempotente y no debe reutilizarse para otra compra.

Endpoint
https://api.innovapp-soft.com/v2/store/topups/buy
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
brand Depende string Marca u operador devuelto por el catalogo. Cubacel
offer_id Si en compra string Identificador exacto de la oferta seleccionada. 61
phone_number Si en compra string Numero de telefono que recibira la recarga. +5351234567
client_purchase_id Si en compra string Idempotency key unica creada por tu sistema para esta compra. order-2026-000184
promo_code Depende string Codigo promocional que se desea validar o aplicar. PROMO2026
amount No number Monto elegido cuando la oferta permite un rango. 25.00
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/topups/buy' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"country":"CU","brand":"Cubacel","offer_id":"61","phone_number":"+5351234567","client_purchase_id":"topup-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/topups/buy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "country": "CU",
    "brand": "Cubacel",
    "offer_id": "61",
    "phone_number": "+5351234567",
    "client_purchase_id": "topup-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.topups.buy.ok",
    "message": "OK",
    "data": {
        "status": "pending",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
4 POST Consultar órdenes /v2/store/topups/orders
Recargas internacionales: Devuelve el historial paginado de recargas del usuario KeyPay vinculado al developer.

Recargas internacionales: Devuelve el historial paginado de recargas del usuario KeyPay vinculado al developer.

Endpoint
https://api.innovapp-soft.com/v2/store/topups/orders
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/topups/orders' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/topups/orders', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.topups.orders.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
5 POST Consultar estado /v2/store/topups/status
Recargas internacionales: Consulta el estado actualizado de una recarga.

Recargas internacionales: Consulta el estado actualizado de una recarga.

Endpoint
https://api.innovapp-soft.com/v2/store/topups/status
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
order_id Si en status string Identificador de la orden devuelto al crearla. 1842
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/topups/status' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"1842","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/topups/status', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "order_id": "1842",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.topups.status.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Store V2 · Gift Cards

Flujo recomendado: consultar marcas y ofertas, comprar y después consultar las órdenes o el estado de entrega.

1 POST Consultar catálogo /v2/store/giftcards/catalog
Gift Cards: Lista marcas y ofertas de Gift Cards V2 por pais, categoria o busqueda.

Gift Cards: Lista marcas y ofertas de Gift Cards V2 por pais, categoria o busqueda.

Endpoint
https://api.innovapp-soft.com/v2/store/giftcards/catalog
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
mode No string Vista del catalogo solicitada. countries
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
brand Depende string Marca u operador devuelto por el catalogo. Cubacel
query No string Texto para filtrar el catalogo. Amazon
category No string Categoria del catalogo. Gaming
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/giftcards/catalog' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"mode":"countries","country":"US","page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/giftcards/catalog', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "mode": "countries",
    "country": "US",
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.giftcards.catalog.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
2 POST Comprar /v2/store/giftcards/buy
Gift Cards: Compra una Gift Card fija o de rango. En ofertas de rango envia amount.

Gift Cards: Compra una Gift Card fija o de rango. En ofertas de rango envia amount.

Endpoint
https://api.innovapp-soft.com/v2/store/giftcards/buy
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
brand Depende string Marca u operador devuelto por el catalogo. Cubacel
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
offer_id Si en compra string Identificador exacto de la oferta seleccionada. 61
client_purchase_id Si en compra string Idempotency key unica creada por tu sistema para esta compra. order-2026-000184
amount No number Monto elegido cuando la oferta permite un rango. 25.00
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/giftcards/buy' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"brand":"Amazon","country":"US","offer_id":"amazon-us-25","client_purchase_id":"gift-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/giftcards/buy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "brand": "Amazon",
    "country": "US",
    "offer_id": "amazon-us-25",
    "client_purchase_id": "gift-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.giftcards.buy.ok",
    "message": "OK",
    "data": {
        "status": "pending",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
3 POST Consultar órdenes /v2/store/giftcards/orders
Gift Cards: Devuelve las ordenes de Gift Cards del usuario vinculado.

Gift Cards: Devuelve las ordenes de Gift Cards del usuario vinculado.

Endpoint
https://api.innovapp-soft.com/v2/store/giftcards/orders
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/giftcards/orders' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/giftcards/orders', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.giftcards.orders.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
4 POST Consultar estado /v2/store/giftcards/status
Gift Cards: Consulta una orden y sus datos de entrega cuando ya estan disponibles.

Gift Cards: Consulta una orden y sus datos de entrega cuando ya estan disponibles.

Endpoint
https://api.innovapp-soft.com/v2/store/giftcards/status
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
order_id Si en status string Identificador de la orden devuelto al crearla. 1842
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/giftcards/status' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"1842","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/giftcards/status', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "order_id": "1842",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.giftcards.status.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Store V2 · Servicios IMEI

Flujo recomendado: consultar servicios y campos requeridos, crear la solicitud y después revisar su resultado.

1 POST Consultar catálogo /v2/store/imei/catalog
Servicios IMEI: Lista los servicios IMEI disponibles y los campos que requiere cada uno.

Servicios IMEI: Lista los servicios IMEI disponibles y los campos que requiere cada uno.

Endpoint
https://api.innovapp-soft.com/v2/store/imei/catalog
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
search No string Texto para buscar un servicio IMEI. iPhone
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/imei/catalog' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"search":"iPhone","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/imei/catalog', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "search": "iPhone",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.imei.catalog.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
2 POST Comprar /v2/store/imei/buy
Servicios IMEI: Solicita un servicio IMEI. Envia input con los mismos nombres de campo entregados por el catalogo.

Servicios IMEI: Solicita un servicio IMEI. Envia input con los mismos nombres de campo entregados por el catalogo.

Endpoint
https://api.innovapp-soft.com/v2/store/imei/buy
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
service_id Si en compra string Identificador del servicio IMEI. 115
device_id Depende string IMEI, serial u otro identificador solicitado por el servicio. 356938035643809
input Depende object Campos dinamicos solicitados por el servicio IMEI. {"IMEI":"356938035643809"}
client_purchase_id Si en compra string Idempotency key unica creada por tu sistema para esta compra. order-2026-000184
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/imei/buy' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"service_id":"115","input":{"IMEI":"356938035643809"},"client_purchase_id":"imei-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/imei/buy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "service_id": "115",
    "input": {
        "IMEI": "356938035643809"
    },
    "client_purchase_id": "imei-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.imei.buy.ok",
    "message": "OK",
    "data": {
        "status": "pending",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
3 POST Consultar órdenes /v2/store/imei/orders
Servicios IMEI: Devuelve el historial paginado de solicitudes IMEI.

Servicios IMEI: Devuelve el historial paginado de solicitudes IMEI.

Endpoint
https://api.innovapp-soft.com/v2/store/imei/orders
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/imei/orders' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/imei/orders', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.imei.orders.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
4 POST Consultar estado /v2/store/imei/status
Servicios IMEI: Consulta el estado y el resultado de una solicitud IMEI.

Servicios IMEI: Consulta el estado y el resultado de una solicitud IMEI.

Endpoint
https://api.innovapp-soft.com/v2/store/imei/status
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
order_id Si en status string Identificador de la orden devuelto al crearla. 1842
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/imei/status' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"1842","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/imei/status', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "order_id": "1842",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.imei.status.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Store V2 · eSIM

Flujo recomendado: consultar destinos y planes, comprar la eSIM y después consultar sus datos de instalación.

1 POST Consultar catálogo /v2/store/esim/catalog
eSIM: Lista destinos y planes eSIM disponibles.

eSIM: Lista destinos y planes eSIM disponibles.

Endpoint
https://api.innovapp-soft.com/v2/store/esim/catalog
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
mode No string Vista del catalogo solicitada. countries
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/esim/catalog' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"mode":"countries","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/esim/catalog', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "mode": "countries",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.esim.catalog.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
2 POST Comprar /v2/store/esim/buy
eSIM: Compra un plan eSIM para el pais seleccionado.

eSIM: Compra un plan eSIM para el pais seleccionado.

Endpoint
https://api.innovapp-soft.com/v2/store/esim/buy
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
offer_id Si en compra string Identificador exacto de la oferta seleccionada. 61
client_purchase_id Si en compra string Idempotency key unica creada por tu sistema para esta compra. order-2026-000184
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/esim/buy' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"country":"US","offer_id":"esim-us-10gb","client_purchase_id":"esim-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/esim/buy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "country": "US",
    "offer_id": "esim-us-10gb",
    "client_purchase_id": "esim-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.esim.buy.ok",
    "message": "OK",
    "data": {
        "status": "pending",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
3 POST Consultar órdenes /v2/store/esim/orders
eSIM: Devuelve las ordenes eSIM del usuario vinculado.

eSIM: Devuelve las ordenes eSIM del usuario vinculado.

Endpoint
https://api.innovapp-soft.com/v2/store/esim/orders
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/esim/orders' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/esim/orders', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.esim.orders.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
4 POST Consultar estado /v2/store/esim/status
eSIM: Consulta una orden eSIM y sus datos de instalacion cuando esten disponibles.

eSIM: Consulta una orden eSIM y sus datos de instalacion cuando esten disponibles.

Endpoint
https://api.innovapp-soft.com/v2/store/esim/status
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
order_id Si en status string Identificador de la orden devuelto al crearla. 1842
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/esim/status' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"1842","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/esim/status', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "order_id": "1842",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.esim.status.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Store V2 · Números virtuales

Flujo recomendado: consultar disponibilidad, alquilar, listar tus números y después gestionar renovación, estado, conversaciones y mensajes.

1 POST Consultar catálogo /v2/store/virtual-numbers/catalog
Números virtuales: Lista los numeros virtuales que se pueden alquilar por pais.

Números virtuales: Lista los numeros virtuales que se pueden alquilar por pais.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/catalog
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
limit No integer Cantidad maxima de resultados, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/catalog' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"country":"US","limit":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/catalog', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "country": "US",
    "limit": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.catalog.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
2 POST Alquilar número /v2/store/virtual-numbers/rent
Números virtuales: Alquila el numero E.164 seleccionado en el catalogo.

Números virtuales: Alquila el numero E.164 seleccionado en el catalogo.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/rent
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
country Depende string Codigo ISO 3166-1 alpha-2 del pais. CU
e164 Si en rent string Numero internacional E.164 seleccionado en el catalogo. +12125550123
client_purchase_id Si en compra string Idempotency key unica creada por tu sistema para esta compra. order-2026-000184
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/rent' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"country":"US","e164":"+12125550123","client_purchase_id":"number-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/rent', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "country": "US",
    "e164": "+12125550123",
    "client_purchase_id": "number-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.rent.ok",
    "message": "OK",
    "data": {
        "status": "pending",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
3 POST Mis números /v2/store/virtual-numbers/numbers
Números virtuales: Lista los numeros virtuales alquilados por el usuario vinculado.

Números virtuales: Lista los numeros virtuales alquilados por el usuario vinculado.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/numbers
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/numbers' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/numbers', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.numbers.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
4 POST Consultar estado /v2/store/virtual-numbers/status
Números virtuales: Consulta el estado de un numero virtual o de su orden.

Números virtuales: Consulta el estado de un numero virtual o de su orden.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/status
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
number_id Depende string Identificador del numero virtual alquilado. vn_1842
order_id Si en status string Identificador de la orden devuelto al crearla. 1842
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/status' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"number_id":"vn_1842","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/status', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "number_id": "vn_1842",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.status.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
5 POST Mensajes recibidos /v2/store/virtual-numbers/messages
Números virtuales: Obtiene los mensajes recibidos por un numero virtual.

Números virtuales: Obtiene los mensajes recibidos por un numero virtual.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/messages
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
number_id Depende string Identificador del numero virtual alquilado. vn_1842
limit No integer Cantidad maxima de resultados, maximo 100. 20
cursor No integer Cursor para continuar una lista de mensajes. 0
conversation_id No string Conversacion que se desea consultar. conv_102
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/messages' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"number_id":"vn_1842","limit":20,"cursor":0,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/messages', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "number_id": "vn_1842",
    "limit": 20,
    "cursor": 0,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.messages.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
6 POST Conversaciones /v2/store/virtual-numbers/conversations
Números virtuales: Lista las conversaciones agrupadas de un numero virtual.

Números virtuales: Lista las conversaciones agrupadas de un numero virtual.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/conversations
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
number_id Depende string Identificador del numero virtual alquilado. vn_1842
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/conversations' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"number_id":"vn_1842","page":1,"per_page":20,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/conversations', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "number_id": "vn_1842",
    "page": 1,
    "per_page": 20,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.conversations.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
7 POST Marcar mensajes leídos /v2/store/virtual-numbers/mark-read
Números virtuales: Marca como leidos los mensajes de un numero virtual.

Números virtuales: Marca como leidos los mensajes de un numero virtual.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/mark-read
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
number_id Depende string Identificador del numero virtual alquilado. vn_1842
message_id No integer Mensaje hasta el cual se marcara como leido. 509
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/mark-read' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"number_id":"vn_1842","message_id":509,"language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/mark-read', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "number_id": "vn_1842",
    "message_id": 509,
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.mark_read.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
8 POST Configurar renovación /v2/store/virtual-numbers/auto-renew
Números virtuales: Activa o desactiva la renovacion automatica de un numero virtual alquilado. Al desactivarla, el numero permanece activo hasta su vencimiento.

Números virtuales: Activa o desactiva la renovacion automatica de un numero virtual alquilado. Al desactivarla, el numero permanece activo hasta su vencimiento.

Endpoint
https://api.innovapp-soft.com/v2/store/virtual-numbers/auto-renew
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
number_id Depende string Identificador del numero virtual alquilado. vn_1842
auto_renew Si boolean Usa true para activar la renovacion automatica o false para desactivarla. 1
client_request_id No string Identificador opcional de la solicitud generado por tu sistema. renew-2026-000184
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/store/virtual-numbers/auto-renew' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"number_id":"vn_1842","auto_renew":true,"client_request_id":"renew-2026-000184","language":"es"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/store/virtual-numbers/auto-renew', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "number_id": "vn_1842",
    "auto_renew": true,
    "client_request_id": "renew-2026-000184",
    "language": "es"
})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "store.virtual_numbers.auto_renew.ok",
    "message": "OK",
    "data": {
        "status": "available",
        "items": []
    },
    "error": [],
    "time": "2026-07-29T15:30:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 40101,
    "message": "Invalid API key."
}
422 Parametro requerido
{
    "success": false,
    "code": 47017,
    "message": "Required field is missing: client_purchase_id"
}
502 Servicio temporalmente no disponible
{
    "success": false,
    "code": 47020,
    "message": "The Store service is temporarily unavailable."
}

Notas

  • No envies userIdentifier: el usuario KeyPay se obtiene del developer autenticado.
  • Las compras requieren client_purchase_id unico. Si repites la misma solicitud usa exactamente el mismo valor.
  • El catalogo determina los identificadores, montos y campos validos; no construyas offer_id, service_id ni e164 manualmente.
  • La API puede devolver pending, processing, completed, failed o refunded segun el producto.
Finance V2 · Depositos cripto

Flujo: consulta monedas, crea el deposito, muestra wallet/memo y verifica el estado por ID.

1 POST Listar monedas de deposito /v2/deposits/crypto/methods
Listar monedas de deposito.

Listar monedas de deposito.

Endpoint
https://api.innovapp-soft.com/v2/deposits/crypto/methods
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/deposits/crypto/methods' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/deposits/crypto/methods', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "deposits.crypto.methods.ok",
    "message": "OK",
    "data": {
        "catalog": [
            {
                "name": "Criptomonedas",
                "methods": [
                    {
                        "tick": "USDT",
                        "min_amount": 20,
                        "max_amount": "1000000.000"
                    }
                ]
            }
        ]
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
2 POST Crear deposito cripto /v2/deposits/crypto/create
Crear deposito cripto.

Crear deposito cripto.

Endpoint
https://api.innovapp-soft.com/v2/deposits/crypto/create
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
amount Si number Monto solicitado. 100.00
currency Si en deposito string Tick exacto devuelto por el catalogo cripto. USDT
client_reference Si al crear string Referencia idempotente unica generada por tu sistema. finance-2026-000184
customer_reference No string Identificador interno de tu usuario o cliente. customer-8291
description No string Descripcion visible para conciliar la operacion. Retiro solicitado por customer-8291
metadata No object Hasta 20 pares clave/valor para conciliacion. {"invoice_id":"INV-184"}
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/deposits/crypto/create' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": 100,
    "currency": "USDT",
    "client_reference": "deposit-2026-000184",
    "customer_reference": "customer-8291",
    "description": "Recarga de saldo",
    "metadata": {
        "invoice_id": "INV-184"
    },
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/deposits/crypto/create', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"amount":100,"currency":"USDT","client_reference":"deposit-2026-000184","customer_reference":"customer-8291","description":"Recarga de saldo","metadata":{"invoice_id":"INV-184"},"language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "deposits.crypto.create.ok",
    "message": "OK",
    "data": {
        "deposit": {
            "id": "dep_09f4c71092d30b86e30e6ee284c491dd",
            "type": "crypto_deposit",
            "status": "pending",
            "client_reference": "deposit-2026-000184",
            "details": {
                "crypto": {
                    "wallet": "TXxxxxxxxx",
                    "memo": "",
                    "coin_amount": "99.50",
                    "expires_at": "2026-07-31 10:29:00"
                },
                "next_action": "check_crypto"
            }
        },
        "idempotent_replay": false
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
3 POST Listar depositos cripto /v2/deposits/crypto/list
Listar depositos cripto.

Listar depositos cripto.

Endpoint
https://api.innovapp-soft.com/v2/deposits/crypto/list
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
status No string Filtra el historial por estado exacto. completed
client_reference Si al crear string Referencia idempotente unica generada por tu sistema. finance-2026-000184
customer_reference No string Identificador interno de tu usuario o cliente. customer-8291
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/deposits/crypto/list' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "page": 1,
    "per_page": 20,
    "status": "completed",
    "customer_reference": "customer-8291",
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/deposits/crypto/list', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"page":1,"per_page":20,"status":"completed","customer_reference":"customer-8291","language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "deposits.crypto.list.ok",
    "message": "OK",
    "data": {
        "items": [],
        "pagination": {
            "page": 1,
            "per_page": 20,
            "total": 0
        }
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
4 POST Consultar deposito y verificar estado /v2/deposits/crypto/get
Consultar deposito y verificar estado.

Consultar deposito y verificar estado.

Endpoint
https://api.innovapp-soft.com/v2/deposits/crypto/get
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
id Si en get string ID publico Developer devuelto al crear. dep_09f4c71092d30b86e30e6ee284c491dd
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/deposits/crypto/get' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": "dep_09f4c71092d30b86e30e6ee284c491dd",
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/deposits/crypto/get', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"id":"dep_09f4c71092d30b86e30e6ee284c491dd","language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "deposits.crypto.get.ok",
    "message": "OK",
    "data": {
        "deposit": {
            "id": "dep_09f4c71092d30b86e30e6ee284c491dd",
            "status": "completed",
            "client_reference": "deposit-2026-000184"
        }
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
Finance V2 · Retiros

Flujo: lista metodos, consulta los campos del metodo elegido, calcula preview, crea con referencia unica y consulta historial o estado.

1 POST Listar metodos de retiro /v2/withdrawals/methods
Listar metodos de retiro.

Listar metodos de retiro.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/methods
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/methods' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/methods', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.methods.ok",
    "message": "OK",
    "data": {
        "groups": [
            {
                "name": "Criptomonedas",
                "methods": [
                    {
                        "tick": "TRX",
                        "min_amount": "5.000",
                        "max_amount": "5000.000"
                    }
                ]
            }
        ]
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
2 POST Consultar campos del metodo /v2/withdrawals/method
Consultar campos del metodo.

Consultar campos del metodo.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/method
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
tick Si en retiro string Tick exacto devuelto por methods. TRX
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/method' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "tick": "TRX",
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/method', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"tick":"TRX","language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.method.ok",
    "message": "OK",
    "data": {
        "membership_tier": "gold",
        "method": {
            "tick": "TRX",
            "name": "TRX",
            "destination": {
                "label": "Wallet",
                "fields": [
                    {
                        "key": "Wallet",
                        "label": "Wallet",
                        "type": "text",
                        "required": true
                    }
                ]
            }
        }
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
3 POST Calcular retiro /v2/withdrawals/preview
Calcular retiro.

Calcular retiro.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/preview
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
tick Si en retiro string Tick exacto devuelto por methods. TRX
amount Si number Monto solicitado. 100.00
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/preview' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "tick": "TRX",
    "amount": 100,
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/preview', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"tick":"TRX","amount":100,"language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.preview.ok",
    "message": "OK",
    "data": {
        "amount_requested": "100.000",
        "system_fee_percent": "1.0000",
        "amount_after_system_fee": "99.000",
        "amount_to_send_usd": "97.218"
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
4 POST Crear retiro /v2/withdrawals/create
Crear retiro.

Crear retiro.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/create
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
tick Si en retiro string Tick exacto devuelto por methods. TRX
amount Si number Monto solicitado. 100.00
destination Si en retiro object Campos exactos solicitados por working_data. {"Wallet":"TXxxxxxxxx"}
client_reference Si al crear string Referencia idempotente unica generada por tu sistema. finance-2026-000184
customer_reference No string Identificador interno de tu usuario o cliente. customer-8291
description No string Descripcion visible para conciliar la operacion. Retiro solicitado por customer-8291
metadata No object Hasta 20 pares clave/valor para conciliacion. {"invoice_id":"INV-184"}
pingpass Depende string Contrasena segura si el usuario tiene este 2FA activo. ******
pingemail Depende string Codigo enviado por correo si esta activo. 123456
pingtelegram Depende string Codigo enviado por Telegram si esta activo. 123456
pinggoogle Depende string Codigo de Google Authenticator si esta activo. 123456
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/create' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "tick": "TRX",
    "amount": 100,
    "destination": {
        "Wallet": "TXxxxxxxxx"
    },
    "client_reference": "withdraw-2026-000184",
    "customer_reference": "customer-8291",
    "description": "Retiro semanal",
    "metadata": {
        "invoice_id": "INV-184"
    },
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/create', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"tick":"TRX","amount":100,"destination":{"Wallet":"TXxxxxxxxx"},"client_reference":"withdraw-2026-000184","customer_reference":"customer-8291","description":"Retiro semanal","metadata":{"invoice_id":"INV-184"},"language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.create.ok",
    "message": "OK",
    "data": {
        "withdrawal": {
            "id": "wd_09f4c71092d30b86e30e6ee284c491dd",
            "type": "withdrawal",
            "status": "processing",
            "client_reference": "withdraw-2026-000184"
        },
        "idempotent_replay": false
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
5 POST Listar retiros /v2/withdrawals/list
Listar retiros.

Listar retiros.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/list
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
page No integer Pagina del historial. 1
per_page No integer Resultados por pagina, maximo 100. 20
status No string Filtra el historial por estado exacto. completed
client_reference Si al crear string Referencia idempotente unica generada por tu sistema. finance-2026-000184
customer_reference No string Identificador interno de tu usuario o cliente. customer-8291
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/list' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "page": 1,
    "per_page": 20,
    "status": "completed",
    "customer_reference": "customer-8291",
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/list', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"page":1,"per_page":20,"status":"completed","customer_reference":"customer-8291","language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.list.ok",
    "message": "OK",
    "data": {
        "items": [],
        "pagination": {
            "page": 1,
            "per_page": 20,
            "total": 0
        }
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
6 POST Consultar retiro /v2/withdrawals/get
Consultar retiro.

Consultar retiro.

Endpoint
https://api.innovapp-soft.com/v2/withdrawals/get
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
id Si en get string ID publico Developer devuelto al crear. dep_09f4c71092d30b86e30e6ee284c491dd
language No string Idioma de la respuesta: es o en. es

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v2/withdrawals/get' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": "wd_09f4c71092d30b86e30e6ee284c491dd",
    "language": "es"
}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v2/withdrawals/get', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({"id":"wd_09f4c71092d30b86e30e6ee284c491dd","language":"es"})
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "withdrawals.get.ok",
    "message": "OK",
    "data": {
        "withdrawal": {
            "id": "wd_09f4c71092d30b86e30e6ee284c491dd",
            "status": "completed",
            "client_reference": "withdraw-2026-000184"
        }
    },
    "error": [],
    "time": "2026-07-31T10:00:00-04:00"
}

Ejemplos de error

401 API key invalida
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized."
}
422 Datos invalidos
{
    "success": false,
    "code": 48007,
    "message": "The amount is invalid."
}
503 Servicio no disponible
{
    "success": false,
    "code": 48012,
    "message": "Finance API V2 is not ready. Apply the finance migration first."
}

Notas

  • No envies userIdentifier: se usa el usuario KeyPay vinculado al developer autenticado.
  • client_reference es obligatoria al crear y evita duplicar la operacion. Reutilizala solamente para reintentar la misma solicitud.
  • Guarda siempre el campo data.id. Las consultas get aceptan el ID Developer, no el identificador interno de KeyPay.
Finance V2 · Webhooks

Eventos finales enviados al webhook de la API key que creo la operacion. Si esa key no tiene webhook, se usa el webhook general del developer.

1 POST Eventos finales de depositos y retiros URL de webhook configurada
Se envia un evento cuando una operacion alcanza un estado final.

Se envia un evento cuando una operacion alcanza un estado final.

Endpoint
Webhook por API key; fallback al webhook general
Auth
Firma HMAC del webhook
Method
POST

Headers requeridos

Header Valor
X-InnovappSoft-Event crypto_deposit.completed
X-InnovappSoft-Delivery whd_xxxxxxxxxxxxxxxx
X-InnovappSoft-Timestamp 1785506400
X-InnovappSoft-Signature HMAC-SHA256(timestamp.body, secret)

Body params

Nombre Requerido Tipo Descripción Ejemplo
event Si string Nombre del evento final. withdrawal.completed
sent_at Si datetime Fecha de envio. 2026-07-31 10:00:00
data.id Si string ID publico Developer de la operacion. wd_09f4c71092d30b86e30e6ee284c491dd
data.client_reference Si string Referencia idempotente enviada al crear. withdraw-2026-000184
data.destination Si object Destino asociado a la operacion. {"Wallet":"TXxxxxxxxx"}
data.metadata Si object Metadatos enviados al crear. {"invoice_id":"INV-184"}

Ejemplo cURL

# Tu servidor recibe un POST en la URL configurada.
# Verifica X-InnovappSoft-Signature antes de procesar el body.

Ejemplo JavaScript

const expected = hmacSha256(secret, timestamp + '.' + rawBody);
if (!timingSafeEqual(signature, expected)) throw new Error('Invalid signature');

Respuesta exitosa

{
    "event": "withdrawal.completed",
    "sent_at": "2026-07-31 10:00:00",
    "developer": {
        "id": 4,
        "name": "Mi empresa",
        "app_name": "Mi aplicacion"
    },
    "api_key": {
        "id": 14,
        "label": "Produccion",
        "key_prefix": "dk_live_0c953c"
    },
    "data": {
        "id": "wd_09f4c71092d30b86e30e6ee284c491dd",
        "type": "withdrawal",
        "status": "completed",
        "client_reference": "withdraw-2026-000184",
        "customer_reference": "customer-8291",
        "description": "Retiro semanal",
        "amount": "100.000",
        "currency": "TRX",
        "destination": {
            "Wallet": "TXxxxxxxxx"
        },
        "metadata": {
            "invoice_id": "INV-184"
        }
    }
}

Notas

  • Eventos: crypto_deposit.completed, crypto_deposit.expired, withdrawal.completed, withdrawal.cancelled y withdrawal.failed_refunded.
  • La firma es HMAC-SHA256 usando como mensaje timestamp + punto + body JSON crudo y como clave el secret del webhook.
  • Responde con HTTP 2xx. Las entregas fallidas quedan registradas y pueden reenviarse desde el portal.
  • Los webhooks pueden entregarse mas de una vez ante fallos de red. Deduplica usando X-InnovappSoft-Delivery o la combinacion event + data.id.
Rates API V1 (legacy)

Version anterior conservada por compatibilidad. Para integraciones nuevas usa GET /v2/rates.

1 GET GET /v1/tasas
Devuelve tasas globales y por pais en secciones normalizadas. Cuba incluye fuentes locales como InnovappSoft KeyCoin, elToque y segmentos BCC cuando hay data.

Devuelve tasas globales y por pais en secciones normalizadas. Cuba incluye fuentes locales como InnovappSoft KeyCoin, elToque y segmentos BCC cuando hay data.

Endpoint
https://api.innovapp-soft.com/v1/tasas
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Query params

Nombre Requerido Tipo Descripción Ejemplo
country No string Codigo del pais o mercado. Ejemplos: GLOBAL, CU, US, MX, CO, BR, VE, UY, PE, GY, CA, CH, EU. CU
scope No string Vista a devolver: global, cuba, country u overview. cuba
section No string Filtra una fuente/seccion especifica. Ejemplos: innovapp, eltoque, bcc_segment1, global, usd_value. innovapp
full No integer Usa 1 para incluir el snapshot normalizado completo ademas de las secciones visibles. 1

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v1/tasas?country=CU' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/tasas?country=CU', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": {
        "status": "true",
        "message": "ok",
        "version": "1",
        "scope": "cuba",
        "base": "USD",
        "date": "2026-06-22",
        "updated_at": "2026-06-22 20:30:53",
        "country": {
            "code": "CU",
            "name": "Cuba",
            "currency": "CUP",
            "supported": true
        },
        "countries": [
            {
                "code": "GLOBAL",
                "name": "Global",
                "currency": "USD",
                "supported": true
            },
            {
                "code": "CU",
                "name": "Cuba",
                "currency": "CUP",
                "supported": true
            },
            {
                "code": "MX",
                "name": "Mexico",
                "currency": "MXN",
                "supported": true
            }
        ],
        "history": {
            "today": {
                "date": "2026-06-22",
                "updated_at": "2026-06-22 20:30:53"
            },
            "yesterday": {
                "date": "2026-06-21",
                "updated_at": "2026-06-21 20:30:53"
            },
            "week": {
                "date": "2026-06-15",
                "updated_at": "2026-06-15 20:30:53"
            }
        },
        "sections": [
            {
                "id": "innovapp",
                "title": "InnovappSoft KeyCoin",
                "base": "KCOIN",
                "unit": "currency per 1 KCOIN",
                "rates": [
                    {
                        "code": "CUP",
                        "name": "Cuban Peso",
                        "value": 700,
                        "yesterday": 690,
                        "week": 680,
                        "change": 10,
                        "change_week": 20,
                        "source": "cuba_p2p_kcoin",
                        "image_url": "https://innovapp-soft.com/assets/img/tasas/CUP.png",
                        "image_png": "https://innovapp-soft.com/assets/img/tasas/CUP.png",
                        "image_jpg": "https://innovapp-soft.com/assets/img/tasas/CUP.jpg",
                        "image_fallback": "CU"
                    }
                ]
            },
            {
                "id": "eltoque",
                "title": "elToque",
                "base": "CUP",
                "unit": "CUP per 1 unit",
                "rates": [
                    {
                        "code": "USD",
                        "name": "US Dollar",
                        "value": 695,
                        "yesterday": 690,
                        "week": 680,
                        "change": 5,
                        "change_week": 15,
                        "source": "cu_eltoque_trmi",
                        "image_url": "https://innovapp-soft.com/assets/img/tasas/USD.png",
                        "image_png": "https://innovapp-soft.com/assets/img/tasas/USD.png",
                        "image_jpg": "https://innovapp-soft.com/assets/img/tasas/USD.jpg",
                        "image_fallback": "US"
                    }
                ]
            }
        ]
    },
    "error": []
}

Ejemplos de error

401 401 Unauthorized
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized",
    "data": [],
    "error": []
}

Notas

  • La autenticacion se envia siempre en el header Authorization con formato Bearer.
  • data.sections es la parte recomendada para UI: cada seccion trae rates con value, yesterday, week, change y change_week.
  • country=GLOBAL devuelve comparativas globales contra USD. country=CU devuelve las fuentes cubanas. Otros paises devuelven tasas contra la moneda local del pais.
  • EUR y ECU se normalizan como EUR.
  • Cada rate incluye image_url, image_png, image_jpg e image_fallback para que la app pueda mostrar iconos de moneda con fallback.
Store APIs V1 (legacy)

Version anterior de recargas moviles. Para integraciones nuevas usa Store APIs V2.

1 GET GET /v1/store/mobile_topup
Devuelve los planes disponibles para recarga móvil. Permite filtrar opcionalmente por categoría.

Devuelve los planes disponibles para recarga móvil. Permite filtrar opcionalmente por categoría.

Endpoint
https://api.innovapp-soft.com/v1/store/mobile_topup
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Query params

Nombre Requerido Tipo Descripción Ejemplo
category No string Filtra los productos por categoría. Mobile-Top-Up

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v1/store/mobile_topup?category=Mobile-Top-Up' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/store/mobile_topup?category=Mobile-Top-Up', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": [
        {
            "id": "4f",
            "category": "Mobile-Top-Up",
            "title": "SUPER OFERTA 6GB 60 MIN 60 SMS",
            "details": [
                "6GB",
                "60 MIN",
                "60 SMS"
            ],
            "price": "21.00"
        },
        {
            "id": "4g",
            "category": "Mobile-Micro-Top-Up",
            "title": "Plan de saldo 250 CUP",
            "details": [
                "250 CUP"
            ],
            "price": "5.25"
        }
    ],
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:10:00-04:00",
        "date": "2026-04-22",
        "time": "18:10:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776895800
    }
}

Ejemplos de error

401 401 Unauthorized
{
    "success": false,
    "code": 10023,
    "message": "Unauthorized",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:10:00-04:00",
        "date": "2026-04-22",
        "time": "18:10:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776895800
    }
}
405 405 Method Not Allowed
{
    "success": false,
    "code": 45001,
    "message": "Method not allowed",
    "data": [],
    "error": {
        "details": "PUT"
    },
    "time": {
        "datetime": "2026-04-22T18:10:00-04:00",
        "date": "2026-04-22",
        "time": "18:10:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776895800
    }
}

Notas

  • El parámetro category es opcional.
  • Valores soportados actualmente para category: Mobile-Top-Up y Mobile-Micro-Top-Up.
  • El campo details puede traer un array descriptivo del plan.
2 POST POST /v1/store/mobile_topup
Procesa la compra de una recarga móvil a partir del id del plan y el número telefónico.

Procesa la compra de una recarga móvil a partir del id del plan y el número telefónico.

Endpoint
https://api.innovapp-soft.com/v1/store/mobile_topup
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
id string Identificador del plan, obtenido desde el GET. 4f
phone string Número móvil destino a recargar. 51234567

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v1/store/mobile_topup' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"id":"4f","phone":"51234567"}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/store/mobile_topup', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    id: '4f',
    phone: '51234567'
  })
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "Purchase completed successfully.",
    "data": {
        "transation_id": "et_153_x9Ab3Kp2",
        "recharge_status": "Completed"
    },
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:14:00-04:00",
        "date": "2026-04-22",
        "time": "18:14:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776896040
    }
}

Ejemplos de error

409 409 Operation In Process
{
    "success": false,
    "code": 46001,
    "message": "Operation in progress. Please check your history before buying again.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:14:00-04:00",
        "date": "2026-04-22",
        "time": "18:14:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776896040
    }
}
422 422 Invalid Phone
{
    "success": false,
    "code": 46009,
    "message": "The phone number is invalid.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:14:00-04:00",
        "date": "2026-04-22",
        "time": "18:14:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776896040
    }
}
409 409 Insufficient Credit
{
    "success": false,
    "code": 46012,
    "message": "Insufficient credit.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-04-22T18:14:00-04:00",
        "date": "2026-04-22",
        "time": "18:14:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1776896040
    }
}

Notas

  • El campo id debe ser exactamente el id devuelto por GET /v1/store/mobile_topup.
  • El campo phone se valida y normaliza antes de enviar la recarga.
  • El endpoint usa control de concurrencia por lock para evitar compras duplicadas.
  • Si el débito de crédito ocurre y luego falla la compra, el crédito se revierte.
  • El estado final devuelto hoy es transation_id + recharge_status.
Payments APIs

Endpoints para crear enlaces de pago y gestionar cobros.

1 POST POST /v1/payment_links
Crea un enlace de pago único para que un usuario realice una transferencia hacia tu cuenta. El sistema genera un payment_id no predecible, guarda la solicitud en estado pending y devuelve la URL pública de pago.

Crea un enlace de pago único para que un usuario realice una transferencia hacia tu cuenta. El sistema genera un payment_id no predecible, guarda la solicitud en estado pending y devuelve la URL pública de pago.

Endpoint
https://api.innovapp-soft.com/v1/payment_links
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
amount string Monto a cobrar. Acepta hasta 3 decimales. 25.00
currency No string Moneda del cobro. Actualmente soportado: KCOIN. KCOIN
external_reference No string Referencia interna del comercio o sistema externo. ORDER-10045
title No string Título corto del cobro. Payment request
description No string Descripción corta del cobro. Recharge order
message No string Mensaje opcional asociado al enlace. Complete the payment from your KeyCard app
expires_in_minutes No integer Tiempo de expiración del enlace en minutos. 60
metadata No object Objeto JSON libre para información auxiliar del comercio. {"customer_id":"CUST-88"}

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v1/payment_links' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"amount":"25.00","currency":"KCOIN","external_reference":"ORDER-10045","title":"Payment request","description":"Recharge order","message":"Complete the payment from your KeyCard app","expires_in_minutes":60,"metadata":{"customer_id":"CUST-88"}}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/payment_links', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    amount: '25.00',
    currency: 'KCOIN',
    external_reference: 'ORDER-10045',
    title: 'Payment request',
    description: 'Recharge order',
    message: 'Complete the payment from your KeyCard app',
    expires_in_minutes: 60,
    metadata: {
      customer_id: 'CUST-88'
    }
  })
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "Payment link created successfully.",
    "data": {
        "payment_id": "6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "payment_url": "https://keypay.innovapp-soft.com/pay/6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "status": "pending",
        "amount": "25.000",
        "currency": "KCOIN",
        "external_reference": "ORDER-10045",
        "title": "Payment request",
        "description": "Recharge order",
        "message": "Complete the payment from your KeyCard app",
        "expires_at": "2026-06-02 19:30:00",
        "created_at": "2026-06-02 18:30:00"
    },
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:30:00-04:00",
        "date": "2026-06-02",
        "time": "18:30:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770100200
    }
}

Ejemplos de error

400 400 Amount Required
{
    "success": false,
    "code": 47001,
    "message": "Amount is required.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:30:00-04:00",
        "date": "2026-06-02",
        "time": "18:30:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770100200
    }
}
422 422 Invalid Amount
{
    "success": false,
    "code": 47002,
    "message": "The amount is invalid.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:30:00-04:00",
        "date": "2026-06-02",
        "time": "18:30:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770100200
    }
}
422 422 Invalid Metadata
{
    "success": false,
    "code": 47009,
    "message": "The metadata is invalid.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:30:00-04:00",
        "date": "2026-06-02",
        "time": "18:30:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770100200
    }
}
405 405 Method Not Allowed
{
    "success": false,
    "code": 47012,
    "message": "Method not allowed",
    "data": [],
    "error": {
        "details": "GET"
    },
    "time": {
        "datetime": "2026-06-02T18:30:00-04:00",
        "date": "2026-06-02",
        "time": "18:30:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770100200
    }
}

Notas

  • El campo amount es obligatorio y acepta hasta 3 decimales.
  • El campo currency hoy soporta KCOIN.
  • El campo payment_id es generado por el sistema y no es predecible.
  • El enlace público devuelto en payment_url debe abrirse desde la app o el flujo externo de pago.
  • El cobro se crea inicialmente en estado pending.
  • El usuario paga el monto del enlace. La liquidación al developer puede descontar el fee de payment link configurado por la plataforma.
  • Ejemplo: si el enlace es de 100.000 KCOIN y el fee configurado es 2%, el usuario paga 100.000 KCOIN y el developer recibe 98.000 KCOIN.
2 GET GET /v1/transactions
Devuelve las últimas 10 transacciones creadas por el developer autenticado.

Devuelve las últimas 10 transacciones creadas por el developer autenticado.

Endpoint
https://api.innovapp-soft.com/v1/transactions
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v1/transactions' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/transactions', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": [
        {
            "payment_id": "6d4f21d15e7bc3d9276ea4f0d89ab21c",
            "status": "pending",
            "amount": "25.000",
            "currency": "KCOIN",
            "external_reference": "ORDER-10045",
            "title": "Payment request",
            "description": "Recharge order",
            "message": "Complete the payment from your KeyCard app",
            "paid_transaction_id": null,
            "paid_at": null,
            "expires_at": "2026-06-02 19:30:00",
            "created_at": "2026-06-02 18:30:00",
            "updated_at": "2026-06-02 18:30:00"
        },
        {
            "payment_id": "9f61ad13db19e6d2a80b8b6248ca5f88",
            "status": "paid",
            "amount": "14.500",
            "currency": "KCOIN",
            "external_reference": "ORDER-10046",
            "title": "Service payment",
            "description": "Premium service",
            "message": "Please complete your payment",
            "paid_transaction_id": "trx_4K91AB2",
            "paid_at": "2026-06-02 18:42:11",
            "expires_at": "2026-06-02 19:10:00",
            "created_at": "2026-06-02 18:10:00",
            "updated_at": "2026-06-02 18:42:11"
        }
    ],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}

Ejemplos de error

401 401 Unauthorized
{
    "success": false,
    "code": 47110,
    "message": "Unauthorized",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}
405 405 Method Not Allowed
{
    "success": false,
    "code": 47111,
    "message": "Method not allowed",
    "data": [],
    "error": {
        "details": "POST"
    },
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}

Notas

  • Si no se envía un public_id en la ruta, el endpoint devuelve las últimas 10 transacciones del developer autenticado.
  • La respuesta en data es un array.
  • Cada elemento representa un payment link creado previamente.
3 GET GET /v1/transactions/{public_id}
Devuelve el detalle de una transacción específica usando su payment_id/public_id.

Devuelve el detalle de una transacción específica usando su payment_id/public_id.

Endpoint
https://api.innovapp-soft.com/v1/transactions/{public_id}
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v1/transactions/6d4f21d15e7bc3d9276ea4f0d89ab21c' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/transactions/6d4f21d15e7bc3d9276ea4f0d89ab21c', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
})
.then(r => r.json())
.then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": {
        "payment_id": "6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "status": "pending",
        "amount": "25.000",
        "currency": "KCOIN",
        "external_reference": "ORDER-10045",
        "title": "Payment request",
        "description": "Recharge order",
        "message": "Complete the payment from your KeyCard app",
        "metadata": {
            "customer_id": "CUST-88"
        },
        "paid_transaction_id": null,
        "paid_at": null,
        "expires_at": "2026-06-02 19:30:00",
        "created_at": "2026-06-02 18:30:00",
        "updated_at": "2026-06-02 18:30:00"
    },
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}

Ejemplos de error

404 404 Transaction Not Found
{
    "success": false,
    "code": 47103,
    "message": "The transaction does not exist.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}
422 422 Invalid Public ID
{
    "success": false,
    "code": 47102,
    "message": "The transaction identifier is invalid.",
    "data": [],
    "error": [],
    "time": {
        "datetime": "2026-06-02T18:45:00-04:00",
        "date": "2026-06-02",
        "time": "18:45:00",
        "timezone": "America/Kentucky/Louisville",
        "offset": "-04:00",
        "timestamp": 1770101100
    }
}

Notas

  • El valor {public_id} debe ser el payment_id generado al crear el payment link.
  • La respuesta en data es un objeto único.
  • Solo el developer dueño de la transacción puede consultarla.
PaymentIntent SDK APIs

Endpoints para crear cobros con client_secret y abrir checkout desde SDK iOS/Android.

1 POST POST /v1/payment_intents
Crea un PaymentIntent para SDK. El backend del developer usa su API key secreta y devuelve client_secret + checkout_url a la app móvil.

Crea un PaymentIntent para SDK. El backend del developer usa su API key secreta y devuelve client_secret + checkout_url a la app móvil.

Endpoint
https://api.innovapp-soft.com/v1/payment_intents
Auth
Bearer API Key
Method
POST

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json
Content-Type application/json

Body params

Nombre Requerido Tipo Descripción Ejemplo
amount string Monto a cobrar. Acepta hasta 3 decimales. 10.00
currency No string Moneda del cobro. Actualmente soportado: KCOIN. KCOIN
external_reference No string Referencia interna del comercio. ORDER-1001
title No string Título corto del cobro. Premium purchase
return_url No string Deep link o URL de retorno de la app. myapp://keypay-return
platform No string ios, android o web. ios
bundle_id No string Bundle ID iOS. com.example.app
package_name No string Package Android. com.example.app
metadata No object JSON libre para tu orden. {"order_id":"1001"}

Ejemplo cURL

curl -X POST 'https://api.innovapp-soft.com/v1/payment_intents' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"amount":"10.00","currency":"KCOIN","external_reference":"ORDER-1001","title":"Premium purchase","return_url":"myapp://keypay-return","platform":"ios","bundle_id":"com.example.app","metadata":{"order_id":"1001"}}'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/payment_intents', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    amount: '10.00',
    currency: 'KCOIN',
    external_reference: 'ORDER-1001',
    title: 'Premium purchase',
    return_url: 'myapp://keypay-return',
    platform: 'ios',
    bundle_id: 'com.example.app',
    metadata: { order_id: '1001' }
  })
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "PaymentIntent created successfully.",
    "data": {
        "id": "pi_6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "object": "payment_intent",
        "status": "requires_payment",
        "amount": "10.000",
        "currency": "KCOIN",
        "client_secret": "kpi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "checkout_url": "https://keypay.innovapp-soft.com/pay/6d4f21d15e7bc3d9276ea4f0d89ab21c?intent=pi_...",
        "payment_link_id": "6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "expires_at": "2026-06-16 19:30:00",
        "created_at": "2026-06-16 18:30:00"
    },
    "error": []
}

Notas

  • Nunca coloques la API key dk_live dentro de iOS o Android.
  • El backend del developer crea el PaymentIntent y entrega a la app solo client_secret + checkout_url.
  • En esta versión el PaymentIntent está respaldado por el flujo existente de payment links.
  • La confirmación final debe hacerse por webhook o consultando GET /v1/payment_intents/{id}.
2 SDK SwiftUI SDK KeyPayPaymentSDK
SDK oficial para integrar PaymentIntent en apps SwiftUI. El developer instala el paquete desde GitHub, configura su backend y usa KeyPayPaymentButton para abrir el sheet de pago listo.

SDK oficial para integrar PaymentIntent en apps SwiftUI. El developer instala el paquete desde GitHub, configura su backend y usa KeyPayPaymentButton para abrir el sheet de pago listo.

Endpoint
https://github.com/innovappsoft/KeyPayPaymentSDK.git
Auth
Developer Backend
Method
SDK

Headers requeridos

Header Valor
Package URL https://github.com/innovappsoft/KeyPayPaymentSDK.git
Version v1.0.0 o superior
Import import KeyPayPaymentSDK

Body params

Nombre Requerido Tipo Descripción Ejemplo
paymentIntentEndpoint URL Endpoint de tu backend que crea PaymentIntent con dk_live. https://tuapp.com/api/keypay/payment-intents
paymentStatusEndpoint Recomendado URL Endpoint de tu backend que consulta GET /v1/payment_intents/{id}. https://tuapp.com/api/keypay/payment-intents
returnURLScheme string URL Scheme registrado en Xcode para volver a la app. myapp
merchantDisplayName string Nombre visible del comercio dentro del sheet. My App

Ejemplo cURL

git clone https://github.com/innovappsoft/KeyPayPaymentSDK.git

# O en Xcode:
# File > Add Package Dependencies > https://github.com/innovappsoft/KeyPayPaymentSDK.git
# Version: Up to Next Major desde 1.0.0

Ejemplo SwiftUI

import SwiftUI
import KeyPayPaymentSDK

@main
struct MyApp: App {
    init() {
        KeyPay.configure(
            paymentIntentEndpoint: URL(string: "https://tuapp.com/api/keypay/payment-intents")!,
            paymentStatusEndpoint: URL(string: "https://tuapp.com/api/keypay/payment-intents")!,
            returnURLScheme: "myapp",
            merchantDisplayName: "My App"
        )
    }

    var body: some Scene {
        WindowGroup { ContentView() }
    }
}

struct ContentView: View {
    @State private var status = ""

    var body: some View {
        KeyPayPaymentButton(
            request: KeyPayPaymentRequest(
                amount: 10,
                title: "Premium Plan",
                description: "Monthly subscription",
                externalReference: "order_1001",
                metadata: ["order_id": "1001"]
            )
        ) { result in
            switch result {
            case .succeeded(let intent): status = "Paid: \(intent.id)"
            case .pending(let intent): status = "Pending: \(intent.id)"
            case .cancelled: status = "Cancelled"
            case .failed(let error): status = error.localizedDescription
            }
        }
    }
}

Respuesta exitosa

{
    "package": "KeyPayPaymentSDK",
    "github": "https://github.com/innovappsoft/KeyPayPaymentSDK.git",
    "current_version": "v1.0.0",
    "product": "KeyPayPaymentSDK",
    "minimum_ios": "15.0",
    "main_components": [
        "KeyPay.configure",
        "KeyPayPaymentButton",
        "KeyPayPaymentSheet",
        "KeyPayPaymentRequest",
        "KeyPayPaymentResult"
    ]
}

Notas

  • El proyecto del SDK está en GitHub: https://github.com/innovappsoft/KeyPayPaymentSDK.git
  • Para instalar en Xcode usa File > Add Package Dependencies y pega la URL del repo.
  • El developer no debe poner dk_live dentro de la app; dk_live vive solo en su backend.
  • El backend del developer debe exponer POST /payment-intents y GET /payment-intents/{id}.
  • El SDK incluye UI SwiftUI lista, traducciones EN/ES y sheet de pago tipo plug-and-play.
  • Para publicar nuevas versiones crea tags semánticos como v1.0.1, v1.1.0 o v2.0.0.
3 SDK Android SDK KeyPayPaymentAndroidSDK
SDK oficial para integrar PaymentIntent en apps Android con Kotlin o Java. El developer instala la librería desde GitHub, configura su backend y usa KeyPayCheckoutButton para abrir el checkout nativo listo.

SDK oficial para integrar PaymentIntent en apps Android con Kotlin o Java. El developer instala la librería desde GitHub, configura su backend y usa KeyPayCheckoutButton para abrir el checkout nativo listo.

Endpoint
https://github.com/innovappsoft/KeyPayPaymentAndroidSDK.git
Auth
Developer Backend
Method
SDK

Headers requeridos

Header Valor
Repository URL https://github.com/innovappsoft/KeyPayPaymentAndroidSDK.git
Version v1.0.1 o superior
Package com.innovappsoft.keypay.payment
Main module keypay-payment-sdk

Body params

Nombre Requerido Tipo Descripción Ejemplo
paymentIntentEndpoint String Endpoint de tu backend que crea PaymentIntent con dk_live. https://tuapp.com/api/keypay/payment-intents
paymentStatusEndpoint Recomendado String Endpoint de tu backend que consulta GET /v1/payment_intents/{id}. https://tuapp.com/api/keypay/payment-intents
returnUrlScheme String Scheme registrado en AndroidManifest para volver a la app. myapp
merchantDisplayName String Nombre visible del comercio dentro del checkout. My App
package_name Recomendado String Package name Android de la app del developer. com.example.app

Ejemplo cURL

1) Instalación recomendada con JitPack

settings.gradle.kts:
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url = uri("https://jitpack.io") }
    }
}

gradle/libs.versions.toml:
[versions]
keypaySdkVersion = "v1.0.1"

[libraries]
keypay-android-sdk = { module = "com.github.innovappsoft.KeyPayPaymentAndroidSDK:keypay-payment-sdk", version.ref = "keypaySdkVersion" }

app/build.gradle.kts:
dependencies {
    implementation(libs.keypay.android.sdk)
}

Importante:
- Usa v1.0.1 o superior. v1.0.0 no se debe usar para Gradle porque fue source-only y no tenía metadata Maven para JitPack.
- El módulo que se importa es keypay-payment-sdk. El módulo sample-app es solo una demo.
- Si JitPack todavía no terminó de construir el tag, espera unos minutos o usa la opción AAR local.

2) AndroidManifest para recibir el callback

<activity android:name="com.innovappsoft.keypay.payment.KeyPayReturnActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" android:host="keypay-return" />
    </intent-filter>
</activity>

El returnUrlScheme configurado en el SDK debe coincidir con android:scheme.
Ejemplo: returnUrlScheme = "myapp" usa myapp://keypay-return.

3) Opción de prueba local con AAR

En el repo del SDK:
./gradlew :keypay-payment-sdk:assembleRelease

Copia:
keypay-payment-sdk/build/outputs/aar/keypay-payment-sdk-release.aar

a:
app/libs/keypay-payment-sdk-release.aar

app/build.gradle.kts:
dependencies {
    implementation(files("libs/keypay-payment-sdk-release.aar"))
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
}

Cuando se usa AAR local, Android no descarga dependencias transitivas automáticamente, por eso appcompat y material deben estar en la app.

4) Backend requerido del developer

La app nunca debe guardar dk_live. La API key vive en el backend del developer.
El backend debe exponer:
- POST /payment-intents para crear el PaymentIntent usando dk_live.
- GET /payment-intents/{id} para consultar estado y devolverlo a la app.

5) Errores comunes

Could not find com.github.innovappsoft.KeyPayPaymentAndroidSDK:keypay-payment-sdk:v1.0.0
Solución: usar v1.0.1 o superior, o probar con AAR local.

KeyPayReturnActivity aparece en rojo en Android Studio
Solución: la dependencia no está resuelta. Revisa JitPack, Sync Gradle o usa el AAR local.

Cannot generate dependency accessors
Solución: no dupliques alias en libs.versions.toml. Usa keypaySdkVersion para la versión y keypay-android-sdk para la librería.

AndroidX core 1.19 pide compileSdk 37 / AGP 9.1
Solución: baja coreKtx a 1.17.0 o actualiza compileSdk y Android Gradle Plugin.

Ejemplo Kotlin / Java

import com.innovappsoft.keypay.payment.KeyPay
import com.innovappsoft.keypay.payment.KeyPayCheckoutButton
import com.innovappsoft.keypay.payment.KeyPayConfiguration
import com.innovappsoft.keypay.payment.KeyPayPaymentRequest
import com.innovappsoft.keypay.payment.KeyPayPaymentResult

KeyPay.configure(
    KeyPayConfiguration(
        paymentIntentEndpoint = "https://tuapp.com/api/keypay/payment-intents",
        paymentStatusEndpoint = "https://tuapp.com/api/keypay/payment-intents",
        returnUrlScheme = "myapp",
        merchantDisplayName = "My App"
    )
)

val request = KeyPayPaymentRequest(
    amount = "10.00",
    title = "Premium Plan",
    description = "Monthly subscription",
    externalReference = "order_1001",
    metadata = mapOf("order_id" to "1001")
)

val button = KeyPayCheckoutButton(this).apply {
    configure(
        activity = this@MainActivity,
        request = request,
        callback = { result ->
            when (result.status) {
                KeyPayPaymentResult.Status.SUCCEEDED -> {}
                KeyPayPaymentResult.Status.PENDING -> {}
                KeyPayPaymentResult.Status.CANCELLED -> {}
                KeyPayPaymentResult.Status.FAILED -> {}
            }
        },
        title = "Pay with KeyPay"
    )
}

// Java compatible:
// KeyPay.configure(new KeyPayConfiguration(
//     "https://tuapp.com/api/keypay/payment-intents",
//     "https://tuapp.com/api/keypay/payment-intents",
//     "myapp",
//     "My App"
// ));
// KeyPay.startCheckout(this, request, result -> { });

Respuesta exitosa

{
    "package": "KeyPayPaymentAndroidSDK",
    "github": "https://github.com/innovappsoft/KeyPayPaymentAndroidSDK.git",
    "current_version": "v1.0.1",
    "product": "keypay-payment-sdk",
    "minimum_sdk": "API 24 / Android 7.0",
    "languages": [
        "Kotlin",
        "Java"
    ],
    "modules": [
        "keypay-payment-sdk",
        "sample-app"
    ],
    "main_components": [
        "KeyPay.configure",
        "KeyPayCheckoutButton",
        "KeyPayCheckoutActivity",
        "KeyPayPaymentRequest",
        "KeyPayPaymentResult",
        "KeyPayReturnActivity"
    ],
    "manifest_callback": "<activity android:name=\"com.innovappsoft.keypay.payment.KeyPayReturnActivity\" android:exported=\"true\"><intent-filter><action android:name=\"android.intent.action.VIEW\"/><category android:name=\"android.intent.category.DEFAULT\"/><category android:name=\"android.intent.category.BROWSABLE\"/><data android:scheme=\"myapp\" android:host=\"keypay-return\"/></intent-filter></activity>"
}

Ejemplos de error

0
[]
0
[]
0
[]
0
[]

Notas

  • El proyecto del SDK Android está en GitHub: https://github.com/innovappsoft/KeyPayPaymentAndroidSDK.git
  • Usa v1.0.1 o superior para JitPack. v1.0.0 fue una versión source-only y no tenía metadata Maven para Gradle.
  • El módulo real de la librería es keypay-payment-sdk; sample-app es solo una app de ejemplo.
  • Si Android Studio marca KeyPayReturnActivity en rojo, la dependencia no está resuelta: revisa JitPack, Sync Gradle o usa AAR local.
  • Si Gradle dice Could not find com.github..., usa v1.0.1 o genera/copias el AAR local.
  • Si Gradle dice Cannot generate dependency accessors, evita alias duplicados: usa keypaySdkVersion para la versión y keypay-android-sdk para la librería.
  • Si AndroidX core 1.19 exige compileSdk 37 / AGP 9.1, baja coreKtx a 1.17.0 o actualiza AGP/compileSdk.
  • El SDK incluye UI Android nativa, traducciones EN/ES y botón plug-and-play KeyPayCheckoutButton.
  • Compatible con Kotlin y Java mediante API pública Java-friendly.
  • El developer debe registrar el returnUrlScheme en AndroidManifest usando KeyPayReturnActivity.
  • El developer no debe poner dk_live dentro de la app; dk_live vive solo en su backend.
  • El backend del developer debe exponer POST /payment-intents y GET /payment-intents/{id}.
  • Para publicar nuevas versiones crea tags semánticos como v1.0.2, v1.1.0 o v2.0.0.
4 GET GET /v1/payment_intents/{id}
Consulta el estado de un PaymentIntent creado por tu cuenta.

Consulta el estado de un PaymentIntent creado por tu cuenta.

Endpoint
https://api.innovapp-soft.com/v1/payment_intents/{id}
Auth
Bearer API Key
Method
GET

Headers requeridos

Header Valor
Authorization Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept application/json

Ejemplo cURL

curl -X GET 'https://api.innovapp-soft.com/v1/payment_intents/pi_6d4f21d15e7bc3d9276ea4f0d89ab21c' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Accept: application/json'

Ejemplo JavaScript

fetch('https://api.innovapp-soft.com/v1/payment_intents/pi_6d4f21d15e7bc3d9276ea4f0d89ab21c', {
  headers: {
    'Authorization': 'Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Accept': 'application/json'
  }
}).then(r => r.json()).then(console.log);

Respuesta exitosa

{
    "success": true,
    "code": "ok",
    "message": "OK",
    "data": {
        "id": "pi_6d4f21d15e7bc3d9276ea4f0d89ab21c",
        "object": "payment_intent",
        "status": "succeeded",
        "amount": "10.000",
        "currency": "KCOIN",
        "paid_transaction_id": "trx_4K91AB2",
        "paid_at": "2026-06-16 18:42:11"
    },
    "error": []
}

Notas

  • Este endpoint es para backend. No lo llames desde la app móvil con dk_live.
  • El SDK móvil debe devolver control a tu app; tu backend confirma el estado real.