Especificación Técnica Servicio API ACTIVOS VIRTUALES con OAuth 2.0

1. Introducción

Este documento describe los lineamientos y especificaciones técnicas para la integración con la API de Generación y Consulta de Códigos QR activos virtuales de ATC (Redenlace Bolivia). El servicio permite a establecimientos y aplicaciones cliente generar códigos QR de cobro liquidables en activos virtuales y verificar el estado de las transacciones asociadas.

La integración contempla los siguientes flujos:

  1. Autenticación mediante OAuth 2.0 (Client Credentials) para obtención del Access Token.
  2. Generación de un código QR de pago.
  3. Verificación del estado de la transacción QR.

Credenciales

El Token Basic (Authorization), el client_id y el access_token de producción son proporcionados exclusivamente por ATC para cada integrador habilitado. Los valores mostrados en este documento corresponden únicamente al ambiente de pruebas.

2. Header

Todos los servicios de la API requieren el envío de los siguientes encabezados HTTP en cada petición. El Access Token debe obtenerse previamente mediante el servicio de autenticación OAuth 2.0 (ver sección 3.1).

HeaderDescripciónOblig.Ejemplo
AuthorizationToken de autorización. Se envía como Bearer seguido del access_token obtenido en la autenticación.SíBearer 1442981c-....-....-b...-ea12258c9...
client_idIdentificador único del cliente integrador. Proporcionado por ATC.Sí1e063b89-....-....-....-ed73d60cbc67
Content-TypeFormato del cuerpo de la petición. Para todos los servicios: JSON.Síapplication/json
information icon
Autenticación previa obligatoria Para obtener el access_token que se usa en el header Authorization, primero debe invocarse el servicio de autenticación OAuth (sección 3.1). El token Basic requerido en ese paso es provisto por ATC.

3. Generar Transacción QR

3.1. Autenticación — Obtención del Access Token

Antes de poder generar un QR, el integrador debe obtener un Access Token válido mediante el flujo OAuth 2.0 Client Credentials.
AtributoValor
Método HTTPPOST
Endpoint/oauth-client-credentials/access-token
Content-Typeapplication/x-www-form-urlencoded
Query Paramgrant_type=client_credentials

Request — Autenticación (obtener Access Token)

http
600;">POST /oauth-client-credentials/access-token?grant_type=client_credentials Headers: Authorization: Basic ODBiM2M1NWQtNWNiNi00OWRlLTkxYTAtMDcwZDM1M2Iw== Content-Type: application/x-www-form-urlencoded

Header de autenticación

HeaderDescripciónObligatorio
AuthorizationCodificado en Base64 (client_id:client_secret).Sí
Content-Typeapplication/x-www-form-urlencodedSí

Respuesta exitosa — Access Token

json
{ "access_token": "1442981c-....-....-b...-ea12258c9...", "token_type": "Bearer", "expires_in": 3600, "scope": "api.qr" }
CampoTipoDescripción
access_tokenStringToken de portador para usar en los headers de los servicios QR.
token_typeStringTipo de token. Siempre 'Bearer'.
expires_inIntegerTiempo de validez en segundos.
scopeStringAlcance del token otorgado.

3.2. Servicio de Generación de QR

Una vez obtenido el Access Token, se puede invocar el servicio de generación del código QR de pago.

AtributoValor
Método HTTPPOST
ENDPOINT/qr/koibanx/v2/generar
Header: access_token{access_token obtenido en autenticación}
Header: client_id{client_id provisto por ATC}
Header: Content-Typeapplication/json

Request — Generar QR

http
600;">POST /qr/koibanx/v2/generar Headers: access_token: 1442981c-....-....-b...-ea12258c9... client_id: 1e063b89-....-....-....-ed73d60cbc67 Content-Type: application/json

Campos del Request Body

json
{ "numeroReferencia": 2320, "glosa": "422717|Comercio test|MISCELANEAS|Pago de servicio", "monto": 10.50, "moneda": "BOB", "activoVirtual": "UP", "canal": "WEB", "tiempoVencimientoQR": 180, "campoExtra": "", "webhook": { "url": "https://qr.enlacedev.com/confirmed.php", "key": "x-api-key", "value": "f4a1b6d9c3e8f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6" } }
CampoTipoObligatorioDescripción
numeroReferenciaStringSíReferencia interna del sistema originante (asignada por el integrador). Ej: '2320'.
glosaStringSíglosa=codigo_sucursal,nombre_sucursal,rubro_comercio,descripción de pago o servcio.
monedaStringSíCódigo ISO de moneda. Valores permitidos: BOB, USD.
montoDecimalSíImporte del pago. Máximo 2 decimales. Ej: 10.50.
activoVirtualStringSíTipo de moneda virtual de liquidación de la transacción: UT (activo virtual USDT), UP (activo virtual USDC), BK (activo virtual).
canalStringSíIdentificador de canal (permite agrupar y distinguir): APP (aplicación móvil), WEB (sitio web abierto desde navegador de PC), WAP (página HTML abierta desde navegador móvil), OTHERS.
tiempoVencimientoQRIntSíTiempo de vida del QR, en segundos. Mínimo 30, máximo 90.
campoExtraStringNoCampo reservado.
webhookObjetoSíCampo requerido para que el comercio reciba la respuesta de la transacción.

Detalle del objeto webhook

CampoTipoDescripción
urlStringURL del webhook
keyStringTipo de key utilizado (ejemplo: x-api-key)
valueStringValor del key usado

Campos de la Respuesta Exitosa

json
{ "codigoRespuesta": "PENDING", "detalleRespuesta": "Se generó cobro QR con éxito", "moneda": "BOB", "monto": 50, "numeroReferencia": "200716", "origenNumeroReferencia": "321", "imagen": "{cadenaQR en base64}", "montoConversion": 3.93, "monedaConversion": "usdc", "tipoCambio": 12.72, "qrExpiracion": "2026-05-28T16:31:42.057" }
CampoTipoDescripción
codigoRespuestaStringCódigo de respuesta de la acción
detalleRespuestaStringDetalle de la respuesta de la acción
monedaStringTipo de moneda de la transacción, ej. BOB
montoStringMonto de la transacción, ej. BOB
numeroReferenciaStringCódigo único transaccional de ATC
origenNumeroReferenciaStringCódigo único transaccional generado por el comercio integrador
imagenStringCadena con la imagen QR
montoConversionNumberMonto después de la conversión a la moneda virtual, ejemplo a USDT
monedaConversionStringMoneda de la conversión (ej. USDT/USDC)
tipoCambioNumberValor del tipo de cambio de la conversión del monto a montoConversion
qrExpiracionStringFecha en la que expira el QR generado

4. Verificar Estado QR

Permite consultar el estado actual de un QR previamente generado. Se usa el numeroReferencia interno asignado por ATC (campo data.numeroReferencia de la respuesta de generación), no el numeroReferencia originante del integrador.

Request — Consulta de Estado

AtributoValor
Método HTTPGET
ENDPOINT/qr/koibanx/v2/estado/{numeroReferencia}
Header: access_token{access_token obtenido en autenticación}
Header: client_id{provisto por la APP al momento de tener un cliente en el devportal}
Header: Content-Typeapplication/json
Parámetro de ruta{numeroReferencia} — Referencia interna ATC. Ej: 200699
http
600;">GET /qr/koibanx/v2/estado/200699 Headers: access_token: 1442981c-....-....-b...-ea12258c9... client_id: 1e063b89-....-....-....-ed73d60cbc67 Content-Type: application/json

4.1. Campos de la Respuesta Exitosa

Response — Estado QR expirado

json
{ "codigoRespuesta": "EXPIRED", "detalleRespuesta": "Transacción expirada", "data": { "monto": 50.00, "moneda": "BOB", "montoConversion": 50.00, "monedaConversion": "usdc", "tipoCambio": 12.72, "numeroReferencia": 200699 } }

Response — Estado QR pendiente

json
{ "codigoRespuesta": "PENDING", "detalleRespuesta": "Transacción pendiente de procesamiento", "data": { "monto": 50.00, "moneda": "BOB", "montoConversion": 50.00, "monedaConversion": "usdc", "tipoCambio": 12.72, "numeroReferencia": 200699 } }
CampoTipoDescripción
codigoRespuestaStringCódigo del estado de la transacción
detalleRespuestaStringDescripción de estado de la transacción
dataObjetoDatos de la transacción

Detalle del objeto data

CampoTipoDescripción
montoNumberMonto de la transacción
monedaStringTipo de moneda de la transacción
montoConversionNumberMonto después de la conversión a la moneda virtual, ejemplo a USDC
monedaConversionStringMoneda de la conversión (ej. USDC)
tipoCambioNumberValor del tipo de cambio de la conversión del monto a montoConversion
numeroReferenciaNumberCódigo único transaccional de ATC

Descripción de codigoRespuesta

CódigoDescripción
PENDINGEstado cuando la transacción se dio de alta pero aún no fue cobrada.
SUCCESSEstado cuando la transacción se completó de manera satisfactoria.
CANCELLEDEstado cuando la transacción ha sido cancelada sin ser pagada.
EXPIREDEstado cuando el código QR de la transacción ha expirado.
ERRORError de servicio.

5. Ejemplos

5.1. Generar Transacción QR Activos virtuales

Request — Autenticación (obtener Access Token)

http
600;">POST /oauth-client-credentials/access-token?grant_type=client_credentials Headers: Authorization: Basic ODBiM2M1NWQtNWNNi00OWRlLTkxYTAtMDcwZDM1M2IwMDQ3OmQ2OWVlZjQxLTFkMmYtNDBlZC1iNGQ0LTc5MzFiYjljYmI3NA== Content-Type: application/x-www-form-urlencoded

Response — Access Token

json
{ "access_token": "1442981c-89d-46bc-b2a2-ea12258c99ab", "token_type": "Bearer", "expires_in": 3600 }

Request — Generar QR

http
600;">POST /qr/koibanx/v2/generar Headers: access_token: 46a81ec8-ab9f-4c9b-8cbe-0f99052da1e client_id: 80b3c55d-5cb6-49de-91a0-07d353b0047 Content-Type: application/json

Body:

json
{ "numeroReferencia": 321, "glosa": "422717|Comercio test|MISCELANEAS|glosa test", "monto": 50, "moneda": "BOB", "activoVirtual": "UP", "canal": "WEB", "tiempoVencimientoQR": 180, "campoExtra": "", "webhook": { "url": "https://qr.enlacedev.com/confirmed.php", "key": "x-api-key", "value": "f4a1b6d9c3e8f1a2b3c4d5e6fa8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6" } }

Response — QR generado

json
{ "codigoRespuesta": "PENDING", "detalleRespuesta": "Se generó cobro QR con éxito", "moneda": "BOB", "monto": 50, "numeroReferencia": "200716", "origenNumeroReferencia": "321", "imagen": "{cadenaQR en base64}", "montoConversion": 3.93, "monedaConversion": "usdc", "tipoCambio": 12.72, "qrExpiracion": "2026-05-28T16:31:42.057" }

5.2. Verificar Estado QR

Request — Consulta de Estado

http
600;">GET /qr/koibanx/v2/estado/200699 Headers: access_token: c3e71ac-e932-4c37-b9f5-1fe55b2d3db6 client_id: 80b3c55d-5cb6-49de-91a0-070d53b0047 Content-Type: application/json

Response — Estado QR expirado

json
{ "codigoRespuesta": "EXPIRED", "detalleRespuesta": "Transacción expirada", "data": { "monto": 50.00, "moneda": "BOB", "montoConversion": 50.00, "monedaConversion": "usdc", "tipoCambio": 12.72, "numeroReferencia": 200699 } }

Response — Estado QR pendiente

json
{ "codigoRespuesta": "PENDING", "detalleRespuesta": "Transacción pendiente de procesamiento", "data": { "monto": 50.00, "moneda": "BOB", "montoConversion": 50.00, "monedaConversion": "usdc", "tipoCambio": 12.72, "numeroReferencia": 200722 } }

6. Ambientes

El siguiente cuadro contiene los datos de los ambientes disponibles con la URL base y el tipo de token requerido. Las credenciales específicas (Token Basic, client_id, access_token) son proporcionadas por ATC para cada ambiente y cada integrador habilitado.
AmbienteURL BaseCredencialesEstado
Sandboxhttps://atcgwapitest.redenlace.com.bo/sandboxProvisto por ATCA solicitud
Producciónhttps://api.redenlace.com.boProvisto por ATCA solicitud

Seguridad de credenciales

information icon

No almacene credenciales de ningún ambiente (especialmente producción) en repositorios de código fuente. Use variables de entorno o un gestor de secretos. Las credenciales de producción son distintas a las de desarrollo y son entregadas por ATC de forma segura tras aprobar la certificación.