# Menta Docs > Documentación para desarrolladores de Menta: SDK de terminales, servicios y referencia de la API. --- Fuente: / # Introducción **Dirección del servidor MCP:** `/api/mcp` Esta documentación reúne los recursos públicos para integrarse con Menta, ya sea mediante el SDK de Menta en terminales o mediante los servicios de integración vía API. ## Elegir un punto de partida * **SDK para terminales:** capa de abstracción que resuelve autenticación segura, gestión de llaves criptográficas y cifrado, lectura de tarjetas EMV y armado de la mensajería de pagos, anulaciones, devoluciones y reversas. * **Servicios de integración vía API:** permiten integrar un sistema externo con el de Menta para gestionar de forma autónoma cada parte del proceso, de forma anexa a las transacciones de la terminal. * **Referencia de la API:** descripción de cada endpoint disponible. * **Asistentes de IA:** servidor MCP y archivos Markdown para consultar esta documentación desde un asistente. - [Integrarse con terminales](/terminals) - [Integrarse con nuestros servicios](/services) - [Referencia de la API](/api_reference) - [Conectar un asistente de IA](/ai_assistants) ## Primeros pasos 1. [Autenticación](/services/authorization): formas de autenticación de los servicios API (usuario y contraseña, o API Key). 2. [Dar de alta un comercio](/services/create_merchant_v2): un comercio equivale a un local comercial físico y es necesario darlo de alta para comenzar a operar. 3. [Administrar usuarios](/services/user_admin): creación y gestión de usuarios con distintos tipos de permisos. 4. [Integración del SDK de Menta](/terminals): prerrequisitos y pasos para integrar el SDK en una aplicación. 5. [Administración de Webhooks](/services/webhooks): recepción de notificaciones de transacciones (pagos, devoluciones o anulaciones). ## Soporte y contacto Para obtener ayuda adicional o resolver cualquier consulta, se puede escribir al equipo de Menta a soporte@menta.global. ¡Gracias por elegir Menta! Se espera que esta documentación facilite la integración, ya sea con el SDK o con los servicios API, y permita brindar una excelente experiencia de pago a los usuarios. --- Fuente: /ai_assistants # Asistentes de IA Hay dos formas de usar esta documentación con un asistente de IA. En ambos casos el acceso es de solo lectura sobre la documentación pública: sin acceso a tu cuenta ni a operaciones. ## Conectarlo de forma permanente (MCP) MCP es un estándar abierto que permite a los asistentes de IA conectarse a fuentes de información. Una vez configurado, el asistente consulta la documentación por su cuenta cuando la necesita, sin pegar nada en cada conversación. El servidor es remoto, usa HTTP y no requiere credenciales. Elige tu cliente: **Claude** Para claude.ai y la aplicación de escritorio: 1. Abre **Customize > Connectors**. 2. Selecciona **+ Add** y luego **Add custom connector**. 3. Escribe un nombre para el conector y pega la dirección del servidor. 4. Haz clic en **Continue**. En **Authentication**, elige **No sign in**. 5. Haz clic en **Add**. **Dirección del servidor MCP:** `/api/mcp` **Claude Code** Ejecuta este comando en tu terminal: ```bash claude mcp add --transport http menta-docs /api/mcp ``` **Cursor** Usa el enlace para instalarlo con un clic o copia esta configuración en `.cursor/mcp.json` (proyecto) o en `~/.cursor/mcp.json` (global): ```json { "mcpServers": { "menta-docs": { "url": "/api/mcp" } } } ``` **VS Code** Copia esta configuración en `.vscode/mcp.json` (proyecto) o ábrela desde la paleta de comandos con **MCP: Open User Configuration** (usuario). También puedes ejecutar **MCP: Add Server** para un asistente guiado. ```json { "servers": { "menta-docs": { "type": "http", "url": "/api/mcp" } } } ``` **ChatGPT** Para ChatGPT en la web: 1. Abre **Settings > Security and login** y activa **Developer mode**. 2. Ve a **ChatGPT Plugins** y selecciona el botón de más. 3. Escribe un nombre y una descripción. 4. En **Connection**, pega la dirección del servidor y crea la conexión. No requiere autenticación. **Dirección del servidor MCP:** `/api/mcp` **Otro cliente** Cualquier cliente que admita servidores MCP remotos con HTTP puede usar esta dirección, sin credenciales: **Dirección del servidor MCP:** `/api/mcp` ## Preguntar en tu chat ahora No requiere configuración. Copia el mensaje, pega el texto en una conversación con tu asistente y escribe tu pregunta al final. ```text Responde mi pregunta usando la documentación para desarrolladores de Menta. Primero consulta el índice en /llms.txt para ubicar las páginas relevantes y, si necesitas el detalle, el contenido completo en /llms-full.txt. Basa la respuesta únicamente en esa documentación; si la respuesta no aparece en ella, indícalo en lugar de suponerla. Mi pregunta: ``` Si tu asistente no puede leer páginas web, abre el [contenido completo en Markdown](/llms-full.txt), copia el texto y pega ese contenido en la conversación junto con tu pregunta, para que el asistente busque la respuesta en él. ## Documentación en Markdown La documentación también está disponible en Markdown: [índice](/llms.txt) o [contenido completo](/llms-full.txt). --- Fuente: /terminals # Integración del SDK de Menta Al incorporar nuestro SDK en tu aplicación, accedes a una capa de abstracción que te permite aprovechar al máximo todas las capacidades de nuestra plataforma de pagos. Esta integración resuelve procesos complejos como: * Autenticación segura * Gestión de llaves criptográficas y cifrado * Lectura de tarjetas EMV * Configuración y conexión con APIs de Menta * Consulta y reportería de transacciones * Generación y envío de comprobantes por correo * Gestión de la impresora del dispositivo Además, el SDK se encarga del armado completo de la mensajería para operaciones como pagos, anulaciones, devoluciones y reversas, reduciendo significativamente el esfuerzo de implementación y los errores operativos. ![Diagrama general de la arquitectura del SDK de Menta y su interacción con la App externa](/sdk_overview.png) A continuación, se muestra un diagrama de secuencia que ejemplifica la interacción entre una App externa (integración del cliente) y el SDK de Menta durante el proceso de un pago con tarjeta presente. Este flujo refleja cómo el SDK se encarga de las operaciones críticas como la lectura de tarjeta, cifrado de datos y conexión con el backend de Menta, para que la App solo deba orquestar la lógica principal de la operación: ![Diagrama de secuencia entre la App externa, el SDK de Menta y el backend durante un pago con tarjeta presente](/sdk_flow.png) En esta documentación, encontrarás una descripción detallada de los pasos necesarios para llevar a cabo la integración, junto con ejemplos reales que en su mayoría son extractos de código fuente recopilados de nuestra propia aplicación. ¡Comencemos! ## Prerrequisitos Antes de comenzar con el proceso de integración, es fundamental asegurarse de que todas las bases estén cubiertas para una experiencia fluida y exitosa. Los prerrequisitos aquí detallados son esenciales para garantizar una implementación sin contratiempos y para aprovechar al máximo las capacidades de nuestro SDK. | Prerrequisito | Detalle | Responsable | | ------------ | ------- | ----------- | | Alta de customer | Durante este proceso se creará un identificador único en la plataforma de Menta destinado al cliente. Este identificador se entregará a través del medio de comunicación que se establezca entre Menta y el cliente. Cabe aclarar que este identificador se usará posteriormente para la creación de comercios y de API Keys. | Menta | | Alta de usuario para el customer | En este proceso se creará un usuario y una contraseña para acceder al Back Office (BO) de Menta. Estas credenciales le llegarán al cliente por correo. Desde allí podrá dar de alta comercios, consultar transacciones, entre otras funcionalidades. Como parte del proceso de integración y en caso de ser necesario, Menta proporciona un recorrido guiado para explorar el BO. | Menta, Cliente | | Alta de comercios | Este proceso puede llevarse a cabo a través de BO utilizando las credenciales creadas previamente o mediante la implementación de la [API-Merchant](/api_reference/merchants_getall). | Cliente | | Generar API Keys | Las API Keys son el mecanismo de autenticación implementado en el SDK que permite realizar operaciones como pagos o anulaciones. Para el alta de estas Keys se requiere el identificador de customer y de comercios creados previamente. La creación se realiza mediante el [API-Auth](/api_reference/auth_get_token_customer_sdk). | Cliente | | Terminal en modo debug | Menta proveerá una terminal de pago configurada en modo debug para facilitar el desarrollo y la depuración durante el proceso de integración. | Menta | --- Fuente: /terminals/release_notes # Notas de Release Aquí encontrarás todas las novedades, mejoras y correcciones de cada versión del SDK, organizadas por fecha y versión. ## Versión 7.6.3 - Septiembre 2026 > **Advertencia:** Esta versión incluye cambios que rompen compatibilidad: se eliminan los módulos `printer_i9100`, `rest_client` y `keys_admin_core`, y se renombran varios campos de `OperationFlow`. Revisa cada punto de esta sección antes de actualizar. ### Mejoras - **Consolidación de módulos**: Los módulos `printer_i9100`, `rest_client` y `keys_admin_core` se eliminan como dependencias independientes. Su funcionalidad pasa a `core_payment` (7.6.3) y al nuevo módulo `emv_contract` (1.0.1). - **Nueva API de impresión de tickets**: La impresora ya no se instancia con `DevicePrintImpl`. Ahora se obtiene a través de `ReceiptPrinterFactory.create(context)`, que retorna la interfaz `ReceiptPrinter`. Para conocer el resultado de la impresión se usa el nuevo método `ReceiptPrinterFactory.printAndAwaitResult`, que reemplaza el patrón manual de `startPrint()` + `LiveData.observeForever()` (la nueva API llama a `startPrint()` internamente, no es necesario invocarlo antes). ```kotlin // Antes (SDK <= 7.5.x) val devicePrintImpl = DevicePrintImpl(context = applicationContext) // ... devicePrintImpl.startPrint() Handler(Looper.getMainLooper()).post { devicePrintImpl.result.observeForever(resultObserver) } ``` ```kotlin // Ahora (SDK 7.6.3) val devicePrintImpl = ReceiptPrinterFactory.create(applicationContext) // ... ReceiptPrinterFactory.printAndAwaitResult(devicePrintImpl) { result -> if (result == 0) { Log.i(TAG, "Impresión exitosa") } else { Log.i(TAG, "Error de impresión: $result") } } ``` Los imports del paquete de impresión también cambian: ```kotlin // Antes import com.menta.android.printer.i9100.core.DevicePrintImpl import com.menta.android.printer.i9100.model.Align import com.menta.android.printer.i9100.model.TextFormat import com.menta.android.printer.i9100.util.INSTALLMENT_LABEL import com.menta.android.printer.i9100.util.TOTAL_LABEL import com.menta.android.printer.i9100.util.EMPTY // Ahora import com.menta.android.core.terminal.ReceiptPrinterFactory import com.menta.android.emv.contract.printer.Align import com.menta.android.emv.contract.printer.TextFormat import com.menta.android.emv.contract.printer.INSTALLMENT_LABEL import com.menta.android.emv.contract.printer.TOTAL_LABEL import com.menta.android.core.utils.EMPTY ``` - **Migración de `keys_admin_core` a `core_payment`**: Las clases `ParametroDB` y `Resource` se movieron de paquete. Si tu integración las referencia directamente, actualiza el import: ```kotlin // Antes import com.menta.android.keys.admin.core.repository.parametro.ParametroDB import com.menta.android.keys.admin.core.remote.keys.Resource // Ahora import com.menta.android.core.repository.parametro.ParametroDB import com.menta.android.core.remote.keys.Resource ``` - **Campos de `OperationFlow` renombrados a camelCase**: Si tu integración construye estos objetos manualmente (por ejemplo, en un flujo de reverso), actualiza las referencias: | Antes | Ahora | |---|---| | `operationFlow.acquirer_id` | `operationFlow.acquirerReferenceNumber` | | `operationFlow.payment_id` | `operationFlow.paymentId` | | `card.is_international` | `card.isInternational` | | `operationFlow.additional_info` | `operationFlow.additionalInfo` | Ejemplo real, tomando los identificadores del pago original en un reverso: ```kotlin // Antes operationFlow.acquirer_id = transaction.operation.acquirer_id operationFlow.payment_id = transaction.operation.id // Ahora operationFlow.acquirerReferenceNumber = transaction.operation.acquirerReferenceNumber operationFlow.paymentId = transaction.operation.id ``` - **`BinValidationData.setOperationFlow` simplificado**: Ya no requiere los parámetros `currency` e `interest`; solo se necesita `operationFlow`. ```kotlin // Antes binValidationData.setOperationFlow( operationFlow = operationFlow!!, currency = if (Currency.MX.name == currency) CURRENCY_LABEL_MX else CURRENCY_LABEL_ARG, interest = false ) // Ahora binValidationData.setOperationFlow( operationFlow = operationFlow!! ) ``` - **Actualización de dependencias nativas**: `common-cross` 4.1.1 → 4.1.7, `restclient-core` 3.1.1 → 3.1.6, `emv-i9100-reader` 4.0.8 → 4.2.0. La librería nativa Urovo (antes `urovoSdkLibs_New`) se renombra a `com_menta_android_emv_i9100_urovo-native`, siguiendo la convención de nombres del resto de los módulos, sin cambios funcionales. *Puedes ver el detalle completo de estos cambios en este [commit](https://git.menta.global/devices/demo-sdk-menta/-/merge_requests/29/diffs).* --- ## Versión 7.4.5 - Abril 2026 ### Nuevas Funcionalidades ### Mejoras - **Mensajes de lectura de tarjeta**: Se aplicaron mejoras en el proceso de notificar los mensajes de error retornados por el kernel. Se recomienda implementar el ActionType para evaluar qué decisión tomar. *Puedes ver el detalle completo de estos cambios en este [commit](https://git.menta.global/devices/demo-sdk-menta/-/merge_requests/25/diffs).* --- ## Versión 7.4.0 - Marzo 2026 ### Nuevas Funcionalidades - **Implementación de pagos con QR**: Se agregó soporte para realizar transacciones mediante código QR. El comercio debe tener dado de alta el pago con QR para poder utilizar esta funcionalidad. - **Método para consultar métodos de pago disponibles**: Nuevo método que permite consultar los métodos de pago disponibles para el comercio, como pagos con tarjeta y/o pagos con QR, según la configuración y habilitación de cada comercio. ### Mejoras - **Funcionamiento de reversas**: Se aplicaron mejoras en el proceso de reversas para un comportamiento más estable. --- ## Versión 7.2.7 - Noviembre 2025 ### Nuevas Funcionalidades - **Pagos con propina**: Hemos agregado un nuevo ejemplo que muestra cómo implementar pagos con propina de forma sencilla desde la App que integra nuestro SDK. Este caso cubre la lógica necesaria para solicitar e incluir la propina dentro del request final de la transacción. - **Pago en dólares para Argentina**: También añadimos un ejemplo específico para procesar pagos en USD, exclusivamente para terminales operando en Argentina. Este caso permite seleccionar la moneda al momento del pago y construir el request de pago con la moneda seleccionada. > En caso de requerir las nuevas funcionalidades de pago con propinas y pago en dólares, es necesario solicitar previamente la habilitación correspondiente. Estas características no se encuentran activas por defecto y deben ser configuradas por el equipo de Menta y el adquirente. - **Nuevo método de inicialización**: Ahora mediante un sólo método el SDK realiza la inicialización del dispositivo como: Carga de parámetros, carga de llaves y carga de configuración EMV. A partir de esta versión, la clase `MasterKeyData` queda deprecada. ### Mejoras - **Almacenamiento de token**: A partir de esta versión, el SDK se encarga de hacer el storage local del token de sesión, ya no es necesario que se realice desde la App externa. - **Datos del comercio y terminal disponibles**: Desde la App externa se puede acceder a datos como: terminalId, Nombre fantasía del comercio, dirección, etc. Aplica si se usa previamente el nuevo método de inicialización. - **Método de lectura de tarjeta simplificado**: Se requieren menos datos para la invocación del método `findCardProcess`. Aplica si se usa previamente el nuevo método de inicialización. A partir de esta versión, el método anterior queda deprecado. - **Método para consulta de bines simplificado**: Se requieren menos datos para la invocación del método `setOperationFlow`. Aplica si se usa previamente el nuevo método de inicialización. A partir de esta versión, el método anterior queda deprecado. - **Constructor para inicio de transacciones simplificado**: Se requieren menos datos para crear la instancia de la clase `DoProcessAdquirerOperationData`. Aplica si se usa previamente el nuevo método de inicialización. A partir de esta versión, el constructor anterior queda deprecado. - **Método de impresión de lineas simplificado**: A partir de esta versión se agrega el método `addBlackLine` para imprimir líneas de separación, el método anterior `addImage` queda deprecado. ### Correcciones - Solucionamos la impresión de Strings extensos. Al imprimir un String muy extenso, la impresora continúa en la siguiente línea sin perder caracteres. --- ## Historial de Versiones | Versión | Fecha | Tipo | Descripción | |---------|-------|------|-------------| | 7.6.3 | Septiembre 2026 | Major | Consolidación de `printer_i9100` `rest_client` y `keys_admin_core` en `core_payment`/`emv_contract`, nueva API de impresión y renombrado de campos de `OperationFlow`. | | 7.4.5 | Abril 2026 | Major | Mejoras en mensajes de lectura de tarjeta. | | 7.4.0 | Marzo 2026 | Major | Implementación de pagos con QR, método de consulta de métodos de pago y mejoras en reversas. | | 7.2.7 | Noviembre 2025 | Major | Nuevas funcionalidades, mejoras y métodos deprecados. | ## Cómo actualizar Para actualizar a la última versión del SDK, sigue estos pasos: 1. **Revisa las notas de release** para entender los cambios 2. **Revisa la documentación y demo** para acceder a ejemplos de implementación de los nuevos métodos o cambios en el SDK 3. **Verifica compatibilidad** con tu versión actual. Menta va a notificar cuando una versión no es retrocompatible. 4. **Actualiza las dependencias** en tu proyecto 5. **Ejecuta las pruebas** para asegurar que todo funciona correctamente --- *Última actualización: Septiembre 2026* --- Fuente: /terminals/sdk_dependencies # Dependencias En esta sección, encontrarás información sobre las versiones mínimas y la arquitectura recomendada para el uso del SDK de Menta. | Componente | Descripción | | ------ | ----------- | | SDK Android | Nuestro SDK es nativo. La versión mínima de SDK es 27 y el target SDK es 34 | | Kotlin | Nuestro SDK usa la versión 1.9.0 | | Arquitectura i9100 | Para el modelo i9100 se recomienda usar armeabi-v7a.| | Arquitectura i2000 | Para el modelo i2000 se recomienda usar arm64-v8a| #### Dependencias En este apartado se detallan las dependencias que se deben importar: | Dependencia | Descripción | | ----------- | ----------- | | Urovo Native | Dependencia nativa del fabricante de la terminal (Urovo). | | RestClient | Dependencia para el consumo de APIs dentro del SDK. | | Common Cross | Dependencia para el intercambio interno de componentes. | | EMV Reader | Dependencia para procesar la lectura de tarjetas.| | EMV Contract | Dependencia que define las interfaces del kernel EMV y de impresión, compartidas por el resto de los módulos. | | Core Payment | Dependencia que maneja el core para procesar transacciones. A partir de la v7.6.0 también incluye la administración de llaves y seguridad (antes en Keys Admin). | > Acceder al repositorio del SDK para tomar las últimas versiones de librerías disponibles. ###### Dependencias de Menta Las dependencias de Menta son archivos .aar y deben ir dentro de la carpeta /libs del proyecto: ![Archivos .aar de las dependencias de Menta dentro de la carpeta libs del proyecto](/menta_dependencias.png) ```kotlin //Menta dependencies implementation(files("libs/com_menta_android_emv_i9100_urovo-native_1.0.24_urovo-native-1.0.24.aar")) implementation(files("libs/com_menta_android_common_cross_common-cross_4.1.8_common-cross-4.1.8.aar")) implementation(files("libs/com_menta_android_emv_i9100_reader_reader_4.2.1_reader-4.2.1.aar")) implementation(files("libs/com_menta_android_core_core_payment_7.6.3_core_payment-7.6.3.aar")) implementation(files("libs/com_menta_android_emv_contract_contract_1.0.1_contract-1.0.1.jar")) ``` ###### Otras dependencias ```kotlin android { compileOptions { isCoreLibraryDesugaringEnabled = true //Requerido para usar Google Services } } val retrofitVersion: String by project val okhttpBomVersion: String by project val roomVersion: String by project //Retrofit implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion") //OkhttpBomVersion implementation(platform("com.squareup.okhttp3:okhttp-bom:$okhttpBomVersion")) implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") //Security implementation("androidx.security:security-crypto:1.1.0-alpha06") implementation("org.bouncycastle:bcpkix-jdk15on:1.69") implementation("commons-codec:commons-codec:1.16.1") //Room database implementation("androidx.room:room-ktx:$roomVersion") //Google Services coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") ``` Estas dependencias y sus ejemplos de implementación se pueden descargar en el siguiente [repositorio](https://git.menta.global/devices/demo-sdk-menta) --- Fuente: /terminals/config_sdk # Configuración En esta sección, encontrarás la configuración que se debe realizar al proyecto antes de iniciar la integración. #### Crear la clase AppfinRestClientConfigure Esta clase se requiere para configurar el host que el SDK usará para comunicarse con las APIs de Menta. ```kotlin import com.menta.android.restclient.core.RestClientConfigure class AppfinRestClientConfigure : RestClientConfigure { override fun loginDeeplink(): String = "menta://login.ui/unauthorized" override fun urlBase(): String = "https://api.menta.global/" } ``` #### Agregar permisos El permiso de internet es requerido para que el SDK pueda conectarse con las APIs de Menta. Para las terminales con Android 12 se requiere otros permisos. ```kotlin //Para Android 12 en adelante ``` #### Configuración de build.gradle para terminales > Android 12 Para asegurar la compatibilidad con dispositivos que usan Android 12 o versiones más recientes, es necesario realizar una configuración adicional en el archivo build.gradle del proyecto. Dentro del bloque defaultConfig, se debe agregar la sección ndk con los filtros ABI requeridos, para garantizar que el proyecto compile correctamente y se ejecute sin problemas en esas versiones del sistema operativo. ```kotlin defaultConfig { ndk { abiFilters.add("armeabi-v7a") } } ``` #### Crear acceso a los datos de configuración del merchant Los siguientes datos se utilizarán como datos de entrada en los diferentes flujos del SDK. Te recomendamos asegurarte de que tu aplicación tenga acceso a cada uno de ellos. * API Key merchant: Como parte de los requisitos previos, es necesario generar una API Key de tipo merchant. Esta API Key es única para cada merchant y tiene el formato UUID. * Merchant ID: Es el identificador del merchant * Customer ID: Es el identificador del cliente dentro de la plataforma de Menta * Currency Code: Código de moneda con el que opera el comercio. * Country Code: Código de país con el que opera el comercio. * Listado de Tags EMV: Listado de TAGs EMV requeridos por el adquirente en cada transacción. ##### Listado de TAGs EMV ```kotlin //Acquirer GPS val tagList: MutableList = ArrayList() tagList.add("9F26") tagList.add("82") tagList.add("9F36") tagList.add("9F10") tagList.add("9F33") tagList.add("95") tagList.add("9F37") tagList.add("9A") tagList.add("9C") tagList.add("9F02") tagList.add("9F03") tagList.add("9F27") tagList.add("9F34") tagList.add("5F2A") tagList.add("9F1A") tagList.add("5F25") tagList.add("84") tagList.add("9F1E") tagList.add("9F6E") //Adquirer PRISMA val tagList: MutableList = ArrayList() tagList.add("9F33") tagList.add("95") tagList.add("9F37") tagList.add("9F1E") tagList.add("9F10") tagList.add("9F26") tagList.add("9F36") tagList.add("82") tagList.add("9A") tagList.add("9C") tagList.add("9F03") tagList.add("9F02") tagList.add("9F27") tagList.add("5F25") tagList.add("9F34") tagList.add("9F6E") tagList.add("84") //Acquirer Banorte val tagList: MutableList = ArrayList() tagList.add("4f") tagList.add("50") tagList.add("57") tagList.add("5A") tagList.add("82") tagList.add("84") tagList.add("8A") tagList.add("95") tagList.add("9A") tagList.add("9B") tagList.add("9C") tagList.add("5F20") tagList.add("5F24") tagList.add("5F25") tagList.add("5F28") tagList.add("5F2A") tagList.add("5F30") tagList.add("5F34") tagList.add("9F02") tagList.add("9F03") tagList.add("9F07") tagList.add("9F09") tagList.add("9F0D") tagList.add("9F0E") tagList.add("9F0F") tagList.add("9F10") tagList.add("9F12") tagList.add("9F15") tagList.add("9F1A") tagList.add("9F1C") tagList.add("9F1E") tagList.add("9F21") tagList.add("9F26") tagList.add("9F27") tagList.add("9F33") tagList.add("9F34") tagList.add("9F35") tagList.add("9F36") tagList.add("9F37") tagList.add("9F39") tagList.add("9F41") tagList.add("9F53") tagList.add("9F6E") ``` --- Fuente: /terminals/config_app_permissions # Permisos de la App > Este proceso es obligatorio para terminales con Android 12 o superior En esta sección, encontrarás el código fuente de ejemplo para solicitar permisos en la App y asegurar el correcto funcionamiento del SDK en las terminales con Sistema Operativo Android 12 o superior. #### Crear un listado de permisos Estos son los permisos requeridos para el funcionamiento del SDK: ```kotlin private val permissions: Array = arrayOf( android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.ACCESS_WIFI_STATE ) ``` #### Configurar los request de permisos A continuación, se muestra un ejemplo para hacer la petición de permisos en la App: ```kotlin @RequiresApi(Build.VERSION_CODES.R) private val manageAllFilesAccessPermissionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (Environment.isExternalStorageManager()) { setup() } else { Toast.makeText( this, "Por favor permitir acceso a todos los permisos para poder continuar", Toast.LENGTH_SHORT ).show() manageExternalPermissions() } } @RequiresApi(Build.VERSION_CODES.R) private val permissionsLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> val allPermissionsGranted = permissions.values.all { it } if (allPermissionsGranted) { if (!Environment.isExternalStorageManager()) { manageExternalPermissions() } } else { setup() } } @RequiresApi(Build.VERSION_CODES.R) private fun requestPermissions() { permissionsLauncher.launch(permissions) } ``` #### Configuración en el onCreate Es importante asegurarse de tener todos los permisos otorgados antes de iniciar cualquier proceso con el SDK. ```kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() val allPermissionsGranted = permissions.all { permission -> ActivityCompat.checkSelfPermission( this, permission ) == PackageManager.PERMISSION_GRANTED } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !allPermissionsGranted) { requestPermissions() } else { setup() } } ``` El ejemplo completo y funcional de la solicitud de permisos se encuentra en el [repositorio](https://git.menta.global/devices/demo-sdk-menta) de demo. --- Fuente: /terminals/token_retrieval # Recuperar y refrescar token > Este proceso es obligatorio El proceso de integración con el SDK Full se inicia con la obtención del token de autenticación, un recurso clave que facilita el acceso a las APIs de Menta, como operaciones de pago, anulación, devolución y reversa. Para llevar a cabo este paso, es necesario utilizar la API Key de tipo merchant, la cual forma parte de los prerrequisitos. Es responsabilidad del cliente garantizar el acceso y la gestión adecuada de esta clave durante el proceso de integración. #### Requisitos * API Key de tipo merchant. #### Resultado * Token de autenticación listo para ser usado en los siguientes pasos. ## Cómo obtener el token Pasos para recuperar el token: 1. Inicializar la librería Rest Client. 2. Instanciar el objeto `ExternalTokenData` y pasarle como parámetro el contexto de la Aplicación. 3. Consumir el método `getExternalToken` pasando como parámetro el API Key de tipo merchant. 4. Configurar un observer para recibir la respuesta del método `getExternalToken`. > El paso #5 está deprecado a partir de la versión 7.2.5 ~~5. Persistir localmente el token de autenticación usando el objeto `Storage`.~~ #### Ejemplo de implementación ```kotlin import com.menta.android.common_cross.util.StatusType import com.menta.android.core.viewmodel.ExternalTokenData import com.menta.android.core.viewmodel.MasterKeyData import com.menta.android.restclient.core.RestClientConfiguration.configure import com.menta.android.restclient.core.Storage configure(AppfinRestClientConfigure()) val externalTokenData = ExternalTokenData(this) //Recuperar el token externalTokenData.getExternalToken(merchantApiKey) //Configurar el observer externalTokenData.getExternalToken.observe(this) { token -> if (token.status.statusType != StatusType.ERROR) { // Continuar con la inicialización del dispositivo } else { Log.i(TAG, "Get token ERROR: ${token.status.message}") } } ``` #### Ejemplo de response El resultado que se recibe es el objeto LoginResponse mediante el observer configurado. Este tendrá 2 valores: el tipo de token y el token. ```kotlin LoginResponse( tokenType="Bearer", idToken="" ) ``` ## Códigos de respuesta El resultado se recibe mediante el objeto LoginResponse. En la siguiente tabla se muestran los diferentes códigos de error que se recuperan de `token.status.type` | Código | Descripción | | ------ | ----------- | | StatusType.ERROR | Falló el proceso. | | StatusType.SUCCESS | El proceso se realizó exitosamente. | Para el caso de error, se puede recuperar el mensaje de error así: `token.status.message` ## Refrescar token El token utilizado para acceder a las APIs tiene una vigencia limitada. Por ello, es necesario refrescarlo periódicamente para mantener el acceso y operar con normalidad. A partir de la versión **7.2.5**, el SDK se encarga de gestionar este proceso, no es necesario que la App externa realice alguna acción. --- Fuente: /terminals/key_injection # Inicialización de terminal > Este proceso es obligatorio Una vez que se ha [recuperado el token de autenticación](/terminals/token_retrieval), el siguiente paso es realizar el proceso de inicialización. El SDK, de manera interna, realiza la solicitud de parámetros como datos del comercio y terminal, llaves de seguridad para cifrado de datos y configuración EMV para lectura de tarjetas. #### Requisitos * Token de autenticación. * Identificador del merchant (Merchant ID) * Número de serie del dispositivo #### Resultado * Dispositivo listo para operar ## Paso a paso 1. Instanciar el objeto `InitData` y pasarle como parámetro el contexto. 2. Invocar el método `doExecute`. Este método recibe como parámetro: * merchantId: Identificador del comercio retornado como resultado del alta del merchant. * serialCode: Número de serie del dispositivo. 3. Configurar el observer `initDataResult` para recibir el resultado. #### Ejemplo de implementación ```kotlin // Inicialización val initData = InitData(context = this) initData.doExecute(serialCode = getSerial(), merchantId = merchantId) initData.initDataResult.observe(this) { initResult -> initResult?.let { if (initResult.statusType == StatusType.SUCCESS) { Log.i(TAG, "Inicialización exitosa") }else{ Log.e(TAG, "Error: initData ${initResult.message}") } } ?: run { Log.e(TAG, "Error: initData") } ``` ## Códigos de respuesta El resultado se recibe mediante el objeto `StatusResult`. En la siguiente tabla se muestran los diferentes códigos de error que se recuperan de `initResult.statusType` | Código | Descripción | | ------ | ----------- | | StatusType.ERROR | Falló el proceso. | | StatusType.SUCCESS | El proceso se realizó exitosamente. | Para el caso de error, se puede recuperar el mensaje de error así: `initResult.message` --- Fuente: /terminals/card_reader # Lectura de tarjetas > Este proceso es obligatorio En esta fase se procede a la recuperación de datos de la tarjeta mediante la implementación del estándar EMV, haciendo uso del kernel del dispositivo. #### Requisitos * [Proceso de inicialización](/terminals/key_injection) * Montos de la transacción * Tipo de transacción * Código de moneda de la transacción #### Resultado * Después del proceso de lectura, se obtendrá un objeto con todos los datos de la tarjeta requeridos para procesar operaciones de pago, anulaciones o devoluciones. ## Paso a paso 1. Instanciar el objeto `CardProcessData`. 2. Invocar el método `findCardProcess` y pasarle como parámetro: 1. El objeto `OperationFlow` 2. El contexto 3. El modo de lectura a procesar 4. El número de tarjeta cifrado: Aplica para anulaciones y devoluciones. Enviar el número de tarjeta cifrado retornado en la consulta de transacciones, aplica para validar que se está usando la misma tarjeta del pago original, en caso de no requerirlo, enviar null. 3. Configurar los observers para recibir el resultado de la lectura. #### Instanciar objeto OperationFlow * **Amount**: Objeto que contiene información del monto de la transacción en formato ISO. Es decir, los 2 últimos dígitos representan los decimales y no lleva punto decimal. Ejemplo: $10.00 = 1000 * **Capture**: Objeto que contiene información para la captura de los datos de la tarjeta. Se requiere instanciar los objetos: * *Capture()*: Instanciar el objeto así: `operationFlow.capture = Capture()` * *Card()*: Instanciar el objeto. Así: `operationFlow.capture!!.card = Card()` * *Holder()*: Instanciar el objeto. Así: `operationFlow.capture!!.card.holder = Holder()` * *Terminal()*: Instanciar el objeto. Así: `operationFlow.terminal = Terminal()` * **TransactionType**: Tipo de transacción. Este objeto es un enum con los siguientes valores: ```kotlin enum class OperationType { PAYMENT, PREAUTHORIZATION, REFUND, ANNULMENT, POSTAUTHORIZATION } ``` #### Instanciar objeto Amount * **Breakdown**: Listado de desglose de montos. Está compuesta por monto y descripción. Listado de valores: * *OPERATION*: si la transacción tiene propina, aquí va el valor base. Si la transacción no tiene propina, aquí va el valor total. * *TIP*: (aplica cuando la transacción tiene propina, aquí solo va el valor de la propina). * **Currency**: Código de moneda. Posibles valores: * ARS = Pesos Argentinos * MX = Pesos Mexicanos * USD = Dólares americanos. Disponible para Argentina. * **Total**: Monto total de la transacción en formato ISO. Ejemplo: $25.50 = 2550 ### Ejemplo de implementación ```kotlin val cardProcessData = CardProcessData() cardProcessData.findCardProcess( operationFlow = doOperationFlow(amount), context = this, inputModeType = InputMode.ALL ) cardProcessData.selectApp.observe(this, selectAppObserver) cardProcessData.navigate.observe(this, navigateObserver) private fun doOperationFlow( baseAmount: String, tipAmount: String, totalAmount: String ): OperationFlow { operationFlow.amount = Amount() // Crear breakdown para el monto base (siempre presente) val breakdownAmount = Breakdown() breakdownAmount.description = OPERATION breakdownAmount.amount = StringUtils.notFormatAmount(baseAmount) Log.i(TAG, "AMOUNT: ${breakdownAmount.amount}") // Crear lista de breakdowns val breakdownList = mutableListOf() breakdownList.add(breakdownAmount) // Agregar breakdown de propina solo si es mayor a 0 val tipAmountValue = tipAmount.toIntOrNull() ?: 0 if (tipAmountValue > 0) { val breakdownTipAmount = Breakdown() breakdownTipAmount.description = TIP breakdownTipAmount.amount = StringUtils.notFormatAmount(tipAmount) breakdownList.add(breakdownTipAmount) Log.i(TAG, "TIP: ${breakdownTipAmount.amount}") } else { Log.i(TAG, "No tip amount") } operationFlow.capture = Capture() operationFlow.capture!!.card = Card() operationFlow.apply { amount?.let { it.total = StringUtils.notFormatAmount(totalAmount) it.currency = currency it.breakdown = breakdownList } } if (operationType.isNotNull()) { if (operationType != "PAYMENT" && operationType != "PREAUTHORIZATION") { if (currency == CURRENCY_LABEL_MX) { operationFlow.transactionType = OperationType.REFUND } else { if (isToday(transaction.operation.datetime)) { operationFlow.transactionType = OperationType.ANNULMENT } else { operationFlow.transactionType = OperationType.REFUND } } //Se agregan identificadores del pago original operationFlow.acquirerReferenceNumber = transaction.operation.acquirerReferenceNumber operationFlow.paymentId = transaction.operation.id } else { when (operationType) { OperationType.PAYMENT.name -> operationFlow.transactionType = OperationType.PAYMENT OperationType.PREAUTHORIZATION.name -> operationFlow.transactionType = OperationType.PREAUTHORIZATION } } } else { operationFlow.transactionType = OperationType.PAYMENT } //inicializar otros objetos operationFlow.capture!!.card?.holder = Holder() operationFlow.terminal = Terminal() OperationFlowHolder.operationFlow = operationFlow return operationFlow } private val navigateObserver: (Any) -> Unit = { when (it) { is Bundle -> { val status = it.get("status") val statusResult: StatusResult = status as StatusResult val action = ActionType.valueOf(statusResult.readerAction ?: EMPTY) when (action) { ActionType.START_READER_AGAIN_WITH_SWIPE -> { cardProcessData.setFallbackFlag() // Importante para notificar al adquirente que fue fallback banda, no requerido para los otros actions, solo para START_READER_AGAIN_WITH_SWIPE instructionMessageState.value = status.message ?: "Use la banda" cardProcessData.findCardProcess( operationFlow = operationFlow, context = this, inputModeType = InputMode.SWIPE, encryptedPanToValidate = if (operationType != "PAYMENT" && operationType != "PREAUTHORIZATION") { transaction.card.pan } else null ) } ActionType.START_READER_AGAIN_WITH_CONTACT -> { // Action para solicitar nuevamente la lectura insertando la tarjeta } ActionType.START_READER_AGAIN_WITH_CONTACTLESS -> { // Action para solicitar nuevamente la lectura acercando la tarjeta } else -> { // Mostrar mensaje de error: statusResult.description } } } is String -> { //La lectura fue exitosa, continuar a validar BIN val bundle = Bundle().apply { putString("bin", it) } val intent = Intent(this, CardRulesValidationActivity::class.java).apply { putExtras(bundle) } startActivity(intent) } } } ``` ## Observadores de respuesta El resultado se recibe mediante 2 observadores: observer `navigateObserver` y `readerInfoMessage`. En la siguiente tabla se muestran los posibles objetos que se pueden recibir como respuesta de `navigateObserver`: | Objeto | Descripción | | ----- | ----------- | | Bundle de tipo StatusResult | Este objeto se devuelve en caso de fallo durante el proceso de lectura. | | String | Este objeto se devuelve cuando el proceso de lectura es exitoso, retorna el BIN de la tarjeta, los primeros 8 dígitos del número de la tarjeta. | Para el observer `readerInfoMessage` el tipo de objeto a recibir es un String. Estos son notificaciones del kernel que se puede o no mostrar al usuario. Por ejemplo, notifican cuando la tarjeta se detectó ya sea por banda, contactless o chip. Este código de ejemplo muestra cómo implementarlos: ```kotlin cardProcessData.readerInfoMessage.observe(this) { infoMessages -> infoMessages?.let { infoMessagesObserver(it) } } private val infoMessagesObserver: (DataToast) -> Unit = { infoMessages -> Log.i(TAG, "${infoMessages.message}") } ``` #### Objeto StatusResult | Campo | Descripción | | ----- | ----------- | | code | Campo de tipo String. Contiene los posibles errores en la lectura de tarjetas. | | description | Campo de tipo String. Contiene una descripción del código de error. | | readerStatusType | Campo de tipo String que se puede mapear el Enum `MessageType`. Contiene el tipo de error: INFO es mensaje informativo. ERROR es el tipo de mensaje que requiere evaluar la acción sugerida por el SDK.| | readerAction | Campo de tipo String que se puede mapear el Enum `ActionType`. Contiene la acción que se espera de la App. | #### Campo readerAction | Valor | Descripción | | ----- | ----------- | | START_READER_AGAIN_WITH_CONTACT | Se recomienda iniciar nuevamente la lectura insertando la tarjeta. | | START_READER_AGAIN_WITH_SWIPE | Se recomienda iniciar nuevamente la lectura deslizando la tarjeta. | | START_READER_AGAIN_WITH_CONTACTLESS | Se requiere acercar nuevamente la tarjeta. | | RETRY | Se recomienda intentar nuevamente la lectura. | | TRY_ANOTHER_CARD | Se recomienda intentar nuevamente la lectura usando una tarjeta diferente. | Para la implementación en Apps externas, se recomienda evaluar el readerAction para tomar una decisión, sin embargo, a continuación se muestran los posibles errores que puede retornar el kernel en el campo `code`: #### Lista de posibles códigos de error | Código | Descripción | | ------ | ----------- | | PLS_USE_CONTACT_IC_CARD | Pruebe insertando la tarjeta. | | SEE_PHONE_REMOVE_AND_PRESENT_CARD | Lea las instrucciones en su teléfono. | | PLS_SECOND_TAP_CARD | Acerque la tarjeta nuevamente. | | USE_MAG_STRIPE | Use banda. | | TAP_CARD_DETECTED | Tarjeta detectada. | | INSERTED_CARD | Tarjeta insertada. | | MSR | Tarjeta detectada. | | OFFLINE_DECLINED | Tarjeta no aceptada, intente con otra tarjeta. | | DECLINE_OFFLINE | Intente con otra tarjeta. | | END_APPLICATION | Pruebe insertando la tarjeta. | | DISPLAY_BALANCE | Intente con otra tarjeta. | | APPLICATION_BLOCKED | Tarjeta bloqueada, intente con otra tarjeta. | | TRY_AGAIN_RESENT_CARD | Pruebe insertando la tarjeta. | | INSERT_SWIPE_OR_TRY_ANOTHER_CARD | Pruebe insertando la tarjeta. | | TERMINATE | Pruebe insertando la tarjeta. | | PROCESSING_ERROR | Intente con otra tarjeta. | | OTHER_INTERFACES | Pruebe insertando la tarjeta. | | RETRY | Ocurrió un error, intente nuevamente. | | NO_CARD | Tarjeta no detectada, pruebe insertando la tarjeta. | | NOT_ICC | No se pudo leer la tarjeta, use banda. | | BAD_SWIPE | La banda está dañada, pruebe insertando o acercando la tarjeta. | | USE_ICC_CARD | Pruebe insertando la tarjeta. | | NEED_FALLBACK | Use banda. | | TIMEOUT | Se agotó el tiempo de lectura. | | DEVICE_BUSY | El lector está ocupado, intente nuevamente. | | MULT_CARD | Presente sólo una tarjeta. | | TERMINATED | Pruebe insertando la tarjeta. | | CANCELED | Se canceló la lectura de tarjeta. | | CANCELED_OR_TIMEOUT | Se canceló la lectura de tarjeta. | | NO_EMV_APPS | Intente deslizando la tarjeta. | | SELECT_APP_FAIL | Intente con otra tarjeta. | | CARD_ERROR | Tarjeta bloqueada. | | INVALID_ICC_DATA | Intente con otra tarjeta. | | APPLICATION_BLOCKED_APP_FAIL | Tarjeta bloqueada. | | CARD_BLOCKED_APP_FAIL | Tarjeta bloqueada. | | KERNEL_ERR | Intente con otra tarjeta. | | ERR_MULT_CARD | Intente con otra tarjeta. | | ERR_CHECK_CARD | Intente con otra tarjeta. | --- Fuente: /terminals/bin_validation # Validación de BIN y cuotas > Este proceso es obligatorio En esta fase, se realiza la validación del BIN de la tarjeta para determinar la marca, el tipo, y si se trata de una tarjeta nacional o internacional. Si la validación es exitosa y la tarjeta corresponde a una de crédito, también se obtiene el listado de cuotas disponibles junto con sus respectivos cálculos. #### Requisitos * BIN de la tarjeta (los primeros 8 dígitos del número de la tarjeta) recuperado en el [proceso de lectura](/terminals/card_reader) #### Resultado * Después del proceso de validación del BIN, se obtendrán la marca de la tarjeta, el tipo, un indicador que señalará si debe ser tratada como nacional o internacional. * Y, en el caso de tarjetas de crédito (no internacionales), el listado de cuotas disponibles con sus respectivos cálculos. ## Paso a paso 1. Instanciar el objeto `BinValidationData` pasándole el contexto. 2. Hacer el set del objeto `OperationFlow`. 3. Invocar el método `doBinValidation` y pasarle el BIN como parámetro. 4. Configurar un observador para recuperar el resultado. ### Datos para la consulta A continuación, se detallan los datos que necesita el método `setOperationFlow` para realizar la validación del BIN. `doBinValidation` solo requiere el BIN como parámetro. | Campo | Descripción | | ----- | ----------- | | operationFlow | Objeto con los datos instanciados en el proceso anterior. | ### Ejemplo de implementación ```kotlin private val operationFlow: OperationFlow? get() = OperationFlowHolder.operationFlow RestClientConfiguration.configure(AppfinRestClientConfigure()) val binValidationData = BinValidationData(this) binValidationData.setOperationFlow( operationFlow = operationFlow ) binValidationData.doBinValidation(bin) binValidationData.binValidationResponse.observe(this) { if (it.status == "FOUND") { binValidationData.setCardBrand(it.brand) val cardType: String = when (it.type) { "C" -> { CardType.CREDIT.name } "D" -> { CardType.DEBIT.name } else -> { CardType.PREPAID.name } } binValidationData.setCardType(cardType) binValidationData.setIsInternational(it.isInternational ?: false) binValidationData.setInstitutionId( idInstitution = it.institutionId, customerId = customerId ) when (cardType) { CardType.CREDIT.name -> { Log.i(TAG, "Cuotas disponibles: ${it.installments.installments}") } else -> { //Debit y Prepaid operationFlow!!.installments = "01" Log.i(TAG, "Ir directo al pago") } } } else { Log.i(TAG, "Bin no encontrado") val brandsAvailable = it.brandsAvailable Log.i(TAG, "Marcas y tipos disponibles: $brandsAvailable") } } ``` ## Códigos de respuesta El resultado se recibe mediante el objeto `BinValidationResponse`. En la siguiente tabla se muestran los posibles valores que se pueden recibir como respuesta: | Código | Descripción | | ----- | ----------- | | FOUND | Indica que el BIN fue encontrado en la base de datos de Menta. | | NOT_FOUND | Indica que el BIN no fue encontrado. | ### Objeto de respuesta BinValidationResponse | Campo | Descripción | | ----- | ----------- | | status | Estado de la consulta del bin: FOUND o NOT_FOUND| | bin | Primeros 8 dígitos del número de la tarjeta | | brand | Marca de la tarjeta. Ejemplo: Visa, Mastercard | | country? | País donde se emitió la tarjeta. Campo opcional | | isInternational? | Indicador de tarjeta internacional. Campo opcional | | institutionId? | Identificador del emisor de la tarjeta. Campo opcional | | type | Tipo de tarjeta. Ejemplo: Débito o Crédito | | installments | Objeto AcquirerInstallmentsResponse que contiene el detalle de cuotas, para el caso de tarjetas de crédito | ### Objeto AcquirerInstallmentsResponse | Campo | Descripción | | ----- | ----------- | | acquirer | Adquirente por el cual se va a procesar la transacción | | installments | Listado de tipo InstallmentsApp | ### Objeto InstallmentsApp Mediante este objeto se recuperan las cuotas disponibles para la tarjeta de crédito en uso. | Campo | Descripción | | ----- | ----------- | | code | Número de la cuota| | financing | Tipo de financiamiento. Puede ser: BANK para planes estándar o CUOTA_SIMPLE para planes especiales. | | type | Descripción del tipo de plan. Puede ser: Planes estándar para BANK o Planes especiales para CUOTA_SIMPLE. | | installmentLabel | Número de cuota | | installmentAmountLabel | Monto de la cuota formateado para mostrar en la pantalla | | installmentAmount | Monto de la cuota en formato ISO | | totalAmount | Monto total incluido impuestos | | totalAmountLabel | Monto total formateado para mostrar en la pantalla | * Se debe enviar el `financing` en el request de la transacción. Para esto, es necesario hacer la asignación en el objeto `operationFlow`. ```kotlin operationFlow?.financing = installmentWithTotal.financing ``` ## Caso de BIN no encontrado * Para el caso de BIN encontrado, como siguiente paso, se debe hacer el set de la marca, tipo, flag de nacional/internacional y del institutionID usando los métodos del SDK. * En caso de que el BIN no sea encontrado, el objeto BinValidationResponse incluirá una lista de marcas y tipos disponibles, permitiendo al cliente configurar pantallas de selección manual si lo considera necesario. Es importante destacar que estos datos son requeridos para realizar cualquier operación. Además, el SDK ofrece un método para consultar las cuotas disponibles en estos casos. A continuación, se presenta un ejemplo de su implementación. ### Ejemplo para consultar cuotas disponibles ```kotlin private fun getInstallments(binValidationViewModel: BinValidationData) { val brand = "VISA" val cardType = "CREDIT" val isInternational = false binValidationViewModel.getInstallments( brand, paymentMethod = cardType, isInternational = isInternational ) binValidationViewModel.getInstallmentsResponse.observe(this) { Log.i(TAG, "installments: ${it.installments}") } } ``` * El método `getInstallments` recibe como parámetros: la marca, el tipo y el flag que indica si la tarjeta es nacional o internacional. * Como respuesta se retorna el objeto que en el caso de BIN encontrado. --- Fuente: /terminals/create_payment # Realizar una transacción con tarjeta presente Una vez se han recuperado los datos de la tarjeta durante el proceso de lectura, es posible dar inicio al proceso de pago. ## Paso a paso 1. Instanciar el objeto `DoProcessAdquirerOperationData`. 2. Invocar el método `doOperation` y pasarle como parámetro el tipo de operación. 3. Configurar un observer para recibir el resultado. ## Ejemplo de implementación ```kotlin private val operationFlow: OperationFlow? get() = OperationFlowHolder.operationFlow val doPayment = DoProcessAdquirerOperationData( context = this, version = "", transactionDate = DateUtil.getLocalDateTimeWithOffset(), dataFlow = operationFlow ) doPayment.doOperation(operationType = OperationType.PAYMENT) doPayment.operationResponse.observe(this) { it.data?.let { response -> val operationResponse = response as Adquirer if (operationResponse.status?.code == OperationResponseCode.APPROVED) { Log.i(TAG, "Pago aprobado!") Log.i(TAG, "PaymentId: ${operationResponse.id}") } else { Log.i(TAG, "Pago declinado!") } } ?: run { Log.i(TAG, "Pago no procesado!") } } ``` ## Códigos de respuesta El resultado de la transacción se recibe mediante el objeto `Adquirer`. En la siguiente tabla se muestran los diferentes códigos de error, estos se recuperan desde `Adquirer.response.code` * El primer parámetro corresponde al código de respuesta recibido en `Adquirer.response.code` * El segundo parámetro es el error * El tercer parámetro es la descripción del error ```kotlin APPROVED("0", "APROBADO", "Transacciones exitosas"), CONTACT_ISSUER("1", "CONTACTAR AL EMISOR", "Transacciones rechazadas por el emisor"), INSUFFICIENT_FUNDS("2", "FONDOS INSUFICIENTES", "Transacciones rechazadas por el emisor"), INVALID_MERCHANT("3", "COMERCIO INVALIDO", "Transacciones rechazadas por el adquirente"), RETAIN_CARD("4", "RETENER TARJETA", "Transacciones rechazadas por el emisor"), DECLINED_TRANSACTION("5", "TRANSACCION DENEGADA", "Transacciones rechazadas por el emisor"), GENERIC_ERROR_1("6", "ERROR GENERICO", "Transacciones rechazadas por el emisor"), SECURITY_CODE_ERROR("7", "ERROR EN CODIGO DE SEGURIDAD (CVV)", "Transacciones rechazadas por el adquirente"), INVALID_TERMINAL("8", "TERMINAL INVALIDA", "Transacciones rechazadas por el adquirente"), DUPLICATE_TRANSACTION("9", "TRANSACCION DUPLICADA", "Transacciones con fallo menta"), MANUAL_APPROVAL("10", "APROBACION MANUAL", "Transacciones exitosas"), PENDING_TRANSACTION("11", "TRANSACCION PENDIENTE", "Transaccion pendiente"), INVALID_TRANSACTION("12", "TRANSACCION INVALIDA", "Transacciones rechazadas por el adquirente"), INVALID_AMOUNT("13", "MONTO INVALIDO", "Transacciones rechazadas por el emisor"), INVALID_CARD("14", "TARJETA INVALIDA", "Transacciones rechazadas por el emisor"), ACQUIRER_ACCOUNT_NOT_FOUND("15", "CUENTA INEXISTENTE", "Transacciones rechazadas por el adquirente"), ISSUER_ACCOUNT_NOT_FOUND("16", "CUENTA INEXISTENTE", "Transacciones rechazadas por el emisor"), TRANSACTION_NOT_ALLOWED("17", "TRANSACCION NO PERMITIDA", "Transacciones rechazadas por el adquirente"), WITHDRAWAL_AMOUNT_EXCEEDS_LIMIT_1("18", "MONTO LIMITE DE RETIRO EXCEDIDO", "Transacciones rechazadas por el emisor"), PROCESSING_ERROR_1("19", "ERROR EN PROCESAMIENTO", "Transacciones rechazadas por el adquirente"), AUTHORIZATION_ERROR("20", "ERROR EN AUTORIZACION", "Transacciones rechazadas por el adquirente"), REFUND_ERROR("21", "ERROR EN DEVOLUCION", "Transacciones rechazadas por el adquirente"), OTHER_ACQUIRER_ERRORS("22", "OTROS ERRORES ADQUIRENTE", "Transacciones rechazadas por el adquirente"), PIN_ERROR_1("23", "ERROR EN PIN", "Transacciones rechazadas por el emisor"), LIMIT_EXCEEDED("24", "LIMITE EXCEDIDO", "Transacciones rechazadas por el adquirente"), POSSIBLE_FRAUD("25", "POSIBLE FRAUDE", "Transacciones rechazadas por el adquirente"), CHARGEBACK_ERROR("26", "ERROR EN CONTRACARGO", "Transacciones rechazadas por el adquirente"), EMV_ERROR_1("27", "ERROR EMV", "Transacciones con fallo menta"), EMV_ERROR_2("28", "ERROR EMV", "Transacciones rechazadas por el adquirente"), CASHOUT_ERROR("29", "ERROR EN CASHOUT", "Transacciones rechazadas por el adquirente"), FORMAT_ERROR_1("30", "ERROR EN FORMATO", "Transacciones con fallo menta"), CARD_BLOCKED("31", "TARJETA BLOQUEADA", "Transacciones rechazadas por el emisor"), BIN_ERROR("32", "ERROR DE BIN", "Transacciones rechazadas por el adquirente"), EXPIRED_CARD("33", "TARJETA VENCIDA", "Transacciones rechazadas por el emisor"), LIMIT_EXCEEDED_1("34", "MONTO LIMITE EXCEDIDO", "Transacciones rechazadas por el adquirente"), CONTACT_ACQUIRER_1("35", "CONTACTAR ADQUIRENTE", "Transacciones rechazadas por el adquirente"), RESTRICTED_CARD("36", "TARJETA RESTRINGIDA", "Transacciones rechazadas por el emisor"), ERROR_IN_3DS("37", "ERROR EN 3DS", "Transacciones rechazadas por el adquirente"), NUMBER_OF_RETRIES_EXCEEDED("38", "CANTIDAD DE REINTENTOS EXCEDIDA", "Transacciones rechazadas por el emisor"), USER_ERROR("39", "ERROR DE USUARIO", "Transacciones rechazadas por el adquirente"), HSM_ERROR("40", "ERROR EN HSM", "Transacciones rechazadas por el adquirente"), LOST_CARD("41", "TARJETA EXTRAVIADA", "Transacciones rechazadas por el emisor"), TRANSACTION_DENIED("42", "TRANSACCION DENEGADA", "Transacciones rechazadas por el adquirente"), GENERIC_ERROR_2("43", "ERROR GENERICO", "Transacciones con fallo menta"), DUPLICATE_TRANSACTION_1("44", "TRANSACCION DUPLICADA", "Transacciones rechazadas por el adquirente"), INSTALLMENT_ERROR_1("45", "ERROR EN CUOTAS", "Transacciones con fallo menta"), INVALID_AMOUNT_2("46", "MONTO INVALIDO", "Transacciones rechazadas por el adquirente"), ISSUER_ERROR("47", "ERROR EN EMISOR", "Transacciones rechazadas por el adquirente"), INSTALLMENT_ERROR_2("48", "ERROR EN CUOTAS", "Transacciones rechazadas por el emisor"), EXPIRATION_DATE_ERROR("49", "ERROR EN FECHA DE EXPIRACION", "Transacciones rechazadas por el adquirente"), AMOUNT_EXCEEDS_LIMIT("50", "MONTO LIMITE EXCEDIDO", "Transacciones rechazadas por el emisor"), INVALID_TRANSACTION_2("51", "TRANSACCION INVALIDA", "Transacciones rechazadas por el adquirente"), WITHDRAWAL_AMOUNT_EXCEEDS_LIMIT_2("52", "MONTO LIMITE DE RETIRO EXCEDIDO", "Transacciones rechazadas por el adquirente"), PROCESSING_ERROR_2("53", "ERROR EN PROCESAMIENTO", "Transacciones con fallo menta"), CONTACT_ACQUIRER_2("54", "CONTACTAR ADQUIRENTE", "Transacciones rechazadas por el emisor"), PIN_ERROR_2("55", "ERROR EN PIN", "Transacciones rechazadas por el adquirente"), FORMAT_ERROR_2("56", "ERROR EN FORMATO", "Transacciones con fallo menta"), INTERNAL_ERROR("57", "ERROR INTERNO", "Transacciones con fallo menta"), UNKNOWN_CODE("58", "CODIGO DESCONOCIDO", "Transacciones con codigo desconocido"), INVALID_CBU("59", "CBU NO INFORMADO", "Transacciones con fallo menta"), UNINFORMED_ACTIVITY("60", "ACTIVIDAD NO INFORMADA", "Transacciones con fallo menta"), UNINFORMED_FANTASY_NAME("61", "NOMBRE DE FANTASIA NO INFORMADO", "Transacciones con fallo menta"), UNINFORMED_CATEGORY("62", "CATEGORIA NO INFORMADA", "Transacciones con fallo menta"), INVALID_CATEGORY("63", "CATEGORIA INVALIDA", "Transacciones con fallo menta"), INVALID_TRANSACTION_TYPE("64", "TIPO DE TRANSACCION INVALIDA", "Transacciones con fallo menta"), UNINFORMED_TRANSACTION_TYPE("65", "TIPO DE TRANSACCION NO ENVIADA", "Transacciones con fallo menta"), ERROR_IN_AUTHENTICATION("66", "ERROR EN AUTENTICACION", "Transacciones con fallo menta"), ERROR_IN_COMMUNICATION("67", "ERROR DE COMUNICACION", "Transacciones con fallo menta"), GENERIC_ERROR_3("68", "ERROR GENERICO", "Transacciones con fallo menta"), INVALID_QR("69", "QR INVALIDO", "Transacciones con fallo menta"), INVALID_ACCOUNT("70", "CUENTA INVALIDA", "Transacciones rechazadas por el adquirente"), ACCOUNT_NOT_FOUND("71", "CUENTA INEXISTENTE", "Transacciones rechazadas por el adquirente"), ERROR_IN_ACCOUNT("72", "ERROR EN CUENTA", "Transacciones rechazadas por el adquirente"), INVALID_TRANSACTION_3("73", "TRANSACCION INVALIDA", "Transacciones rechazadas por el adquirente"), INSUFFICIENT_FUNDS_2("74", "FONDOS INSUFICIENTES", "Transacciones rechazadas por el adquirente"), CARD_NOT_FOUND("75", "TARJETA INEXISTENTE", "Transacciones rechazadas por el adquirente"), CARD_INACTIVE("76", "TARJETA INACTIVA", "Transacciones rechazadas por el adquirente"), DAILY_LIMIT_EXCEEDED("77", "LIMITE DIARIO EXCEDIDO", "Transacciones rechazadas por el adquirente"), ERROR_TRANSFER("78", "ERROR EN TRANSFERENCIA", "Transacciones rechazadas por el adquirente"), ERROR_IN_PARAMETERS("79", "ERROR EN PARAMETROS", "Transacciones rechazadas por el adquirente"), ERROR_IN_AFFILIATION("80", "ERROR EN DATOS DE AFILIACION", "Transacciones rechazadas por el adquirente"), ERROR_IN_PROMOTION("81", "ERROR EN PROMOCION", "Transacciones rechazadas por el adquirente"), ERROR_IN_FALLBACK("82", "ERROR EN FALLBACK", "Transacciones rechazadas por el adquirente"), ERROR_IN_SUBAFFILIATION("83", "ERROR EN SUBAFILIACION", "Transacciones rechazadas por el adquirente"), ERROR_IN_READ("84", "ERROR DE LECTURA", "Transacciones rechazadas por el adquirente"), ERROR_IN_AFFILIATION_DB("85", "ERROR EN AFILIACION EN BD", "Transacciones rechazadas por el adquirente"), ERROR_IN_INVALID_SUBMERCHANT("86", "FORMATO INVALIDO EN SUBMERCHANT", "Transacciones rechazadas por el adquirente"), ERROR_IN_CONFIGURATION_AFFILIATION("87", "ERROR DE CONFIGURACION DE AFILIACION", "Transacciones rechazadas por el adquirente"), REVERSAL_OPERATION("88", "OPERACION REVERSADA", "La operacion ha sido reversada"), EXPIRED_QR("88", "QR EXPIRADO", "Transacciones expiradas"), CANCELED_QR("89", "QR CANCELADO", "Transacciones canceladas"); ``` --- Fuente: /terminals/create_payment_tip # Realizar un cobro con propina ## Requisitos Antes de sumar propina a una transacción, la app ya debe tener resuelto el flujo estándar de cobro con tarjeta presente. Sumar propina no cambia ese flujo, solo cambia cómo se construye el objeto de monto. | Requisito | Descripción | | ----- | ----------- | | Feature TIP habilitado | Menta debe habilitar el feature de propina para el cliente antes de que puedan probarlo. Sin esto, el cobro se rechaza aunque el código esté bien.| | Flujo de tarjeta presente funcionando | El objeto `OperationFlow` ya debe estar armando correctamente `capture`, `installments` y demás campos de un pago sin propina. | ## Paso a paso 1. Se debe crear el objeto `Breakdown` con description = TIP y amount = al monto de la propina en formato ISO, es decir, si el monto es 10.50 se debe enviar 1050. 2. Se debe asegurar de que la lista de `Breakdown` sea enviada en el objeto `Amount` > El SDK actualiza los features activos en cada inicialización que se realice. Se recomienda hacer una inicialización después de activar el feature TIP por primera vez. > El campo total del objeto `Amount` representa la suma del monto de consumo más la propina. ## Ejemplo de implementación Se arma el Amount con los dos breakdowns y se lo asigna al OperationFlow antes de disparar el pago, igual que en cualquier otro cobro con tarjeta presente: ```kotlin operationFlow.amount = Amount() // Crear breakdown para el monto base (siempre presente) val breakdownAmount = Breakdown() breakdownAmount.description = OPERATION breakdownAmount.amount = StringUtils.notFormatAmount(baseAmount) Log.i(TAG, "AMOUNT: ${breakdownAmount.amount}") // Crear lista de breakdowns val breakdownList = mutableListOf() breakdownList.add(breakdownAmount) // Agregar breakdown de propina solo si es mayor a 0 val tipAmountValue = tipAmount.toIntOrNull() ?: 0 if (tipAmountValue > 0) { val breakdownTipAmount = Breakdown() breakdownTipAmount.description = TIP breakdownTipAmount.amount = StringUtils.notFormatAmount(tipAmount) breakdownList.add(breakdownTipAmount) Log.i(TAG, "TIP: ${breakdownTipAmount.amount}") } else { Log.i(TAG, "No tip amount") } operationFlow.capture = Capture() operationFlow.capture!!.card = Card() operationFlow.apply { // Asignar la lista de breakdown al objeto Amount amount?.let { it.total = StringUtils.notFormatAmount(totalAmount) it.currency = currency it.breakdown = breakdownList } } ``` ## Códigos de respuesta Los mismos de [Realizar un cobro con tarjeta presente](/terminals/create_payment) --- Fuente: /terminals/create_payment_qr # Realizar una transacción con QR > **Requisito previo** > > El comercio debe tener dado de alta el pago con QR para sus tiendas antes de utilizar este flujo. Sin este alta, los métodos de pago QR no estarán disponibles. Una vez el comercio está habilitado para pago con QR, se puede realizar una transacción siguiendo estos pasos. ## Paso a paso 1. **Obtener los métodos de pago disponibles**: Llamar a `GetPaymentMethodsUseCase().doExecute()` con el monto y el tipo de operación para obtener la lista de tipos de QR disponibles (por ejemplo QR_ARG, QR_BRA). 2. **Mostrar los tipos en la UI**: Filtrar solo los métodos que contienen "QR" y presentarlos al usuario para que seleccione cuál desea generar. 3. **Persistir el QR**: Tras la selección, invocar `persistQr` en `QrPaymentViewModel` con el monto, el `OperationFlow` y el **tipo de QR elegido** (no la moneda). 4. **Mostrar el código QR**: La respuesta de `persistQr` trae un bitmap en base64 (`qrImageBase64`). Decodificarlo y dibujarlo en pantalla. 5. **Consultar el estado del pago**: En paralelo, llamar a `checkQrStatus` con el `qrId` de la respuesta para consultar el resultado. Reaccionar a `APPROVED` o `REJECTED`. Si el estado es otro, volver a consultar `checkQrStatus` hasta obtener un resultado final. ## Ejemplo: Obtener métodos de pago ```kotlin GetPaymentMethodsUseCase().doExecute( amount = operationFlow.amount?.total ?: "3000", operationType = OperationType.PAYMENT ) .flowOn(Dispatchers.IO) .collect { methods -> paymentMethods = methods.filter { it.contains("QR", ignoreCase = true) } } ``` ## Ejemplo: Persistir el QR tras la selección ```kotlin qrPaymentViewModel.resetQrPaymentState() qrPaymentViewModel.persistQr( amount = amount, // Ej: "30,00" operationFlow = operationFlow, type = selectedType // Tipo de QR: "QR_ARG", "QR_BRA", etc. (no la moneda) ) ``` ## Ejemplo: Decodificar y mostrar el bitmap ```kotlin when (val qrData = persistQrState.value) { is Resource.Success -> { val content = qrData.content content?.qrImageBase64?.let { base64 -> qrBitmap = createBitmapFromBase64(base64, 350, 350) } val qrId = content?.qrId ?: "" qrPaymentViewModel.checkQrStatus( QrStatusRequest( merchantId = merchantId, qrId = qrId, operationType = "PAYMENT" ) ) } // ... } ``` ## Ejemplo: Reconsultar cuando el estado no es aprobado ni rechazado ```kotlin qrPaymentStatus.value?.let { response -> when (response.status) { "APPROVED" -> { /* Pago aprobado */ } "REJECTED" -> { /* Pago rechazado */ } else -> { persistQrState.value?.let { qrData -> qrPaymentViewModel.checkQrStatus( QrStatusRequest( merchantId = merchantId, qrId = qrData.content?.qrId ?: "", operationType = "PAYMENT" ) ) } } } } ``` ## Tipos de QR y etiquetas sugeridas | Tipo | Etiqueta sugerida | |--------|--------------------| | QR_ARG | QR Argentina | | QR_BRA | PIX Brasil | | Prisma | Código QR | --- Fuente: /terminals/read_transaction # Consultar una transacción En esta sección se proporciona información detallada sobre cómo realizar consultas sobre transacciones, aplicando diferentes filtros. #### Requisitos * Filtros para aplicar en la búsqueda. ## Paso a paso 1. Instanciar el objeto `TrxData` pasándole el contexto. 2. Instanciar el objeto `LastTrxRequest` 3. Invocar el método `getLastTrx` y pasarle el objeto `LastTrxRequest`. 4. Configurar un observer para recibir el listado de transacciones. #### Instanciar objeto LastTrxRequest | Campo | Descripción | | ----- | ----------- | | appVersion | String con la versión de la App. Por default se envía un String EMPTY = “”. | | operationType | String con el tipo de operación que se desea consultar. | | merchantId | Identificador del merchant. Formato UUID. | | customerId | Identificador del customer. Formato UUID. | | start | Fecha de inicio de consulta. Formato UTC+0: YYYY-MM-DDT00:00:00Z | | end | Fecha de fin de consulta. Formato UTC+0: YYYY-MM-DDT00:00:00Z | | page | Número de páginas a recuperar. | | size | Cantidad de registros a recuperar. | | status | Estado de la transacción: APPROVED, REJECTED | | paymentMethod | Método de pago: DEBIT, CREDIT, PREPAID, QR | | cardBrand | Marca de la tarjeta con la que se realizó la transacción:
Para Argentina: VISA, MASTERCARD, MAESTRO.
Para México: VISA, MASTERCARD, AMEX, CARNET.| | minAmount | Monto mínimo para buscar la transacción. En formato ISO, sin punto decimal y los 2 últimos dígitos son los decimales, ejemplo: $10 = 1000 | | maxAmount | Monto máximo para buscar la transacción. En formato ISO, sin punto decimal y los 2 últimos dígitos son los decimales, ejemplo: $10 = 1000 | > Si no se desea aplicar alguno de estos filtros, debe enviarse como null. ### Ejemplo de implementación ```kotlin val trxData = TrxData(this) val lastTrxRequest = LastTrxRequest( appVersion = "", operationType = "", merchantId = merchantId, customerId = customerId, userEmail = null, start = "2024-07-01T00:00:00Z", end = "2024-07-09T23:59:00Z", page = 0, size = 1000 ) trxData.getLastTrx(lastTrxRequest = lastTrxRequest) trxData.getLastTrx.observe(this) { lisTrx -> lisTrx?.let { if (lisTrx.statusResult?.statusType == StatusType.SUCCESS) { Log.i(TAG, "Listado de transacciones: $lisTrx") } else { Log.i(TAG, "Error en la consulta") } } ?: run { Log.i(TAG, "Transacciones no disponibles") } } ``` ## Códigos de respuesta La respuesta se recupera del objeto `TrxListResponse`. #### Objeto TrxListResponse * **statusResult**: Campo de tipo StatusResult, contiene el estado de la consulta. En el campo code de este objeto se puede recuperar el estado, los posibles valores son: Código | Descripción | | ----- | ----------- | | StatusResult.ERROR | Ocurrió un error en la búsqueda de las transacciones. | | StatusResult.SUCCESS | La consulta se realizó con éxito. | * **totalElements**: Campo de tipo Int, contiene el número total de registros encontrados. * **totalPages**: Campo de tipo Int, contiene el número de páginas disponibles. * **content**: Campo de tipo `List`, contiene el listado de transacciones devueltos en la consulta. El objeto Transaction contiene los siguientes datos: * id → es el identificador interno de la transacción. * type → es el tipo de transacción. * merchant_id → es el identificador del merchant con el que se realizó la transacción. * customer_id → es el identificador del customer con el que se realizó la transacción. * terminal → Contiene datos de la terminal. * currency → Es el código de moneda con el que se realizó la transacción. * installment → Contiene información de las cuotas, si aplica. * amount → Es el monto de la transacción. * card → Contiene datos de la tarjeta. * qr_id → Es el identificador de QR, aplica para los pagos coo QR. * refunded_amount → Contiene el monto de la devolución/anulación. --- Fuente: /terminals/create_refund # Realizar una anulación o devolución Antes de llevar a cabo una anulación o devolución, es necesario realizar una consulta de transacciones, ya que se necesitan datos específicos obtenidos durante esta consulta para llevar a cabo dichas operaciones. #### Requisitos * Identificador de la transacción original: `paymentId` * Identificador de la adquirencia: `acquirerReferenceNumber` ## Paso a paso Son los mismos pasos que se aplican para realizar un pago, la diferencia está en la instancia del objeto `OperationFlow()`, en este caso se agregan los siguientes campos: | Campo | Descripción | | ----- | ----------- | | TransactionType | Tipo de transacción = ANNULMENT/REFUND | | paymentId | Identificador del pago original. | | acquirerReferenceNumber | Número de referencia del pago original. Retornado en el campo de respuesta `operation.acquirerReferenceNumber` | * Además, es necesario establecer la marca de la tarjeta, el tipo y el indicador de nacional/internacional con los valores retornados en la consulta: ### Ejemplo de implementación ```kotlin if (isToday(transaction.operation.datetime)) { operationFlow.transactionType = OperationType.ANNULMENT } else { operationFlow.transactionType = OperationType.REFUND } //Se agregan identificadores del pago original operationFlow.acquirerReferenceNumber = transaction.operation.acquirerReferenceNumber operationFlow.paymentId = transaction.operation.id } //Set datos originales de la tarjeta operationFlow.capture?.card?.brand = transaction.card.brand operationFlow.capture?.card?.type = transaction.card.type operationFlow.capture?.card?.isInternational = transaction.card.isInternational operationFlow.installments = transaction.installment.number.toString().padStart(2, '0') ``` > En México 🇲🇽 solo aplica el concepto de REFUND. En Argentina 🇦🇷, una anulación se realiza el mismo día del pago y la devolución, en días posteriores. ## Códigos de respuesta [Revisar el listado en la sección: Códigos de respuesta.](/terminals/create_payment) --- Fuente: /terminals/read_report # Consultar reporte de transacciones En esta sección se proporciona información detallada sobre cómo realizar la consulta de reporte de transacciones. #### Requisitos * Filtros para aplicar en la búsqueda. ## Paso a paso 1. Instanciar el objeto `TrxData` pasándole el contexto. 2. Instanciar el objeto `BatchCloseRequest` 3. Invocar el método `getBatchClose` y pasarle el objeto `BatchCloseRequest`. 4. Configurar un observer para recibir el reporte. #### Instanciar objeto BatchCloseRequest | Campo | Descripción | | ----- | ----------- | | appVersion | String opcional. con la versión de la App. Por default se envía un String EMPTY = “”. | | transactionType | String obligatorio. String con el tipo de operación que se desea consultar. | | merchantId | String obligatorio. Identificador del merchant. Formato UUID. | | customerId | String obligatorio. Identificador del customer. Formato UUID. | | start | String obligatorio. Fecha de inicio de consulta. Formato UTC+0: YYYY-MM-DDT00:00:00Z | | end | String obligatorio. Fecha de fin de consulta. Formato UTC+0: YYYY-MM-DDT00:00:00Z | | currency | String obligatorio. Código de moneda. | | status | String opcional. Estado de la transacción: APPROVED, REJECTED | | paymentMethod | String opcional. Método de pago: DEBIT, CREDIT, PREPAID, QR | | cardBrand | Listado opcional. Marca de la tarjeta con la que se realizó la transacción:
Para Argentina: VISA, MASTERCARD, MAESTRO.
Para México: VISA, MASTERCARD, AMEX, CARNET.| | minAmount | String opcional. Monto mínimo para buscar la transacción. En formato ISO, sin punto decimal y los 2 últimos dígitos son los decimales, ejemplo: $10 = 1000 | | maxAmount | String opcional. Monto máximo para buscar la transacción. En formato ISO, sin punto decimal y los 2 últimos dígitos son los decimales, ejemplo: $10 = 1000 | > Si no se desea aplicar alguno de estos filtros opcionales, debe enviarse como null. ### Ejemplo de implementación ```kotlin val trxData = TrxData(context = this) val batchCloseRequest = BatchCloseRequest( appVersion = "", transactionType = "", merchantId = merchantId, customerId = customerId, userEmail = null, start = "2025-04-24T00:00:00Z", end = "2025-04-25T23:59:00Z", currency = CURRENCY_LABEL_ARG, ) trxData.getBatchClose(batchCloseRequest = batchCloseRequest) trxData.getBatchClose.observe(this) { lisTrx -> isLoading.value = false lisTrx?.let { Log.i(TAG, "Transaccions report response: $lisTrx") message+= "# de pagos: ${lisTrx.count_batch_payment} \n" message+= "Total de pagos: $ ${ StringUtils.toStringThousandAmount(lisTrx.total_batch_payment)} \n\n" message+= "# de devoluciones: ${lisTrx.count_batch_refund} \n" message+= "Total de devoluciones: $ ${ StringUtils.toStringThousandAmount(lisTrx.total_batch_refund)} \n" } ?: run { Log.i(TAG, "Transacciones no disponibles") } } ``` ## Datos de respuesta La respuesta se recupera del objeto `TransactionBatchClose`. #### Objeto TransactionBatchClose * **count_batch_payment**: Campo de tipo Int, contiene el número total de pagos realizados según el filtro aplicado. * **count_batch_refund**: Campo de tipo Int, contiene el número total de las devoluciones realizadas según el filtro aplicado. * **count_batch_annulment**: Campo de tipo Int, contiene el número total de anulaciones realizadas según el filtro aplicado. * **total_batch_payment**: Campo de tipo Int, contiene el monto total de pagos realizados según el filtro aplicado. * **total_batch_refund**: Campo de tipo Int, contiene el monto total de las devoluciones realizadas según el filtro aplicado. * **total_batch_annulment**: Campo de tipo Int, contiene el monto total de anulaciones realizadas según el filtro aplicado. * **total_batch_tip**: Campo de tipo Int, contiene el monto total de propinas según el filtro aplicado. * **total**: Campo de tipo Int, contiene el monto total según el filtro aplicado. > Todos los montos están en formato ISO. Es decir, sin separadores de decimales y miles. Los 2 últimos dígitos son los decimales. --- Fuente: /terminals/reversals # Funcionamiento de reversas El SDK se encarga de gestionar el envío de reversas, no es necesario realizar acciones desde la aplicación para este caso. Este proceso se realiza internamente en las operaciones de pago al detectar alguna de estas situaciones: * No se obtuvo respuesta de la operación de pago. * Se detectó un timeout durante la operación de pago. * La operación de pago fue aprobada pero el kernel rechazó los comandos recibidos. --- Fuente: /terminals/send_ticket # Enviar ticket por mail > Este proceso es opcional El envío del comprobante por correo electrónico es opcional. El SDK de Menta ofrece un método dedicado para realizar esta acción, el cual sigue un [formato estándar de Menta](/terminals/send_ticket#ejemplo-del-formato-estándar-de-menta) y necesita datos específicos de la transacción para llevar a cabo la operación. #### Requisitos * Datos de la transacción requeridos para el formato estándar de Menta ## Paso a paso 1. Instanciar el objeto `SendEmailData` pasándole el contexto. 2. Crear un `HashMap` con los datos para el ticket. 3. Instanciar el objeto `SendEmailRequest`. 4. Invocar el método `sendEmail` pasándole el objeto `SendEmailRequest`. 5. Configurar un `observer` para recibir la respuesta. #### Crear HashMap | Campo | Descripción | | ----- | ----------- | | date_terminal | Fecha de la terminal para enviar el ticket. | | time_terminal | Hora de la terminal para enviar el ticket. | | operation_type | Tipo de operación. | | merchant_name | Nombre del comercio. | | merchant_address | Dirección del comercio | | operation_number | Número de operación. Corresponde al campo ticketId retornado en la respuesta de la transacción. | | masked_number | Número de tarjeta enmascarado. Corresponde el campo masked_pan retornado en la respuesta de la transacción. | | reader_type | Modo de lectura. Corresponde al inputMode retornado en la lectura de la tarjeta. | | amount | Monto de la transacción formateado con decimales. | | installments | Número de cuotas de la transacción. Default = 01. | | card_brand | Marca de la tarjeta. Valor que se puede recuperar de la tabla de bines. | | currency | Moneda de país. | | card_type | Tipo de tarjeta. Valor que se puede recuperar de la tabla de bines. | | card_aid | Identificador de la tarjeta. Valor retornado por la lectura de tarjeta. | | subject | Asunto del mail. | | subtitle | Cuerpo del mail. | #### Instanciar el objeto SendEmailRequest | Campo | Descripción | | ----- | ----------- | | to | Correo del destinatario. | | template_type | Tipo de plantilla. Posibles valores: PAYMENT, REFUND. | | content | HashMap creado en el paso 2. | ### Ejemplo de implementación ```kotlin RestClientConfiguration.configure(AppfinRestClientConfigure()) val emailData = SendEmailData(context = applicationContext) val map = hashMapOf( "date_terminal" to "27/06/23", "time_terminal" to "12:44:08", "operation_type" to "PAYMENT", "merchant_name" to "[Nombre de comercio]", "merchant_address" to "Dirección del comercio", "operation_number" to "181625710", "masked_number" to "***0190", "reader_type" to "CONTACTLESS", "amount" to "100,00", "installments" to "01", "card_brand" to "MASTERCARD", "currency" to "ARS", "powered_by_menta_footer" to "Leyenda: Powered by menta", "card_type" to "Crédito", "card_aid" to "A0000000041010C123456789", "subject" to "Comprobante de compra en [Nombre de comercio]", "subtitle" to "Te acercamos el comprobante de tu compra en [Nombre de comercio]" ) val sendEmailRequest = SendEmailRequest(email, "PAYMENT", map) emailData.sendEmail(sendEmailRequest = sendEmailRequest) emailData.sendEmailResponse.observe(this) { result -> Log.i(TAG, "Resultado: $result") when (result) { is Resource.Success -> { Log.i(TAG, "Email enviado correctamente") } else -> { Log.i(TAG, "Error al enviar mail") } } } ``` ## Códigos de respuesta El observer configurado retornará como resultado un objeto de tipo `LiveData>`. Los posibles valores para el Resource son: | Código | Descripción | | ----- | ----------- | | Resource.Success | El envío del ticket se realizó con éxito. | | Resource.Failure | Falló el envío del ticket. | ## Ejemplo del formato estándar de Menta ![Ejemplo de ticket en el formato estándar de Menta](/mail_example.png) --- Fuente: /terminals/print_ticket # Impresión de comprobantes > Este proceso es opcional La impresión del comprobante marca el cierre de una transacción y en esta sección se detallan los diferentes métodos que ofrece el SDK para imprimir un comprobante. #### Requisitos * Datos de la transacción ## Paso a paso 1. Obtener la impresora con `ReceiptPrinterFactory.create(context)`, que retorna la interfaz `ReceiptPrinter`. 2. Validar el estado de la impresora antes de usarla. 3. Instanciar objeto `TextFormat` para el texto que se quiere imprimir. 4. Agregar las líneas a la cola de impresión con el método `addLine`. 5. Iniciar la impresión y obtener el resultado con `ReceiptPrinterFactory.printAndAwaitResult(printer) { result -> ... }` dentro de un `Thread` (a partir de la v7.6.0, este método invoca `startPrint` internamente, ya no es necesario llamarlo por separado). > **Advertencia:** A partir de la v7.6.0, la impresora ya no se instancia con `DevicePrintImpl`. Ver el detalle de la migración en las [notas de release de la v7.6.0](/terminals/release_notes). #### Métodos disponibles | Método | Descripción | | ------ | ----------- | | getStatus | Retorna el estado de la impresora.
0x00 = Disponible
0xF0 = No hay papel disponible.
0xD1 = Batería muy baja para imprimir.
0xF7 = Impresora ocupada.| | addDoubleColumnText | Agrega 2 columnas en el ticket. | | addLine | Agrega una línea en el ticket. | | addLinebreak | Agrega saltos de línea. | | addTripleColumnText | Agrega 3 columnas en el ticket. | | addBlackLine | Agrega una línea de separación en el ticket. Reemplaza a `addImage`, que queda deprecado. | | startPrint | Inicia el proceso de impresión. A partir de la v7.6.0, es invocado internamente por `ReceiptPrinterFactory.printAndAwaitResult`. | Estos métodos posibilitan la creación de un formato de ticket personalizado, agregando los datos que se consideren necesarios. Sin embargo, a continuación se detallan los campos que son obligatorios por país: ##### Argentina * Fecha y hora de la transacción * Datos del comercio * Nombre * Dirección * Identificación * Monto de la transacción * Últimos 4 dígitos de la tarjeta ##### México * Fecha y hora de la transacción * Nombre del adquirente * Datos del comercio * Nombre * Dirección * Teléfono * Número de afiliación con la adquirencia * Identificador de la transacción * Marca y tipo de tarjeta * Número de serie de la terminal * Código de autorización * Monto de la transacción ### Ejemplo de implementación ```kotlin import com.menta.android.core.terminal.ReceiptPrinterFactory import com.menta.android.emv.contract.printer.Align import com.menta.android.emv.contract.printer.TextFormat import com.menta.android.emv.contract.printer.INSTALLMENT_LABEL import com.menta.android.emv.contract.printer.TOTAL_LABEL val devicePrintImpl = ReceiptPrinterFactory.create(applicationContext) val status = devicePrintImpl.getStatus() Log.i(TAG, "status impresora: $status") if (status == 0) { val thread = Thread { devicePrintImpl.addLine( TextFormat(align = Align.CENTER, bold = true, font = 1), "Nombre del comercio" ) devicePrintImpl.addLine( TextFormat(align = Align.CENTER, bold = false), "Dirección del comercio" ) devicePrintImpl.addLine( TextFormat(align = Align.CENTER, bold = false), "DNI del comercio" ) devicePrintImpl.addLine( TextFormat(align = Align.CENTER, bold = false), "CUIT del comercio" ) devicePrintImpl.addLinebreak(1) devicePrintImpl.addLine( TextFormat(align = Align.CENTER, bold = true), "Pago con Tarjeta de Crédito" ) devicePrintImpl.addLinebreak(1) devicePrintImpl.addDoubleColumnText( TextFormat(), "Número de Operación", "#123456" ) devicePrintImpl.addDoubleColumnText( TextFormat(), "Tarj: ***1234", "Visa" ) devicePrintImpl.addDoubleColumnText( TextFormat(), "CONTACTLESS", "" ) devicePrintImpl.addLinebreak(1) try { devicePrintImpl.addBlackLine(2) } catch (e: RemoteException) { e.printStackTrace() } devicePrintImpl.addDoubleColumnText( TextFormat(bold = true, font = 1), TOTAL_LABEL.uppercase(Locale.getDefault()), "10,00" ) devicePrintImpl.addDoubleColumnText( TextFormat(), INSTALLMENT_LABEL, "01" ) devicePrintImpl.addDoubleColumnText( TextFormat(), CURRENCY_LABEL, Currency.ARS.name ) devicePrintImpl.addLinebreak(1) try { ReceiptPrinterFactory.printAndAwaitResult(devicePrintImpl) { result -> if (result == 0) { Log.i(TAG, "Impresión exitosa") } else { Log.i(TAG, "Error de impresión: $result") } } } catch (e: Exception) { e.printStackTrace() } } thread.start() } ``` --- Fuente: /terminals/create_release # Generar release de la aplicación > Este proceso es obligatorio La distribución de las aplicaciones .apk se realizan solo en modo release. En este modo, el código se compila y optimiza para obtener un rendimiento más eficiente, se eliminan mensajes de depuración y se aplican técnicas de ofuscación para mejorar la seguridad. Además, el tamaño del archivo resultante suele ser más pequeño, lo que facilita la distribución y descarga de la aplicación. El modo release también permite activar ProGuard, una herramienta de minificación y ofuscación, que ayuda a proteger la propiedad intelectual del código y a reducir el riesgo de ingeniería inversa. A continuación, se comparte un ejemplo del archivo ProGuard: ```bash # Keep specific classes -keep class com.google.android.material.** { *; } -keep class com.google.android.material.R$* { *; } -dontwarn com.decodelibrary.R$raw -dontwarn com.menta.android.ux.components.LibraryTheme -dontwarn com.menta.android.ux.components.button.ButtonDefaultKt -dontwarn com.menta.android.ux.components.button.ButtonRoundedKt -dontwarn com.menta.android.ux.components.card.InformationCardData -dontwarn com.menta.android.ux.components.card.InformationCardKt -dontwarn com.menta.android.ux.components.layout.loading.LoadingData -dontwarn com.menta.android.ux.components.layout.loading.LoadingLayoutKt -dontwarn com.menta.android.ux.components.layout.status.StatusLayoutKt -dontwarn com.menta.android.ux.components.layout.versioning.VersioningData -dontwarn com.menta.android.ux.components.searchstatus.SearchStatusData -dontwarn com.menta.android.ux.components.searchstatus.SearchStatusKt -dontwarn com.menta.android.ux.components.searchstatus.SearchStatusType -dontwarn com.menta.android.ux.components.servicesuggestion.Suggestion -dontwarn com.menta.android.ux.components.servicesuggestion.SuggestionItemKt -dontwarn com.menta.android.ux.components.servicesuggestion.SuggestionItemStyle -dontwarn com.menta.android.ux.components.text.TextKt -dontwarn com.menta.android.ux.components.textfield.TextFieldAmountKt -dontwarn com.menta.android.ux.components.textfield.TextFieldRoundedKt -dontwarn com.thoughtworks.xstream.XStream # Keep specific libraries -keep class retrofit2.** { *; } -keep class com.squareup.okhttp3.** { *; } -keep interface com.squareup.okhttp3.** { *; } -dontwarn retrofit2.** -dontwarn com.squareup.okhttp3.** -keepattributes *Annotation* -keepattributes EnclosingMethod -keep interface java.util.function.** # Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items). -keep,allowobfuscation,allowshrinking interface retrofit2.Call -keep,allowobfuscation,allowshrinking class retrofit2.Response # With R8 full mode generic signatures are stripped for classes that are not # kept. Suspend functions are wrapped in continuations where the type argument # is used. -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation # Gson uses generic type information stored in a class file when working with # fields. Proguard removes such information by default, keep it. -keepattributes Signature # This is also needed for R8 in compat mode since multiple # optimizations will remove the generic signature such as class # merging and argument removal. See: # https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson -keep class com.google.gson.reflect.TypeToken { *; } -keep class * extends com.google.gson.reflect.TypeToken # Optional. For using GSON @Expose annotation -keepattributes AnnotationDefault,RuntimeVisibleAnnotations # Keep specific packages -keep class com.urovo.** { *; } -keep class com.menta.** { *; } -keep class android.device.DeviceManager { *; } # Keep public methods in Room database -keepclassmembers class * extends androidx.room.RoomDatabase { public (...); public abstract *; } # Keep all classes annotated with @androidx.room.* annotations -keep class * extends androidx.room.RoomDatabase { *; } -keep @androidx.room.* class * { *; } -keep public class * extends android.database.sqlite.SQLiteOpenHelper -keep class android.database.sqlite.** { *; } -keep class android.** { *; } # Keep public methods in SQLiteOpenHelper -keep public class * extends android.database.sqlite.SQLiteOpenHelper { public (...); public abstract *; } ``` --- Fuente: /terminals/glossary # Glosario | Término | Concepto | | ------- | -------- | | EMV | EMV, que significa "Europay Mastercard Visa", es un estándar global para tarjetas de pago con chip y tecnología de autenticación segura. Desarrollado por las compañías de tarjetas de crédito Europay, Mastercard y Visa, el estándar busca mejorar la seguridad en las transacciones financieras. | | Código de servicio | Conjunto de 3 dígitos que proporciona información sobre las funciones y características especiales de la tarjeta. Por ejemplo: mediante el service code se puede detectar si la tarjeta tiene CHIP EMV. | | Fallback | Se refiere a la situación en la cual una terminal de punto de venta (POS) no puede procesar una transacción utilizando la tecnología principal, como el chip EMV, y, en su lugar, recurre a métodos de respaldo o alternativos. Por ejemplo: si no es posible leer el chip de la tarjeta, permite deslizar la banda. | | Country code | Se refiere al código numérico que identifica el país de origen o emisión de la tarjeta. | | BIN | Hace referencia a "Bank Identification Number" (Número de Identificación Bancaria). Es un número de seis u ocho dígitos que identifica de manera única a la institución financiera emisora de una tarjeta. | | CFT | El Costo Financiero Total (CFT) es el valor total de un crédito.| --- Fuente: /services # Servicios de integración vía API ## Introducción Nuestros servicios permiten integrar un sistema externo con el de Menta de manera que pueda autogestionarse. Partiendo de la necesidad de un usuario primario del tipo cliente, es posible gestionar cada parte del proceso de forma anexa a la transaccionalidad de la terminal. ## Pasos a seguir Para continuar con el proceso de integración se recomienda dirigirse a alguna de las siguientes secciones según el interés. La descripción de cada endpoint está disponible en la [Referencia de la API](/api_reference). - [Autenticación](/services/authorization) - [Configurar planes de pago](/services/plans_configuration) - [Dar de alta un comercio](/services/create_merchant_v2) - [Asignar procesadores al comercio](/services/acquirers) - [Asignar planes de pago a un comercio](/services/plans_selection) - [Pausar o eliminar comercios](/services/change_merch_status) - [Administrar usuarios](/services/user_admin) - [Obtener transacciones](/services/read_transactions) - [Administración de Webhooks](/services/webhooks) - [Intención de pago](/services/payment_intention) --- Fuente: /services/authorization # Autenticación Los servicios API de Menta brindan todos los recursos necesarios para desarrollar integraciones que permitan operar eficientemente con nuestras plataformas. ### Formas de autenticación Nuestra API ofrece dos métodos de autenticación: 1. Usuario y Contraseña (Token) 2. Clave de acceso (API Key) ### 1. Autenticación con Usuario y Contraseña Este método requiere credenciales de un usuario válido (por ejemplo de tipo **CUSTOMER** o **MERCHANT**), las cuales son enviadas por correo electrónico por el equipo de Menta o generadas desde el Back Office por otro usuario autorizado. Una vez obtenidas, se debe iniciar sesión utilizando estas credenciales para recibir un **token de acceso**, el cual es necesario para autenticar todas las solicitudes posteriores. Requisitos - Contar con un usuario válido y su contraseña correspondiente. Resultado - Token de autenticación que se debe usar en cada solicitud mientras esté vigente. Endpoint de autenticación ```bash POST https://api.menta.global/api/v1/login ``` Ejemplo de solicitud ```bash curl --request POST \ --url https://api.menta.global/api/v1/login \ --header 'Content-Type: application/json' \ --data '{ "user": "usuario", "password": "contraseña" }' ``` Respuesta esperada ```json { "token": { "access_token": "example access_token", "token_type": "Bearer", "expires_in": 86400 ... } } ``` > El token recibido debe almacenarse de forma segura, ya que permite acceder a > todas las funcionalidades habilitadas para el usuario autenticado. Ten en > cuenta que el token tiene una fecha de expiración(`expires_in`). Es > fundamental renovarlo antes de que caduque para evitar interrupciones en las > operaciones. > Los intentos de login fallidos se cuentan por usuario. Al superar el límite (por defecto 10 intentos en 60 segundos) la respuesta es `429`. #### Uso del Token de Acceso El token debe incluirse en la cabecera `Authorization` de cada petición como un `Bearer Token`. ```bash Authorization: Bearer example_access_token ``` ##### Ejemplo: ```bash curl --request GET \ --url https://api.menta.global/api/v1/users \ --header 'Authorization: Bearer example_access_token' ``` ### 2. Autenticación con API Key Este método te permite conectarte con nuestra plataforma sin tener que usar usuario y contraseña cada vez. En su lugar, se usa una API Key, que funciona como una llave segura. ¿Cómo conseguir tu API Key? Puedes pedir tu API Key al equipo de Menta o generarla tú mismo si ya tienes acceso como cliente o comercio. Recomendamos usar un correo exclusivo para esta integración, diferente al que usas para ingresar con usuario y contraseña. Son formas de acceso distintas y no se mezclan. A) Si eres CLIENTE Puedes solicitar tu API Key directamente a Menta o generarla tú mismo en pocos pasos usando el token de acceso que vimos anteriormente. A continuación, te compartimos el endpoint que vas a necesitar. ```bash POST https://api.menta.global/api/v1/api-keys ``` Ejemplo de solicitud. **¿Es la primera vez que generas una API Key?** En ese caso, deberás incluir el siguiente header en tu solicitud. ```bash Authorization: Bearer example_access_token_cliente ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'Authorization: Bearer example_access_token_cliente' \ --data '{ "user": "email_cliente", "customer_id": "{id_cliente}" }' ``` **¿Ya tienes una API Key disponible?** Entonces puedes hacer la solicitud incluyendo el siguiente header. ```bash X-Api-Key: api_key_cliente ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_cliente' \ --data '{ "user": "email_cliente", "customer_id": "{id_cliente}" }' ``` Respuesta esperada ```json { "id": "identificador_api_key", "api_key": "api_key_cliente", "user": "email_cliente", "user_type": "CUSTOMER", "customer_id": "{id_cliente}" ... } ``` **¿Necesitas crear API Keys para tus comercios?** Entonces puedes hacer la solicitud incluyendo el siguiente header. ```bash X-Api-Key: api_key_cliente ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_cliente' \ --data '{ "user": "email_comercio@example.com", "customer_id": "{id_cliente}", "merchant_id": "{id_comercio}" }' ``` B) Si eres COMERCIO También se puede generar una API Key para comercios, de la misma forma que para clientes. ```bash POST https://api.menta.global/api/v1/api-keys ``` Ejemplo de solicitud **¿Es la primera vez que generas una API Key?** En ese caso, deberás incluir el siguiente header en tu solicitud. ```bash Authorization: Bearer example_access_token_comercio ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'Authorization: Bearer example_access_token_comercio' \ --data '{ "user": "email_comercio@example.com", "customer_id": "{id_cliente}", "merchant_id": "{id_comercio}" }' ``` **¿Ya tienes una API Key disponible?** Entonces puedes hacer la solicitud incluyendo el siguiente header. ```bash X-Api-Key: api_key_comercio ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_comercio' \ --data '{ "user": "email_comercio@example.com", "customer_id": "{id_cliente}", "merchant_id": "{id_comercio}" }' ``` Respuesta esperada ```json { "id": "identificador_api_key", "api_key": "api_key_comercio", "user": "email_comercio", "user_type": "MERCHANT", "merchant_id": "{id_comercio}", "customer_id": "{id_cliente}", ... } ``` > Puedes tener hasta **10 API Keys** habilitadas (`ENABLED`) por usuario. Al superar el límite, la creación responde `422`. El email de `user` debe estar en minúsculas. El valor completo de `api_key` solo se devuelve al crearla; el listado lo devuelve enmascarado. Al borrar una API Key se hace un borrado lógico y deja de poder usarse para iniciar sesión. ### ¿Quieres más información sobre cómo gestionar tus API Keys? a)Si eres CLIENTE * [Autogestión API Keys](/api_reference/api_key_customer_post) * [Gestión de API Keys para comercios](/api_reference/api_key_customer_merchant_post) * [Buscar API Keys](/api_reference/api_key_customer_get) * [Eliminar API Keys](/api_reference/api_key_customer_delete) b)Si eres COMERCIO * [Crear API Keys](/api_reference/api_key_merchant_post) * [Buscar API Keys](/api_reference/api_key_merchant_get) * [Eliminar API Keys](/api_reference/api_key_merchant_delete) #### ¿Necesitas ayuda? > Si todavía no tienes tus credenciales o quieres que te ayudemos con la integración, > escríbenos a: **ops@menta.global** --- Fuente: /services/plans_configuration # Configurar planes de pago Los planes de pago son el punto de partida para comenzar a personalizar la solución y se realizará 100% por API. Este elemento es necesario para configurar las tasas y plazos que se le ofrecerán a los comercios como opciones de pago y se realiza con:. una configuración específica para cada tipo de tarjeta. Cada una de estas configuraciones permitirá calcular las comisiones, impuestos y fechas de acreditación. En el caso que no se quiera ofrecer opciones solo hay que configurar un plan de pagos. En caso de que alguna de estas opciones no se encuentre cargada para un comercio podrá procesar pagos igualmente, pero deberán resolver manualmente los cálculos impositivos ya que no serán calculados por Menta. #### Requisitos * Plan de tasas y plazos a configurar para cada combinación de tipo de tarjeta, marca, cuotas y emisión nacional o internacional. #### Resultado * Planes de pagos configurados y listos para aplicar a los nuevos comercios o ya existentes ## Implementación Esta tabla muestra todas las opciones necesarias para dar de alta y asignar a cada comercio para operar de forma correcta: | Marca de tarjeta | Medio de pago | ¿Acepta más de una cuota? | ¿Es una tarjeta internacional? (emitida fuera del país de procesamiento)| | ----- | ------ | ------- | ------ | | VISA | Débito | No | No | | VISA | Débito | No | Si | | VISA | Crédito | No | No | | VISA | Crédito | No | Si | | VISA | Crédito | Si | No | | VISA | Prepago | No | No | | VISA | Prepago | No | Si | | MASTERCARD | Débito | No | No | | MASTERCARD | Débito | No | Si | | MASTERCARD | Crédito | No | No | | MASTERCARD | Crédito | No | Si | | MASTERCARD | Crédito | Si | No | | MASTERCARD | Prepago | No | No | | MASTERCARD | Prepago | No | Si | | MAESTRO (🇦🇷) | Débito | No | No | | AMEX (🇲🇽) | Crédito | No | No | | AMEX (🇲🇽) | Crédito | No | Si | | AMEX (🇲🇽) | Crédito | Si | No | | CARNET (🇲🇽) | Débito | No | No | | CARNET (🇲🇽) | Crédito | No | No | | CARNET (🇲🇽) | Crédito | Si | No | | NARANJA | Crédito | Si | No | | DISCOVER | Crédito | Si | No | | CABAL | Débito | No | No | | CABAL | Débito | No | Si | | CABAL | Crédito | No | No | | CABAL | Crédito | No | Si | | CABAL | Crédito | Si | No | | CABAL | Prepago | No | No | | CABAL | Prepago | No | Si | | UNIONPAY | Débito | No | No | | UNIONPAY | Débito | No | Si | | UNIONPAY | Crédito | No | No | | UNIONPAY | Crédito | No | Si | | UNIONPAY | Crédito | Si | No | | UNIONPAY | Prepago | No | No | | UNIONPAY | Prepago | No | Si | | DINERS | Débito | No | No | | DINERS | Débito | No | Si | | DINERS | Crédito | No | No | | DINERS | Crédito | No | Si | | DINERS | Crédito | Si | No | | DINERS | Prepago | No | No | | DINERS | Prepago | No | Si | | NARANJA | Crédito | No | No | | NARANJA | Crédito | Si | No | | DISCOVER | Crédito | No | No | | DISCOVER | Crédito | No | Si | | DISCOVER | Crédito | Si | No | Cada una de estas variantes debe ser cargada como un nuevo plan de pago para luego poder ser utilizado en los comercios. El endpoint recibe un único objeto por request, no un array. A continuación, se presenta un ejemplo para tarjetas de débito VISA locales: ```bash curl --request POST \ --url https://api.menta.global/api/v1/fee-rules \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data \ '{ "card_brand": "VISA", "payment_method": "DEBIT", "alias": "Plan a 2 días", "term": 2, "commission": 1.5, "has_installments": false, "is_international": false }' ``` > `commission` se expresa como porcentaje y el servicio lo divide por 100 antes de almacenarlo (`1.5` se almacena como `0.015`). > Los planes de pago son una herramienta poderosa que permite ofrecer diferentes opciones de pago a los comercios y aumentar sus ventas. Recomendamos que se exploren las diferentes opciones disponibles y revisar la documentación para aprovechar al máximo esta funcionalidad. ## Ejemplo de Implementación A continuación se presenta un ejemplo de todos los planes de pagos necesarios dar de alta según la tabla indicada anteriormente (indicando comisiones y plazos arbitrarios). Cada elemento del listado se envía como un request individual a `POST /v1/fee-rules`; enviar el listado completo como array devuelve `400`. Los valores de `commission` del ejemplo se interpretan como porcentaje (`0.01` equivale a 0,01 %). **Ejemplo Argentina 🇦🇷** ```javascript [ { "payment_method": "DEBIT", "card_brand": "VISA", "commission": 0.01, "term": 1, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "MASTERCARD", "commission": 0.01, "term": 1, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.03, "term": 3, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.03, "term": 3, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "VISA", "commission": 0.04, "term": 4, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "MASTERCARD", "commission": 0.04, "term": 4, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.05, "term": 5, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.05, "term": 5, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "VISA", "commission": 0.06, "term": 6, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "MASTERCARD", "commission": 0.06, "term": 6, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "VISA", "commission": 0.07, "term": 7, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "MASTERCARD", "commission": 0.07, "term": 7, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "MAESTRO", "commission": 0.08, "term": 8, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" } ] ``` **Ejemplo México 🇲🇽** ```javascript [ { "payment_method": "DEBIT", "card_brand": "VISA", "commission": 0.01, "term": 1, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "MASTERCARD", "commission": 0.01, "term": 1, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "AMEX", "commission": 0.01, "term": 0, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "CARNET", "commission": 0.01, "term": 0, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "AMEX", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "CARNET", "commission": 0.02, "term": 2, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.03, "term": 3, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.03, "term": 3, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "AMEX", "commission": 0.03, "term": 2, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "CARNET", "commission": 0.03, "term": 2, "has_installments": true, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "VISA", "commission": 0.04, "term": 4, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "DEBIT", "card_brand": "MASTERCARD", "commission": 0.04, "term": 4, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "VISA", "commission": 0.05, "term": 5, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "MASTERCARD", "commission": 0.05, "term": 5, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "CREDIT", "card_brand": "AMEX", "commission": 0.05, "term": 3, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "VISA", "commission": 0.06, "term": 6, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "MASTERCARD", "commission": 0.06, "term": 6, "has_installments": false, "is_international": false, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "VISA", "commission": 0.07, "term": 7, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" }, { "payment_method": "PREPAID", "card_brand": "MASTERCARD", "commission": 0.07, "term": 7, "has_installments": false, "is_international": true, "alias": "Plan obligatorio" } ] ``` --- Fuente: /services/create_merchant_v2 # Dar de alta un comercio Un comercio en la plataforma es el equivalente a un local comercial físico. Para comenzar a operar es necesario darlo de alta, para lo que se debe contar con toda la información legal del comercio y haber realizado los trámites reglamentarios previamente para evitar cualquier tipo de demora. Para poder operar y procesar pagos, es necesario registrar al menos un procesador en la sección [Asignar procesadores al comercio](/services/acquirers) > Para cualquier consulta sobre los trámites necesarios contactar a > biz@menta.global. El proceso de registro de comercios en el sistema de Menta consta de tres pasos: 1. Registrar la entidad del comercio. 2. Crear y asignar los procesadores de pago. 3. Asignar planes de pago al comercio. El primer paso responde `201` con el `merchant_id` del comercio creado. El comercio queda en estado `INCOMPLETE` con `pending_steps` `ACQUIRER` y `PAYMENT_PLAN` hasta completar los pasos siguientes. #### Requisitos - Tener toda la información legal comercio, asi como los contratos y altas en adquirencias correspondientes finalizados ## Detalle de implementación A continuación, se detallan los datos requeridos para registrar la entidad del comercio. * **Datos generales**: * *customer_id*: ID del cliente al que pertenece el comercio. * *country*: País del comercio. * *legal_type*: Tipo de entidad legal del comercio. * *business_name*: Nombre comercial del comercio. * *fantasy_name*: Nombre de fantasía del comercio. Ejemplo: ```json { ... "customer_id": "{{su_id_de_cliente}}", "country": "ARG", "legal_type": "LEGAL_ENTITY", "business_name": "VETERINARIA RIO S.A.", "fantasy_name": "Comercio de prueba", ... } ``` * **Datos fiscales**: * *tax_identification*: Información de la identificación del comercio, incluyendo su tipo y número de documento. Ejemplo: ```json { ... "tax_identification": { "type": "CUIT", "number": "20119996662" }, ... } ``` * **Datos del representante legal**: * *representative*: Información del representante legal del comercio, incluyendo su identificación. Ejemplo: ```json { ... "representative": { "type": "PRESIDENT", "name": "Nombre", "surname": "Apellido", "identification": { "type": "CUIT", "number": "20119996662" }, "email": "prueba@mail.com", "phone": "1150509999" }, ... } ``` * **Datos de contacto:** * *address*: Dirección del comercio. * *address.neighborhood* (opcional): Barrio/Colonia dependiendo del país. * *address.location* (opcional): Coordenadas geográficas (`lat` y `lng`). Si se envía el objeto, ambos campos son obligatorios. Ejemplo: ```json { ... "address": { "state": "CAPITAL_FEDERAL", "city": "Monserrat", "zip": "C1049AAW", "street": "Tucumán", "number": "1171", "floor": "", "apartment": "", "neighborhood": "", "location": { "lat": -34.603722, "lng": -58.381592 } }, ... } ``` > Para obtener las coordenadas geográficas (`lat` y `lng`) a partir de los datos de domicilio, puedes usar el endpoint [Geocodificar dirección](/api_reference/merchants_post_addresses_geocode) (`POST /v1/addresses/geocode`). Envía los campos de `address` sin `location`; la respuesta incluye el objeto `location` listo para incorporar en el alta del comercio. > En los casos de Argentina 🇦🇷, para obtener correctamente el código postal > correspondiente (8 dígitos), se debe obtener el mismo de la página > https://codigo-postal.co/argentina/ . En caso contrario, es posible que el > adquirente Global Processing rechace la petición de alta. * **Configuración de impuestos y pagos**: * *tax_condition*: Configuración fiscal del comercio. * *account_info*: Condición de liquidación del comercio, incluyendo su CBU o CVU (ARG) y CLABE (MX) y su tipo de cuenta. Ejemplo: ```json { ... "financial_info": { "tax_condition": "NO_INSCRIPTO", "account_info": { "cbu_or_cvu": "1000000000000000000000", "account_type": { "code": "02", "type": "Cuenta Corriente" } } }, .... } ``` Consideraciones adicionales - Es necesario completar todos los campos obligatorios del formulario de alta de comercio. - Los datos del representante legal deben coincidir con los de su documento de identidad. - La configuración de datos financieros debe ser precisa para que el comercio pueda operar correctamente. --- Fuente: /services/acquirers # Asignar procesadores al comercio Un procesador o adquirencia se refiere a la entidad o empresa que actúa como intermediario en el proceso de procesamiento de pagos con tarjetas de crédito, débito o QR. A partir del momento que un comercio se encuentra correctamente dado de alta en al menos un procesador y tiene acceso al sistema con un usuario, podrá operar y procesar pagos. > Para cualquier consulta sobre los trámites necesarios contactar a > biz@menta.global. #### Requisitos - Tener toda la información proporcionada por el procesador. ## Procesadores disponibles en MENTA - 🇦🇷 GPS, PRISMA y PRISMA-QR - 🇲🇽 BANORTE y AMEX ## Procesadores de Pagos y Redes de Tarjetas Los procesadores de pagos, permiten a los comerciantes aceptar pagos con tarjetas a través de diversas redes de tarjetas y métodos de pago. Estas redes incluyen algunas de las más conocidas: - **GPS:** VISA, MASTERCARD, MAESTRO - **PRISMA:** VISA, MASTERCARD, MAESTRO, DISCOVER, CABAL, NARANJA, UNIONPAY, DINERS - **PRISMA-QR:** QR - **BANORTE:** VISA, MASTERCARD, CARNET - **American Express:** AMEX ## Detalle de implementación El proceso de registro de comercios en los procesadores de pagos incluye los siguientes pasos: 1. [Obtener procesadores disponibles del cliente](/api_reference/acquirers_get) 2. [Buscar datos solicitados por el procesador seleccionado](/api_reference/acquirer_get) Ejemplos de los datos necesarios para dar de alta cada adquirencia. Esta información esta proporcionada dentro del atributo ***data: []*** **PRISMA QR** ```json { "acquirer_id": "PRISMA_QR", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [] } ``` **GPS** ```json { "acquirer_id": "GPS", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "category", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/activities?customerId={customer_id}", "title": "Actividad", "value": "5411", "hidden": false } }, { "name": "code", "properties": { "type": "TEXT", "validations": { "required": false }, "hidden": true } }, { "name": "business_name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Razón social", "value": "test", "hidden": false } }, { "name": "fantasy_name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Nombre de la empresa", "value": "test", "hidden": true } }, { "name": "tax", "properties": { "type": "OBJECT", "data": [ { "name": "type", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/documents", "title": "Tipo de documento", "value": "CUIT", "hidden": true } }, { "name": "id", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "CUIT", "value": "30445113992", "hidden": false } } ], "hidden": false } }, { "name": "address", "properties": { "type": "OBJECT", "data": [ { "name": "state", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/states", "title": "Provincia", "value": "CAPITAL_FEDERAL", "hidden": false } }, { "name": "city", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Localidad", "value": "CABA", "hidden": false } }, { "name": "zip", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "CPA", "value": "C1049AAK", "hidden": false } }, { "name": "street", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Calle", "value": "AVENIDA INDEPENDENCIA", "hidden": false } }, { "name": "number", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Número", "value": "1494", "hidden": false } } ], "hidden": false } }, { "name": "representative", "properties": { "type": "OBJECT", "data": [ { "name": "name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Nombre", "value": "test", "hidden": true } }, { "name": "surname", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Apellido", "value": "test", "hidden": true } }, { "name": "representative_id", "properties": { "type": "OBJECT", "data": [ { "name": "type", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/documents", "title": "Tipos de documento", "value": "CUIT", "hidden": true } }, { "name": "number", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Número de documento", "value": "123123", "hidden": true } } ], "hidden": false } } ], "hidden": false } }, { "name": "email", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Email", "value": "{email}", "hidden": false } }, { "name": "phone", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Teléfono", "value": "{phone}", "hidden": false } } ] } ``` **PRISMA** ```json { "acquirer_id": "PRISMA", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/PRISMA/activities?customerId={customer_id}", "title": "Actividad", "value": "763", "hidden": false } } ] } ``` **BANORTE** ```json { "acquirer_id": "BANORTE", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/BANORTE/activities?customerId={customer_id}", "title": "Actividad", "hidden": false } } ] } ``` **AMEX** ```json { "acquirer_id": "AMEX", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/AMEX/activities?customerId={customer_id}", "title": "Actividad", "value": "1520", "hidden": false } } ] } ``` 3. [Guardar datos solicitados](/api_reference/acquirer_post) **PRISMA QR** ```json { "acquirer_id": "PRISMA_QR", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [] } ``` **GPS** ```json { "acquirer_id": "GPS", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "category", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/activities?customerId={customer_id}", "title": "Actividad", "value": "5411", "hidden": false } }, { "name": "code", "properties": { "type": "TEXT", "validations": { "required": false }, "hidden": true } }, { "name": "business_name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Razón social", "value": "test", "hidden": false } }, { "name": "fantasy_name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Nombre de la empresa", "value": "test", "hidden": true } }, { "name": "tax", "properties": { "type": "OBJECT", "data": [ { "name": "type", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/documents", "title": "Tipo de documento", "value": "CUIT", "hidden": true } }, { "name": "id", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "CUIT", "value": "37715113992", "hidden": false } } ], "hidden": false } }, { "name": "address", "properties": { "type": "OBJECT", "data": [ { "name": "state", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/states", "title": "Provincia", "value": "CAPITAL_FEDERAL", "hidden": false } }, { "name": "city", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Localidad", "value": "CABA", "hidden": false } }, { "name": "zip", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "CPA", "value": "C1049AAK", "hidden": false } }, { "name": "street", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Calle", "value": "AVENIDA INDEPENDENCIA", "hidden": false } }, { "name": "number", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Número", "value": "1494", "hidden": false } } ], "hidden": false } }, { "name": "representative", "properties": { "type": "OBJECT", "data": [ { "name": "name", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Nombre", "value": "test", "hidden": true } }, { "name": "surname", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Apellido", "value": "test", "hidden": true } }, { "name": "representative_id", "properties": { "type": "OBJECT", "data": [ { "name": "type", "properties": { "type": "SELECT", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/GPS/documents", "title": "Tipos de documento", "value": "CUIT", "hidden": true } }, { "name": "number", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Número de documento", "value": "123123", "hidden": true } } ], "hidden": false } } ], "hidden": false } }, { "name": "email", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Email", "value": "{email}", "hidden": false } }, { "name": "phone", "properties": { "type": "TEXT", "validations": { "required": true }, "title": "Teléfono", "value": "{phone}", "hidden": false } } ] } ``` **PRISMA** ```json { "acquirer_id": "PRISMA", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/PRISMA/activities?customerId={customer_id}", "title": "Actividad", "value": "763", "hidden": false } } ] } ``` **BANORTE** ```json { "acquirer_id": "BANORTE", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/BANORTE/activities?customerId={customer_id}", "title": "Actividad", "hidden": false } } ] } ``` **AMEX** ```json { "acquirer_id": "AMEX", "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "rate_type": "AGGREGATOR", "payment_type": "TERMINAL", "data": [ { "name": "mcc", "properties": { "type": "AUTOCOMPLETE", "validations": { "required": true }, "href": "https://api.menta.global/api/v1/acquirers/AMEX/activities?customerId={customer_id}", "title": "Actividad", "value": "1520", "hidden": false } } ] } ``` > **Advertencia:** Es importante tener en cuenta que los ejemplos de los pasos 1 y 2 pueden cambiar con el tiempo, ya que se trata de un modelo dinámico. Por lo tanto, se recomienda seguir los tres pasos mencionados anteriormente para garantizar una integración adecuada. > > Si se desea agilizar el proceso de integración, se pueden utilizar directamente los ejemplos del **paso 3** y omitir los pasos previos. --- Fuente: /services/plans_selection # Asignar planes de pago a un comercio Desde la plataforma de gestión se pueden cambiar los planes de pago de los comercios u ofrecerles varios distintos para que se los cambien ellos mismos. Para realizar estos pasos existen 3 servicios a ejecutar: * [Obtener todos los planes de pagos disponibles](/api_reference/plans_getall) * [Obtener los planes de pago asignados al comercio](/api_reference/plans_getmerchant) * [Asignar los planes de pago al comercio](/api_reference/plans_post_apply) El body del request es un array JSON de identificadores (UUID) y la lista enviada reemplaza la selección actual del comercio. Es importante obtener de los dos primeros el listado de los identificadores de los planes de pago que se desea asignar al comercio. Hay que considerar el listado de combinaciones previamente mencionado en la sección [Configurar planes de pago](/services/plans_configuration) #### Requisitos * Tener un comercio creado al cual se le quieren modificar los planes de pago asignados y los planes de pagos alternativos a asignar. #### Resultado * Comercio actualizado con nuevos plazos y tasas a utilizar a partir del siguiente pago que procese. ## Ejemplo de asignación de planes ```bash curl --request POST \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/fee-rules \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data \ '[ "{fee_rule_id1}", "{fee_rule_id2}", ... ]' ``` ## Asignación masiva planes de pago Desde la plataforma también ofrecemos la posibilidad de asignar planes de pago a todos los comercios o a una lista de ellos. Para realizar estos pasos existen los siguientes servicios a ejecutar: * [Obtener todos los planes de pagos disponibles](/api_reference/plans_getall) * [Asignar planes de pago a todos o un listado de comercios](/api_reference/plans_post_bulk_assign) > Tener en cuenta que el comercio debe tener asignados al menos uno de cada tipo de plan de pago y estos van a impactar en el precio final que pagan tus comercios. --- Fuente: /services/change_merch_status # Pausar o eliminar comercios Una vez creados los comercios se puede cambiar su estado para tener un mayor control. Los estados que se pueden establecer son: * **ENABLED**: El comercio se encuentra habilitado para que sus usuarios puedan usar la plataforma, como así también procesar pagos. * **DISABLED**: El comercio se encuentra deshabilitado, impidiendo la posibilidad de procesar más pagos pero permitiendo a sus usuarios utilizar herramientas de lectura de transacciones y sus datos. * **DELETED**: Al cambiar un comercio a este estado se está eliminando el mismo, impidiendo su visualización. Los usuarios asociados no se eliminan: solo se desvincula el comercio de los usuarios que tienen más de un comercio, y los usuarios con un único comercio quedan sin cambios. También se eliminan los planes de pago asignados al comercio. Además existe el estado **INCOMPLETE**, que se asigna a los comercios creados con la versión 2 hasta completar su configuración. No se puede establecer mediante este endpoint. > Los comercios eliminados no podrán ser habilitados nuevamente. En tal caso será necesario crear uno nuevo desde el comienzo. Sin embargo, su información transaccional seguirá vigente y podrá ser consultada. #### Requisitos * Comercio creado al cual se le desea modificar su condición dentro del sistema. #### Resultado * Comercio actualizado con el nuevo estado. La respuesta incluye `id`, `country`, `customer_id` y `status`. ## Ejemplo de deshabilitación de un comercio ```bash curl --request PATCH \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/status/DISABLED \ --header 'Authorization: Bearer {access_token}' ``` > Al “pausar” un comercio (deshabilitarlo), este no estará disponible para procesar pagos. --- Fuente: /services/user_admin # Administrar usuarios Para mejorar la gestión de su sistema, se pueden crear y gestionar nuevos usuarios . Estos usuarios pueden tener distintos tipos de permisos que les permiten realizar distintas tareas dentro de la plataforma o en las terminales Cabe destacar que un Customer puede crear usuarios para su entidad (Customer) o para sus comercios. La creación de usuarios está disponible con credenciales `CUSTOMER`; con credenciales `MERCHANT` la respuesta es `403`. > Para conocer en forma detallada las diferencias entre los distintos roles acceder a [Permisos de empresas](https://menta.global/permisos-empresa/) o [Permisos de comercios](https://menta.global/permisos-comercio) #### Requisitos * Nombre de usuario, mail y función para la configuración de sus permisos #### Resultado * Nuevo usuario generado en la plataforma ## Ejemplo de creación de usuario En el siguiente ejemplo se crea un usuario de forma simple para que un empleado de un comercio pueda únicamente procesar pagos ```bash curl --location --request POST 'https://api.menta.global/api/v1/users' \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data-raw '{ "user_type": "MERCHANT", "attributes": { "name":"Caja01", "email": "caja01@restaurante.com", "customer_id": ["{id_cliente}"], "merchant_id": ["{id_comercio}"], "scope": "BASIC" } }' ``` > También se puede configurar una contraseña inicial para facilitar el acceso utilizando el atributo `password` Tener en cuenta que la misma se utilizará solo la primera vez de forma temporal y se deberá completar el challenge correspondiente. Si el cliente no tiene habilitada la notificación de usuarios por email, la respuesta de creación (`201`) devuelve la contraseña temporal en `password` y `attributes.verification_code`. Con el fin de garantizar la seguridad de sus usuarios, en el login puede ser necesario cumplir con ciertos accionables para poder completar el inicio de sesión. En el caso de creación de usuario o reset de contraseña, es necesario completar el challenge `NEW_PASSWORD_REQUIRED`. El mismo será obtenido de la siguiente manera luego de hacer login y debe ser controlado: ```json { "challenge": { "name": "NEW_PASSWORD_REQUIRED" ... } } ``` Una vez que se recibe esta respuesta se deberá realizar un nuevo formulario de cambio de contraseña donde el usuario debe ingresar su contraseña definitiva. Para esto, se debe realizar de la siguiente manera: ```bash curl --location --request POST 'https://api.menta.global/api/v1/users/change-password' \ --header 'Content-Type: application/json' \ --data-raw '{ "email": "string", "old_password":"string", "new_password": "string" }' ``` > Es importante nunca guardar contraseñas en el sistema para cumplir debidamente con todas las regulaciones vigentes --- Fuente: /services/read_transactions # Obtener transacciones Una vez que los comercios ya estén procesando, es importante obtener información de los pagos. Para esto, es importante contar con la información detallada para integrar en su sistema todo lo que sea necesario. #### Requisitos * Comercios correctamente configurados y pagos procesados. #### Resultado * Reportería de los pagos generados con su respectivo detalle La información de los pagos es entregada en un formato completo con todos los detalles de cada operación transaccional que ocurra en las terminales. La misma está compuesta principalmente por: * **Información general del movimiento**: Esta información es la necesaria para determinar el tipo de movimiento (pago, anulación o devolución), estado, montos, fechas, terminal, usuario e información común a todos los tipos de movimiento. * **Información detallada de los pagos**: Esta información es la que corresponde y es más específica a cada medio de pago, como por ejemplo el tipo de tarjeta utilizada, cuantas cuotas, etc. * **Información específica de los cálculos impositivos y descuentos hacia el comercio**: En este conjunto de datos se cuenta con la fecha de dispersión correspondiente, el monto neto a transferir al comercio. Además de los detalles como costos, tasas e impuestos aplicados sobre el monto bruto. * **Información de los cálculos impositivos y descuentos correspondientes a su cuenta**: Este segmento de datos especifica la fecha de liquidación y el monto que se recibirá del adquirente o Menta (según modelo de dispersión). Junto a la información detallada de todos los costos, tasas e impuestos aplicados. ## Ejemplo de obtención de transacciones Es obligatoria la utilización de los siguientes parámetros: * **page**: Es el número de página que desea obtener (comenzando desde 0) * **size**: Es el tamaño de la página que desea obtener Se recomienda enviar además **start/end**, el período del cual obtiene todos los movimientos. Son opcionales para el servicio y requieren un offset (`Z` o, por ejemplo, `-03:00`: `2024-01-01T00:00:00-03:00`). ```bash curl --request GET \ --location 'https://api.menta.global/api/v2/transaction-reports' \ --header 'Authorization: Bearer {access_token}' \ --url-query 'page=0' \ --url-query 'size=100' \ --url-query 'start=2024-01-01T00:00:00Z' \ --url-query 'end=2024-01-10T00:00:00Z' ``` > Existen varios filtros que se pueden utilizar para personalizar más su búsqueda, los mismos se encuentran en la sección [Obtener transacciones por API](/api_reference/transactions_get_v2) --- Fuente: /services/webhooks # Integración con webhooks de pagos Esta integración te permite recibir notificaciones de transacciones (pagos, devoluciones o anulaciones) en un formato específico mediante una solicitud **POST**. #### Requisitos * Servidor que soporte peticiones POST para recibir mensajes #### Resultado * Suscripción configurada y validación de mensajes implementada ## Suscripción a eventos ### Si eres cliente 1. Configura una URL pública y segura para recibir webhooks. 2. [Crea una suscripción](/api_reference/webhooks_post_create_subscription) para comenzar a recibir las notificaciones. 3. [Valida los webhooks](#validación-de-los-webhooks) entrantes usando el token correspondiente para asegurar su origen y evitar manipulaciones. ### Si eres comercio 1. Configura una URL pública y segura para recibir webhooks. 2. [Crea una suscripción](/api_reference/webhooks_post_create_subscription_merchant) para comenzar a recibir las notificaciones. 3. [Valida los webhooks](#validación-de-los-webhooks) entrantes usando el token correspondiente para asegurar su origen y evitar manipulaciones. > Se considera exitosa la entrega cuando tu servidor responde con cualquier código `2xx` dentro de los 10 segundos. Si responde con un código distinto de `2xx` (`4xx` o `5xx`) o no responde en ese tiempo, haremos nuevos reintentos por algunas horas (hasta 10 intentos, con una espera inicial de 30 segundos que se duplica en cada intento, con un máximo de 90 minutos entre intentos). Luego de este período, se dejará de intentar enviar. Por lo cual, recuerda que es una buena práctica conciliar con cierta periodicidad y de esta manera te asegurarás de contar con toda la información actualizada. > > Para conciliar recomendamos utilizar el servicio de [obtención de transacciones](/services/read_transactions). **Ejemplo de notificación:** _OPERATION_CREATED_ ```json { "notification_type": "OPERATION_CREATED", "merchant_id": "db3ae307-4a5c-4cbb-b48c-80bf1a3fde1d", "user": "user@email.com", "datetime": "2022-12-31T23:23:23Z", "detail": { "terminal_id": "72171704-7806-4347-b08b-bc2d2d96e68e", "operation_id": "2fce7d49-f3e2-4b1f-a7bb-7f16d3ea64a2", "ticket_id": "111111111", "operation_type": "PAYMENT", "qr_id": null, "operation_status": "APPROVED", "currency": "ARS", "operation_amount": "200000", "operation_additional_info": "ABC1234", "payment_method_type": "DEBIT", "payment_method_detail": "VISA" } } ``` _TAXED_OPERATION_CREATED_ ```json { "notification_type": "TAXED_OPERATION_CREATED", "merchant_id": "c2192cf8-e221-4ccc-83d4-1c2105d46b9a", "user": "user@email.com", "datetime": "2023-09-19T20:07:32Z", "detail": { "customer_id": "a9733025-9b74-4cf9-b4fb-f71eeb037054", "merchant_id": "45b1d469-e3e5-4ac6-8fe2-2e620d00f9a8", "terminal_id": "c08d4aa6-d560-41c1-acbf-b183eb3794dd", "merchant_additional_info": "35701", "transaction_id": "1b35e569-dc28-47be-897f-1c2a9e5a5305", "operation_id": "6debca65-4faf-48fd-a065-faf32735a52a", "operation_number": 183863925, "operation_additional_info": "", "serial_number": "98282329166214", "operation_type": "PAYMENT", "payment_method": "CREDIT", "gross_amount": 21, "currency": "ARS", "datetime": "2024-03-05T20:21:03-03:00", "status": "APPROVED", "installments": 1, "financing": "ESTANDAR", "user": "user@email.com", "acquirer": "PRISMA", "operation_detail": { "card": { "card_bin": "47617390", "card_mask": "XXXXXXXXXXXX0119", "card_brand": "VISA", "is_international_card": false }, "holder_name": "Tarjetahabiente", "holder_document": "", "description": "APROBADO", "input_mode": "CONTACTLESS", "reference_operation_number": 394221095, "reference_operation_id": "50c7571f-750c-43b5-9baf-f5d1d9a4d022", "rrn": "1234567890", "authorization_code": "123456" }, "tax_info": { "term": 2, "payment_date": "2024-02-23T09:26:54-03:00", "net_amount": 18.02, "customer_term": 8, "customer_payment_date": "2024-03-04T09:26:54-03:00", "customer_net_amount": 20.54, "tax_breakdown": [ { "tax_code": "MENTA_TO_CUSTOMER_COMMISSION", "reference": "Menta to customer commission", "amount": 0.07, "rate": 0.35 }, { "tax_code": "MENTA_TO_CUSTOMER_COMMISSION_VAT_TAX", "reference": "Menta to customer commission VAT Tax", "amount": 0.02, "rate": 0.21 }, { "tax_code": "ACQUIRER_TO_CUSTOMER_COMMISSION", "reference": "Acquirer to customer commission", "amount": 0.38, "rate": 1.8 }, { "tax_code": "ACQUIRER_TO_CUSTOMER_COMMISSION_VAT_TAX", "reference": "Acquirer to customer commission VAT Tax", "amount": 0.08, "rate": 0.21 }, { "tax_code": "CUSTOMER_TO_MERCHANT_COMMISSION", "reference": "Customer to merchant commission", "amount": 1.26, "rate": 5.99 }, { "tax_code": "CUSTOMER_TO_MERCHANT_COMMISSION_VAT_TAX", "reference": "Customer to merchant commission VAT Tax", "amount": 0.26, "rate": 0.21 }, { "tax_code": "MERCHANT_VAT_TAX", "reference": "Merchant VAT Tax", "amount": 0.58, "rate": 0.21 }, { "tax_code": "MERCHANT_INCOME_TAX", "reference": "Merchant Income Tax", "amount": 0.19 }, { "tax_code": "MERCHANT_IIBB_TAX", "reference": "Merchant IIBB Tax", "amount": 0.68 } ] } } } ``` > En `TAXED_OPERATION_CREATED`, si la operación no tiene cálculo de impuestos, `operation_detail.description` contiene el texto fijo `Error al calcular los impuestos` en lugar de la descripción de la operación. ## Validación de los webhooks Para garantizar que su servidor solo procese entregas de webhooks enviadas por Menta y para asegurarse de que la entrega no haya sido manipulada, es fundamental validar la firma del webhook antes de continuar con el procesamiento. Menta utiliza la secret key proporcionada durante la suscripción para generar un hash de firma distinto en cada solicitud, la cual se envía como valor del encabezado **X-Menta-Signature-V1** en cada webhook. Para verificar que la firma es auténtica, el cliente debe aplicar la misma función de hash (HMAC con SHA-256) junto con la secret key, y asegurarse de que coincida con la firma enviada. ### Pasos para generar y validar firma 1. Concatenar los siguientes elementos: | Timestamp | El punto "." | El cuerpo (payload) de la solicitud. | | -------------------------------------------------------- | ------------ | ------------------------------------ | | enviado en el encabezado **X-Menta-Signature-Timestamp** | . | cuerpo crudo, en JSON compacto (sin espacios ni saltos de línea) | La firma se calcula sobre el cuerpo crudo tal como se envía: JSON compacto, sin espacios ni saltos de línea, con los campos nulos incluidos (por ejemplo `"qr_id":null`). Usa los bytes recibidos sin modificar su formato. 2. Obtener la secret key guardada en su servidor. 3. Aplicar la función de hash HMAC con algoritmo SHA-256 junto con la secret key. 4. Comparar la firma generada con la firma enviada en el encabezado **X-Menta-Signature-V1**. ### Ejemplo de implementación en **Kotlin** Puedes utilizar el lenguaje de programación que prefieras para implementar la verificación HMAC en su código. ```kotlin import java.util.Formatter import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec class HashProvider { fun generateHMAC(timestamp: String, body: String, secretKey: String): String { val msg = "$timestamp.$body" val signingKey = SecretKeySpec(secretKey.toByteArray(), "HmacSHA256") val mac = Mac.getInstance("HmacSHA256") mac.init(signingKey) val bytes = mac.doFinal(msg.toByteArray()) return format(bytes) } private fun format(bytes: ByteArray): String { val formatter = Formatter() bytes.forEach { formatter.format("%02x", it) } return formatter.toString() } } ``` ### Probando validación Para probar la validación de webhooks, puedes utilizar los siguientes valores de secret key, timestamp (expresado como Unix timestamp) y JSON payload: | secret key | timestamp | | ---------- | ---------- | | secretKey! | 1697657734 | Payload (se muestra formateado para facilitar la lectura): ```json { "notification_type": "OPERATION_CREATED", "merchant_id": "c2192cf8-e221-4ccc-83d4-1c2105d46b9a", "user": "test@email.com", "datetime": "2023-07-23T21:10Z", "detail": { "terminal_id": "39b4500d-8e14-45ae-89e2-63135534132b", "operation_id": "8e02915b-9387-412c-946a-bf9c046f62ff", "ticket_id": "50691299", "operation_type": "PAYMENT", "qr_id": null, "operation_status": "APPROVED", "currency": "ARS", "operation_amount": "100", "operation_additional_info": "", "payment_method_type": "DEBIT", "payment_method_detail": "MASTERCARD" } } ``` El cuerpo sobre el que se calcula la firma es el JSON compacto, tal como se envía: ```json {"notification_type":"OPERATION_CREATED","merchant_id":"c2192cf8-e221-4ccc-83d4-1c2105d46b9a","user":"test@email.com","datetime":"2023-07-23T21:10Z","detail":{"terminal_id":"39b4500d-8e14-45ae-89e2-63135534132b","operation_id":"8e02915b-9387-412c-946a-bf9c046f62ff","ticket_id":"50691299","operation_type":"PAYMENT","qr_id":null,"operation_status":"APPROVED","currency":"ARS","operation_amount":"100","operation_additional_info":"","payment_method_type":"DEBIT","payment_method_detail":"MASTERCARD"}} ``` Si tu implementación es correcta, las firmas que generes deben coincidir con los siguientes valores de firma: el resultado de la firma y el header X-Menta-Signature-V1: `58f8e39497b01f53d13c5144fcd74ddc3bb33aee35d99cd4989b5e04bdf216f7` ## Recomendaciones 1. Valida el timestamp incluido en la solicitud para evitar ataques de repetición (replay-attack). Un ataque de repetición ocurre cuando un atacante intercepta una solicitud válida junto con su firma y la retransmite. El timestamp se incluye en el proceso de hash y es verificado por la firma, por lo que un atacante no puede cambiar el timestamp sin invalidar la firma. Si la firma es válida pero el timestamp es demasiado antiguo, se recomienda rechazar la solicitud. 2. Asegúrate de que el payload y los encabezados no se modifiquen antes de la verificación. Si utilizas un proxy o un equilibrador de carga, asegúrate de que estos componentes no modifiquen el payload ni los encabezados. 3. Si tu lenguaje de programación y la implementación del servidor especifican una codificación de caracteres, asegúrate de manejar el payload como UTF-8. Y además, se encuentren en Formato JSON antes de generar el hash. 4. Ten en consideración la lógica de reintentos mencionada y ten un control posterior de conciliación para evitar perder información relevante. --- Fuente: /services/payment_intention # Intención de pago Una intención de pago es una solicitud de cobro que se envía a la terminal del comercio a distancia. De esta manera el importe y los datos del negocio llegan al dispositivo sin que la persona operadora tenga que introducirlos manualmente. La persona usuaria solo acerca o inserta su tarjeta en la terminal para confirmar el monto, ya que la orden de cobro se envía desde tu backend y no requiere interacción adicional en el dispositivo. ### Configuración previa Para trabajar con intenciones de pago es necesario habilitar la terminal en modo "intenciones de pago" desde su configuración. Esto activa la recepción de solicitudes y hace que la terminal escuche las operaciones enviadas por tu backend. > El `request_id` de la intención lo genera el servidor y se devuelve en el body de la respuesta al crearla. Conserva ese valor para consultar o cancelar la intención. > **Advertencia:** Crear o cancelar una intención de pago requiere que la terminal esté **CONECTADA**. Si no hay terminal conectada, la API responde **422** y no envía la intención. ## Endpoints disponibles Para trabajar con intenciones de pago, dispones de los siguientes endpoints: ### 1. Crear intención de pago [**POST** `/cloud-terminals/payment-intentions`](/api_reference/cloud_terminals_payment_intentions_post) Envía una solicitud de cobro a la terminal. La persona usuaria solo necesita acercar o insertar su tarjeta para confirmar el monto. ### 2. Cancelar intención de pago [**DELETE** `/cloud-terminals/payment-intentions`](/api_reference/cloud_terminals_payment_intentions_delete) Cancela una intención antes de que se complete la transacción. La terminal vuelve a la pantalla de espera. ### 3. Obtener intención de pago realizada [**GET** `/cloud-terminals/payment-intentions/{requestId}`](/api_reference/cloud_terminals_payment_intentions_get) Obtiene los datos de la transacción asociada a una intención, incluyendo impuestos e información de la tarjeta. El `status` de la respuesta es el estado de la transacción (por ejemplo `APPROVED`), y responde `404` hasta que exista una transacción. Los estados de la intención se consultan con el listado. ### 4. Obtener intenciones de pago [**GET** `/cloud-terminals/payment-intentions`](/api_reference/cloud_terminals_payment_intentions_list_get) Obtiene el listado de intenciones de pago (y cancelaciones) enviadas, con filtros por terminal, requestId, rango de fechas, flow y paginación. ## Flujo de trabajo recomendado 1. **Crear** la intención y conservar el `request_id` devuelto en el body 2. **Consultar** periódicamente el listado de intenciones (filtrando por `requestId`) hasta un estado final (`EXECUTED`, `CANCELLED` o `NOT_DELIVERED`). Es esperable pasar por `PROCESSING` cuando la terminal recibió la solicitud de intención de pago 3. **Cancelar** si es necesario antes de que se complete Ciclo típico de una intención de pago: `CREATED` → `PENDING` → `DELIVERED` → `PROCESSING` → `EXECUTED` o `CANCELLED` > **Advertencia:** Los estados `EXECUTED`, `CANCELLED` y `NOT_DELIVERED` son **estados finales**: una vez que la intención llega a uno de ellos, no puede transicionar a ningún otro estado. > Si una intención permanece en `PROCESSING` más de 3 minutos, el sistema puede iniciar una cancelación automática. Cuando esa cancelación se liquida, la intención de pago original pasa a `CANCELLED`. ## Estados de intenciones de pago | Valor | Descripción | |----------------|-------------| | `CREATED` | Creado. | | `PENDING` | Pendiente de entrega a la terminal. | | `DELIVERED` | Entregado a la terminal. | | `PROCESSING` | La terminal recibió la solicitud de intención de pago. | | `EXECUTED` | Cobro confirmado por la operación (estado final). | | `CANCELLED` | Intención anulada, o cancelada automáticamente si tras 3 minutos no se recibió la confirmación del cobro (estado final). | | `NOT_DELIVERED`| No entregado a la terminal (estado final de error). | Cuando una cancelación llega a `EXECUTED` o `NOT_DELIVERED`, la intención de pago relacionada (mismo `requestId`) pasa a `CANCELLED`. ## Consideraciones importantes - **Identificador**: Usa el `request_id` devuelto al crear la intención para consultarla y cancelarla. - **Ownership**: Los IDs deben pertenecer a la cuenta del token - **Terminal conectada**: Las escrituras (crear/cancelar) exigen que la terminal esté conectada; de lo contrario la API responde **422** --- Fuente: /api_reference # Referencia de la API Esta sección reúne la referencia de los endpoints disponibles. Para autenticarse, consultar la guía de [Autenticación](/services/authorization) y las páginas de referencia de la sección Autenticación. ## Autenticación SDK - [Obtener Token](/api_reference/auth_get_token_customer_sdk) ## Autenticación - [Autenticación](/api_reference/auth_post_login) ## Api Keys Cliente - [Autogestión](/api_reference/api_key_customer_post) - [Gestión para comercio](/api_reference/api_key_customer_merchant_post) - [Buscar](/api_reference/api_key_customer_get) - [Eliminar](/api_reference/api_key_customer_delete) ## Api Keys Comercio - [Autogestión](/api_reference/api_key_merchant_post) - [Buscar](/api_reference/api_key_merchant_get) - [Eliminar](/api_reference/api_key_merchant_delete) ## Transacciones - [Obtener transacciones](/api_reference/transactions_get_v2) ## Usuarios - [Obtener usuarios](/api_reference/users_get) - [Borrar usuario](/api_reference/users_delete) - [Crear usuario](/api_reference/users_post) - [Restaurar contraseña](/api_reference/users_post_setpassword) - [Cambiar contraseña](/api_reference/users_post_changepassword) ## Comercios - [Listar comercios](/api_reference/merchants_getall) - [Obtener comercio](/api_reference/merchants_get) - [Crear comercio](/api_reference/merchants_post_create_v2) - [Geocodificar dirección](/api_reference/merchants_post_addresses_geocode) - [Actualización completa](/api_reference/merchants_put) - [Actualización parcial](/api_reference/merchants_patch) - [Actualizar estado](/api_reference/merchants_patch_setstatus) - [Obtener cuotas disponibles](/api_reference/merchants_installments_get) - [Actualizar plan de cuotas](/api_reference/merchants_installments_financing_post) ## Procesadores - [Obtener procesadores](/api_reference/acquirers_get) - [Obtener datos requeridos](/api_reference/acquirer_get) - [Dar de alta procesador](/api_reference/acquirer_post) ## Planes de pago - [Obtener planes de pago](/api_reference/plans_getall) - [Obtener Planes de comercio](/api_reference/plans_getmerchant) - [Crear plan de pago](/api_reference/plans_post_create) - [Seleccionar plan de pago](/api_reference/plans_post_apply) - [Eliminar plan de pago](/api_reference/plans_delete) - [Asignación masiva](/api_reference/plans_post_bulk_assign) ## Webhooks - [Suscripciones - cliente](/api_reference/webhooks_get_subscriptions) - [Suscripciones - comercio](/api_reference/webhooks_get_subscriptions_merchant) - [Crear suscripción - cliente](/api_reference/webhooks_post_create_subscription) - [Crear suscripción - comercio](/api_reference/webhooks_post_create_subscription_merchant) - [Eliminar suscripción](/api_reference/webhooks_delete_subscription) - [Crear notificación de prueba](/api_reference/webhooks_post_create_mock) - [Esquema de eventos](/api_reference/webhooks_event_create) ## Terminales - [Obtener terminales](/api_reference/terminals_get) ## Intenciones de Pago - [Crear intención de pago](/api_reference/cloud_terminals_payment_intentions_post) - [Cancelar intención de pago](/api_reference/cloud_terminals_payment_intentions_delete) - [Obtener intenciones de pago](/api_reference/cloud_terminals_payment_intentions_list_get) - [Obtener intención de pago realizada](/api_reference/cloud_terminals_payment_intentions_get) --- Fuente: /api_reference/auth_get_token_customer_sdk #### Autenticación SDK # Obtener Token ### `GET /v1/api-keys/token` Este endpoint permite obtener un token de autenticación a partir de una API Key. Funciona tanto con API Keys de tipo **Cliente** como de tipo **Comercio**. Se envía el header `X-API-KEY`. El token obtenido es de tipo Bearer: se envía en el header `Authorization` con el formato `Authorization: {token_type} {id_token}` para autenticar las solicitudes a los demás endpoints. Si la API Key no existe o fue eliminada, la respuesta es `403`. > Para generar una API Key de tipo Cliente, consulta la sección **Api Keys Cliente**. Para una de tipo Comercio, consulta **Api Keys Comercio**. ```bash curl --location 'https://api.menta.global/api/v1/api-keys/token' \ --header 'X-API-KEY: {api_key}' ``` **200** ```json { "expires_in": 86400, "token_type": "Bearer", "id_token": "" } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/auth_post_login #### Autenticación # Iniciar sesión ### `POST /v1/login` Este endpoint permite a los usuarios obtener un token de autenticación para usar en requests subsiguientes. Antes de ejecutar cualquier acción es necesario autenticarse utilizando el `access_token` que se obtiene del request de Login. Este debe ser enviado como header en los request subsiguientes. ```bash Authorization: Bearer {access_token} ``` | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user` | | El e-mail del usuario al cual se desea iniciar sesión. | | `password` | | Contraseña del usuario | | `user_type` (opcional) | string | Tipo de usuario (si no es enviado, por defecto es MERCHANT).
Valores: [CUSTOMER, MERCHANT] | > En el primer intento de inicio de sesión de un usuario creado o un usuario al que se le restauró la contraseña, el response indicará que es necesario hacer un cambio de contraseña. > Para cumplir con este requisito, se debe enviar una solicitud de [Cambio de contraseña](/api_reference/users_post_changepassword). > Los intentos fallidos se cuentan por `user`. Al superar el límite (por defecto 10 intentos en 60 segundos) la respuesta es `429`. En un `400`, el mensaje describe el motivo del error. ```bash curl --request POST \ --url https://api.menta.global/api/v1/login \ --header 'Content-Type: application/json' \ --data '{ "user": "string", "password": "string" }' ``` **200** ```json { "token": { "access_token": "example access_token", "id_token": "example id_token", "expires_in": 86400, "token_type": "Bearer", "refresh_token": "example refresh token", "refresh_expires_in": 86400 } } ``` `refresh_token` y `refresh_expires_in` son opcionales. **200 (change password)** ```json { "challenge": { "name": "NEW_PASSWORD_REQUIRED", "session": "string" } } ``` > En el primer intento de inicio de sesión de un usuario creado o un usuario al que se le restauró la contraseña, el response indicará que es necesario hacer un cambio de contraseña. > Para cumplir con este requisito, se debe enviar una solicitud de [Cambio de contraseña](/api_reference/users_post_changepassword). **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Not found" } ] } ``` **429** `429`: Too Many Requests ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Rejected due login rate limit" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "error communicating with auth provider" } ] } ``` --- Fuente: /api_reference/api_key_customer_post #### Api key Cliente # Crear API Keys ### `POST /v1/api-keys` Este endpoint permite crear una api key para un cliente determinado. **¿Es la primera vez que generas una API Key?** En ese caso, deberás incluir el siguiente **header** en tu solicitud. ```bash Authorization: Bearer example_access_token_cliente ``` **¿Ya tienes una API Key disponible?** Entonces puedes hacer la solicitud incluyendo el siguiente **header**. ```bash X-Api-Key: api_key_cliente ``` | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user` | string | Email del cliente. Debe estar en minúsculas: las mayúsculas se rechazan con 400 | | `customer_id` (opcional) | string | Identificador del cliente. | | `country` (opcional) | string | País del cliente (por ejemplo ARG). | > - Si no existe un usuario para ese email, se crea uno de servicio de forma automática. Si el usuario está deshabilitado, la solicitud responde `422`. > - Solo se cuentan las API Keys en estado `ENABLED`: el máximo es 10 por usuario y, al superarlo, la solicitud responde `422`. > - El valor completo de `api_key` solo se devuelve en esta respuesta (`201`). El listado lo devuelve enmascarado. > - Pueden ocurrir además errores `400` de validación del body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_cliente' \ --data '{ "user": "email_cliente", "customer_id": "{id_cliente}" }' ``` **201** ```json { "id": "string", "api_key": "string", "user": "string", "user_type": "CUSTOMER", "customer_id": "string", "status": "ENABLED", "create_date": "2025-05-27T15:18:14.198056093Z", "update_date": "2025-05-27T15:18:14.205319483Z" } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "422", "resource": "...", "message": "Maximum API keys (10) reached for user {email}" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_customer_merchant_post #### Api key Cliente # Crear API Keys ### `POST /v1/api-keys` Este endpoint permite crear una api key para un comercio asociado a un cliente. El tipo de API Key se deriva del body: si se envía `merchant_id` se crea una de tipo `MERCHANT`; si no, una de tipo `CUSTOMER`. El request no tiene un campo `user_type`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user` | string | Email del comercio. Debe estar en minúsculas: las mayúsculas se rechazan con 400 | | `customer_id` (opcional) | string | Identificador del cliente | | `merchant_id` (opcional) | string | Identificador del comercio. Si se omite, se crea una API Key de tipo CUSTOMER en lugar de una de comercio | | `country` (opcional) | string | País (por ejemplo ARG) | > - Si no existe un usuario para ese email, se crea uno de servicio de forma automática. Si el usuario está deshabilitado, la solicitud responde `422`. > - Solo se cuentan las API Keys en estado `ENABLED`: el máximo es 10 por usuario y, al superarlo, la solicitud responde `422`. > - El valor completo de `api_key` solo se devuelve en esta respuesta (`201`). El listado lo devuelve enmascarado. > - Pueden ocurrir además errores `400` de validación del body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_cliente' \ --data '{ "user": "email_comercio", "customer_id": "{id_cliente}", "merchant_id": "{id_comercio}" }' ``` **201** ```json { "id": "string", "api_key": "string", "user": "string", "user_type": "MERCHANT", "customer_id": "string", "merchant_id": "string", "status": "ENABLED", "create_date": "2025-05-27T15:18:14.198056093Z", "update_date": "2025-05-27T15:18:14.205319483Z" } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "422", "resource": "...", "message": "Maximum API keys (10) reached for user {email}" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_customer_get #### Api key Cliente # Buscar API Keys ### `GET /v1/api-keys` Este endpoint permite obtener el listado de api keys que tiene asociado el cliente. Por defecto solo se devuelven las API Keys en estado `ENABLED`; las eliminadas se ven con `status=DELETED`. Con un token de cliente solo se listan las API Keys de tipo `CUSTOMER`: las de sus comercios no se incluyen. El valor de `api_key` se devuelve enmascarado; el valor completo solo se obtiene al crear la API Key. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` (opcional) | integer | El número de la página de resultados a obtener (si no es enviado, por defecto es 0) | | `size` (opcional) | integer | El número de resultados por página (si no es enviado, por defecto es 10) | | `username` (opcional) | string | Filtra por el email del usuario de la API Key | | `status` (opcional) | string | Estado de las API Keys a listar (si no es enviado, por defecto es ENABLED). No distingue mayúsculas de minúsculas
Valores: [ENABLED, DELETED] | ```bash curl --request GET \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_cliente' \ --url-query 'page=integer' \ --url-query 'size=integer' \ ``` **200** ```json { "data": [ { "id": "string", "api_key": "string", "user": "string", "user_type": "CUSTOMER", "customer_id": [ "id_cliente" ], "status": "ENABLED", "create_date": "2025-05-27T15:18:14.198Z", "update_date": "2025-05-27T15:18:14.205Z", "last_used_at": "2025-05-27T17:46:18.134Z" } ], "page": { "size": 10, "total_elements": 1, "total_pages": 1, "number": 0 } } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_customer_delete #### Api key Cliente # Borrar API Keys ### `DELETE /v1/api-keys/{id}` Permite borrar una api-key. Es un borrado lógico: el registro se conserva con `status` `DELETED` (visible con `status=DELETED` en el listado) y la API Key deja de poder usarse para iniciar sesión. Borrar una API Key ya eliminada responde `409`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `id` | string | Es el identificador (UUID) de la API key, que puede pertenecer tanto al cliente como al comercio. | > Solo se puede borrar una API Key propia; en caso contrario la respuesta es `403`. ```bash curl --request DELETE \ --url https://api.menta.global/api/v1/api-keys/{id} \ --header 'X-Api-Key: api_key_cliente' ``` **204** Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Missing request parameter: merchantId. Parameter type: UUID" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **409** `409`: Conflict ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "ApiKey with id {id} is already deleted" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_merchant_post #### Api key Comercio # Crear API Keys ### `POST /v1/api-keys` Este endpoint permite crear una api key para un comercio determinado. **¿Es la primera vez que generas una API Key?** En ese caso, deberás incluir el siguiente header en tu solicitud. ```bash Authorization: Bearer example_access_token_comercio ``` **¿Ya tienes una API Key disponible?** Entonces puedes hacer la solicitud incluyendo el siguiente header. ```bash X-Api-Key: api_key_comercio ``` | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user` | string | Email del comercio. Debe estar en minúsculas: las mayúsculas se rechazan con 400 | | `customer_id` (opcional) | string | Identificador del cliente | | `merchant_id` (opcional) | string | Identificador del comercio | | `country` (opcional) | string | País del comercio | > Con credenciales `MERCHANT` solo se pueden crear API Keys de comercio. Con credenciales `CUSTOMER`, si se omite `merchant_id` se crea una API Key de tipo `CUSTOMER` en lugar de una de comercio. > - Si no existe un usuario para ese email, se crea uno de servicio de forma automática. Si el usuario está deshabilitado, la solicitud responde `422`. > - Solo se cuentan las API Keys en estado `ENABLED`: el máximo es 10 por usuario y, al superarlo, la solicitud responde `422`. > - El valor completo de `api_key` solo se devuelve en esta respuesta (`201`). El listado lo devuelve enmascarado. > - Pueden ocurrir además errores `400` de validación del body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/api-keys \ --header 'X-Api-Key: api_key_comercio' \ --data '{ "user": "email_comercio@example.com", "customer_id": "{id_cliente}", "merchant_id": "{id_comercio}" }' ``` **201** ```json { "id": "string", "api_key": "string", "user": "string", "user_type": "MERCHANT", "customer_id": "string", "merchant_id": "string", "status": "ENABLED", "create_date": "2025-05-27T15:18:14.198056093Z", "update_date": "2025-05-27T15:18:14.205319483Z" } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "422", "resource": "...", "message": "Maximum API keys (10) reached for user {email}" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_merchant_get #### Api key Comercio # Buscar API Keys ### `GET /v1/api-keys` Este endpoint permite obtener el listado de api keys que tiene asociado el comercio. Por defecto solo se devuelven las API Keys en estado `ENABLED`; las eliminadas se ven con `status=DELETED`. El valor de `api_key` se devuelve enmascarado; el valor completo solo se obtiene al crear la API Key. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` (opcional) | integer | El número de la página de resultados a obtener (si no es enviado, por defecto es 0) | | `size` (opcional) | integer | El número de resultados por página (si no es enviado, por defecto es 10) | | `username` (opcional) | string | Filtra por el email del usuario de la API Key | | `status` (opcional) | string | Estado de las API Keys a listar (si no es enviado, por defecto es ENABLED). No distingue mayúsculas de minúsculas
Valores: [ENABLED, DELETED] | ```bash curl --request GET \ --url https://api.menta.global/api/v1/api-keys \ --url-query 'page=integer' \ --url-query 'size=integer' \ --header 'X-Api-Key: api_key_comercio' \ ``` **200** ```json { "data": [ { "id": "string", "api_key": "string", "user": "string", "user_type": "MERCHANT", "merchant_id": [ "string" ], "customer_id": [ "string" ], "status": "ENABLED", "create_date": "2025-05-27T15:18:14.198Z", "update_date": "2025-05-27T15:18:14.205Z", "last_used_at": "2025-05-27T17:46:18.134Z" } ], "page": { "size": 10, "total_elements": 1, "total_pages": 1, "number": 0 } } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/api_key_merchant_delete #### Api key Comercio # Borrar API Keys ### `DELETE /v1/api-keys/{id}` Permite borrar una api-key. Es un borrado lógico: el registro se conserva con `status` `DELETED` (visible con `status=DELETED` en el listado) y la API Key deja de poder usarse para iniciar sesión. Borrar una API Key ya eliminada responde `409`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `id` | string | Identificador de la API key asociada al comercio. | > Solo se puede borrar una API Key propia; en caso contrario la respuesta es `403`. ```bash curl --request DELETE \ --url https://api.menta.global/api/v1/api-keys/{id} \ --header 'X-Api-Key: api_key_comercio' ``` **204** Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Missing request parameter: merchantId. Parameter type: UUID" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "Access denied" } ] } ``` **409** `409`: Conflict ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "resource": "...", "message": "ApiKey with id {id} is already deleted" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/transactions_get_v2 #### Transacciones - Versión 2.0 # Obtener transacciones ### `GET /v2/transaction-reports` Este endpoint permite buscar información impositiva de transacciones por varios criterios. La versión 2.0 del endpoint introduce mejoras significativas en la estructura de la respuesta para proporcionar una interfaz más clara y eficiente. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` | integer | El número de la página de resultados a obtener (>=0) | | `size` | integer | El número de resultados por página (max = 10000) | | `start` (opcional) | date | La fecha de inicio del rango de búsqueda. Requiere offset: Z o, por ejemplo, -03:00 (2026-09-30T00:00:00-03:00)
Valores: [yyyy-MM-ddTHH:mm:ssXXX] | | `end` (opcional) | date | La fecha de fin del rango de búsqueda. Requiere offset, igual que start
Valores: [yyyy-MM-ddTHH:mm:ssXXX] | | `operationId` (opcional) | string | Identificador (UUID) de la operación | | `ticketId` (opcional) | integer | Número de operación | | `requestId` (opcional) | string | Identificador de la solicitud que originó la operación | | `merchantId` (opcional) | array | Identificadores (UUID) de comercio para acotar la búsqueda | | `serialCode` (opcional) | string | Número de serie de la terminal | | `acquirerId` (opcional) | string | Identificador del adquirente | | `amountFrom` (opcional) | string | Monto mínimo de la operación | | `amountTo` (opcional) | string | Monto máximo de la operación | | `timeStart` (opcional) | string | Hora de inicio dentro del día. Formato HH:mm | | `timeEnd` (opcional) | string | Hora de fin dentro del día. Formato HH:mm | | `hint` (opcional) | string | Texto de búsqueda libre | | `operationType` (opcional) | string | El tipo de operación de las transacciones
Valores: [PAYMENT, REFUND, ANNULMENT] | | `cardType` (opcional) | string | Tipo de tarjeta
Valores: [DEBIT, CREDIT, PREPAID] | | `cardBrand` (opcional) | string | Marca de tarjeta
Valores: [VISA, MASTERCARD, AMEX, CARNET, MAESTRO] | | `paymentMethod` (opcional) | string | El método de pago
Valores: [DEBIT, CREDIT, PREPAID, QR] | | `status` (opcional) | string | Un listado de estados de las transacciones
Valores: [APPROVED, FAILED, REVERSED, PENDING, REJECTED] | > - `start` y `end` son opcionales; se recomienda enviarlos para acotar el período. > - `status` solo acepta los valores indicados; cualquier otro responde `400`. > - `cardType` puede usarse como alternativa a `paymentMethod`. > - Un usuario de comercio solo recibe los códigos de impuesto (`tax_code`) propios del comercio: no incluye los códigos `MENTA_*`, `ACQUIRER_*`, `CUSTOMER_VAT_TAX` ni `CUSTOMER_INCOME_TAX`. Los impuestos con monto cero o nulo se omiten. **Esquema de la respuesta:** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `customer_id` | string | ID del cliente | | `merchant_id` | string | ID del comercio | | `terminal_id` | string | ID de la terminal | | `merchant_additional_info` | string | Información adicional del comercio | | `transaction_id` | string | ID de la transacción | | `operation_id` | string | ID de la operación | | `operation_number` | integer | Número de la operación | | `request_id` (opcional) | string | Identificador de la solicitud que originó la operación | | `operation_additional_info` | string | Información adicional de la operación | | `serial_number` | string | Número de serie | | `operation_type` | string | Tipo de operación
Valores: [PAYMENT, REFUND, ANNULMENT] | | `payment_method` | string | Método de pago
Valores: [CREDIT, DEBIT, PREPAID, QR] | | `gross_amount` | number | Monto bruto de la operación | | `currency` | string | Moneda de la operación
Valores: [ARS, MEX] | | `datetime` | string | Fecha de la operación | | `status` | string | Estado de la operación
Valores: [FAILED, APPROVED, REVERSED, REJECTED] | | `installments` | integer | Número de cuotas | | `financing` (opcional) | string | Tipo de financiación de cuotas | | `user` | string | Usuario que realizó la operación | | `acquirer` | string | Adquirente que realizó la operación
Valores: [PRISMA, GPS, BANORTE, AMEX] | | `operation_detail` | object | Detalles adicionales de la operación | | `tax_info` | object | Información de impuestos | **Esquema del detalle de la operación (operation_detail):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `operation_detail.reference_operation_id` (opcional) | string | ID de operación de pago de referencia (solo aplica para REFUND y ANNULMENT) | | `operation_detail.reference_operation_number` (opcional) | integer | Número de operación de pago de referencia (solo aplica para REFUND y ANNULMENT) | | `operation_detail.qr_id` (opcional) | string | ID del código QR asociado a la transacción | | `operation_detail.rrn` (opcional) | string | Número de referencia de la transacción | | `operation_detail.authorization_code` (opcional) | string | Código de autorización de la transacción | | `operation_detail.additional_info` (opcional) | string | Información adicional sobre la operación | | `operation_detail.card` (opcional) | object | Detalles de la tarjeta utilizada en la operación | | `operation_detail.holder_name` (opcional) | string | Nombre del titular de la tarjeta | | `operation_detail.holder_document` (opcional) | string | Documento de identificación del titular de la tarjeta | | `operation_detail.description` (opcional) | string | Descripción de la operación | | `operation_detail.response_description` (opcional) | string | Descripción de la respuesta del adquirente | | `operation_detail.response_code` (opcional) | string | Código de respuesta del adquirente | | `operation_detail.response_name` (opcional) | string | Nombre de la respuesta del adquirente | | `operation_detail.situation_code` (opcional) | string | Código de situación de la operación | | `operation_detail.situation_message` (opcional) | string | Mensaje de situación de la operación | | `operation_detail.advance_amount` (opcional) | number | Monto de adelanto | | `operation_detail.tip_amount` (opcional) | number | Monto de las propinas | | `operation_detail.wallet_name` (opcional) | string | Nombre de la billetera | | `operation_detail.input_mode` (opcional) | string | Método de lectura
Valores: [CONTACTLESS, EMV, STRIPE] | **Esquema del detalle de la tarjeta (card):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `operation_detail.card.card_bin` (opcional) | string | Número bin de la tarjeta | | `operation_detail.card.card_mask` (opcional) | string | Número enmascarado de la tarjeta | | `operation_detail.card.card_brand` (opcional) | string | Marca de la tarjeta | | `operation_detail.card.is_international_card` (opcional) | boolean | Si la tarjeta es internacional | **Esquema de la información de impuestos (tax_info):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `tax_info.term` | integer | Cantidad de días | | `tax_info.payment_date` | string | Fecha de pago
Valores: [2000-12-31T00:00:00Z] | | `tax_info.net_amount` | number | Monto neto | | `tax_info.customer_term` (opcional) | integer | Cantidad de días del cliente. Se omite para usuarios de comercio | | `tax_info.customer_payment_date` (opcional) | string | Fecha de pago del cliente. Se omite para usuarios de comercio
Valores: [2000-12-31T00:00:00Z] | | `tax_info.customer_net_amount` (opcional) | number | Monto neto del cliente. Se omite para usuarios de comercio | | `tax_info.tax_breakdown` | array | Desglose de impuestos | **Esquema del desglose de impuestos (tax_breakdown):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `tax_code` | string | Código de impuesto | | `reference` | string | Descripción del impuesto | | `amount` | number | Monto del impuesto | | `rate` (opcional) | number | Tasa del impuesto | **Códigos de desglose de impuestos (tax_code):** - **MENTA_TO_CUSTOMER_COMMISSION**: Comisión de Menta - **MENTA_TO_CUSTOMER_COMMISSION_VAT_TAX**: IVA sobre la comisión de Menta - **MENTA_DISCOUNT**: Descuento de Menta - **ACQUIRER_TO_CUSTOMER_COMMISSION**: Comisión de la condición comercial - **ACQUIRER_TO_CUSTOMER_COMMISSION_VAT_TAX**: IVA sobre la comisión de adquiriente - **CUSTOMER_TO_MERCHANT_COMMISSION**: Tasa del plan de pago que pone el cliente - **CUSTOMER_TO_MERCHANT_COMMISSION_VAT_TAX**: IVA sobre la tasa del plan de pago - **FINANCIAL_COST**: Costo financiero de la tarjeta - **FINANCIAL_COST_VAT_TAX**: IVA sobre el costo financiero - **MERCHANT_VAT_TAX**: IVA sobre el total del monto del comercio - **MERCHANT_INCOME_TAX**: Impuesto a las ganancias del comercio - **CUSTOMER_VAT_TAX**: IVA sobre el total del monto del cliente - **CUSTOMER_INCOME_TAX**: Impuesto a las ganancias del cliente - **MERCHANT_IIBB_TAX**: Ingresos brutos del comercio - **INSTALLMENT_AMOUNT**: Importe por cuota ```bash curl --request GET \ --location 'https://api.menta.global/api/v2/transaction-reports' \ --header 'Authorization: Bearer {access_token}' \ --url-query 'page=integer' \ --url-query 'size=integer' \ --url-query 'start=string' \ --url-query 'end=string' ``` **200** ```json { "content": [ { "customer_id": "string", "merchant_id": "string", "terminal_id": "string", "merchant_additional_info": "string", "transaction_id": "string", "operation_id": "string", "operation_number": 0, "operation_additional_info": "string", "serial_number": "string", "operation_type": "PAYMENT", "payment_method": "CREDIT", "gross_amount": 0, "currency": "ARS", "datetime": "2024-03-05T20:21:03-03:00", "status": "APPROVED", "installments": 0, "financing": "ESTANDAR", "user": "string", "acquirer": "string", "operation_detail": { "card": { "card_bin": "string", "card_mask": "string", "card_brand": "VISA", "is_international_card": false }, "holder_name": "string", "holder_document": "string", "description": "string", "input_mode": "CONTACTLESS", "reference_operation_number": 394221095, "reference_operation_id": "50c7571f-750c-43b5-9baf-f5d1d9a4d022", "rrn": "string", "authorization_code": "string" }, "tax_info": { "term": 0, "payment_date": "2024-02-23T09:26:54-03:00", "net_amount": 0, "customer_term": 0, "customer_payment_date": "2024-03-04T09:26:54-03:00", "customer_net_amount": 0, "tax_breakdown": [ { "tax_code": "string", "reference": "string", "amount": 0, "rate": 0 } ] } } ], "pageable": { "sort": { "sorted": true, "unsorted": true, "empty": true }, "page_number": 0, "page_size": 0, "offset": 0, "paged": true, "unpaged": true }, "total_pages": 0, "total_elements": 0 } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/users_get #### Usuarios # Obtener usuarios ### `GET /v1/users` Permite la posibilidad de obtener el listado de usuarios. Disponible con credenciales `CUSTOMER`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` (opcional) | integer | El número de la página de resultados a obtener (>=0). Si no es enviado, por defecto es 0 | | `size` (opcional) | integer | El número de resultados por página (max = 10000). Si no es enviado, por defecto es 10 | | `email` (opcional) | string | El email del usuario | | `merchantId` (opcional) | string | El id del comercio al que pertenece un usuario | | `customerId` (opcional) | string | El id del cliente al que pertenece un usuario | | `userType` (opcional) | string | El tipo de usuario a listar
Valores: [MERCHANT, CUSTOMER] | | `next` (opcional) | integer | Número de página a obtener. Si se envía, tiene prioridad sobre page | | `limit` (opcional) | integer | Cantidad de resultados por página. Si se envía, tiene prioridad sobre size | ```bash curl --location --request GET 'https://api.menta.global/api/v1/users?page=0&size=10' \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json { "users": [ { "attributes": { "id": "string", "name": "string", "username": "string", "description": "string", "email": "string", "customer_id": "array", "merchant_id": "array", "country": "string", "type": "string", "scope": "string" }, "status": "CONFIRMED", "enabled": boolean, "audit": { "creation_date": "2019-02-05T21:03:54.499+0000", "update_date": "2019-02-05T21:03:54.499+0000" } } ], "_metadata": { "_size": 0, "_total_elements": 0, "_total_pages": 0, "_number": 0, "_next": "string", "_limit": 0 } } ``` `username` y `description` se incluyen solo si están definidos. En `_metadata`, `_next` es el número de la página siguiente como texto (se omite si no hay) y `_limit` es el tamaño de página. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Validation error occurred" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/users_delete #### Usuarios # Borrar usuario ### `DELETE /v1/users/{email}` Permite borrar un usuario de forma permanente. Disponible con credenciales `CUSTOMER`. Si el email no existe, la respuesta es `404`. | Parámetro | Descripción | | --- | --- | | `email` | El email del usuario | ```bash curl --location --request DELETE 'https://api.menta.global/api/v1/users/{email}' \ --header 'Authorization: Bearer {access_token}' ``` **204** Sin contenido en el body. **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Unauthorized" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "User not found" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/users_post #### Usuarios # Crear usuario ### `POST /v1/users` Permite crear usuarios para una empresa o comercio. Disponible con credenciales `CUSTOMER`; con credenciales `MERCHANT` la respuesta es `403`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user_type` | string | El tipo de usuario que se quiere crear
Valores: [MERCHANT, CUSTOMER] | | `password` (opcional) | string | Una contraseña inicial temporal, se solicitará un cambio en el primer login. | | `attributes` | object | Datos del usuario. Los campos siguientes van dentro de este objeto | | `attributes.email` | string | El email del usuario. No admite caracteres no permitidos (solo letras, números y !#$%&'*+-/=?^_`{\|}~) y tiene un máximo de 254 caracteres | | `attributes.name` (opcional) | string | Nombre del usuario | | `attributes.username` (opcional) | string | Nombre de usuario | | `attributes.description` (opcional) | string | Descripción del usuario | | `attributes.customer_id` (opcional) | array | Identificadores de los clientes a los que pertenece un usuario, como array JSON de UUID. Se envía para usuarios MERCHANT y CUSTOMER | | `attributes.merchant_id` (opcional) | array | Identificadores de los comercios a los que pertenece un usuario, como array JSON de UUID. Se envía para usuarios MERCHANT; se omite para CUSTOMER | | `attributes.scope` (opcional) | string | El tipo de permiso que se le quiere asignar (si no es enviado, por defecto es FULL_ACCESS)
Valores: [WITHOUT_GROUPS, READ_ONLY, FULL_ACCESS, BASIC] | > - Un usuario `MERCHANT` requiere `customer_id` y `merchant_id`. Un usuario `CUSTOMER` requiere `customer_id` y no debe incluir `merchant_id`. > - Un `CUSTOMER` solo puede crear usuarios para sus propios `customer_id`; si no le pertenecen, la respuesta es `401` (`Unauthorized`). > - Si el email ya existe, la respuesta es `422` o `400` con el mensaje `User already exists`. > En el primer intento de inicio de sesión del usuario creado, el response indicará que es necesario hacer un cambio de contraseña. > Para cumplir con este requisito, se debe enviar una solicitud de [Cambio de contraseña](/api_reference/users_post_changepassword). > **Advertencia:** Si el cliente no tiene habilitada la notificación de usuarios por email, la respuesta incluye la contraseña temporal generada en `password` y en `attributes.verification_code`. Si la tiene habilitada, ambos campos se omiten. ```bash curl --location --request POST 'https://api.menta.global/api/v1/users' \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data-raw '{ "user_type": "string", "password": "string", "attributes": { "name":"string", "email": "string", "customer_id": "array", "merchant_id": "array" } }' ``` **201** ```json { "attributes": { "id": "string", "name": "string", "username": "string", "description": "string", "email": "string", "merchant_id": "array", "customer_id": "array", "country": "string", "type": "string", "scope": "string" }, "status": "CONFIRMED", "enabled": boolean, "permanent": false, "audit": { "creation_date": "2019-02-05T21:03:54.499+0000", "update_date": "2019-02-05T21:03:54.499+0000" } } ``` `username` y `description` se incluyen solo si se enviaron. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Validation error occurred" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Unauthorized" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Customer not found" } ] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "User already exists" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/users_post_setpassword #### Usuarios # Restaurar contraseña ### `POST /v1/users/set-password` Permite configurar una contraseña temporal a un usuario que esté bajo la jerarquía de quien envía el request. Disponible con credenciales `CUSTOMER`. El usuario deberá cambiarla en su siguiente inicio de sesión. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `user_type` | string | El tipo de usuario. El usuario se busca por email
Valores: [MERCHANT, CUSTOMER] | | `email` | string | El email del usuario al cual se le fija la contraseña | | `password` | string | Contraseña que se desea utilizar | > Un `CUSTOMER` o `MERCHANT` solo puede hacerlo si sus `customer_id` (o `merchant_id`) coinciden con los del usuario destino; en caso contrario la respuesta es `401`. Si el email no existe, la respuesta es `404`. ```bash curl --request POST \ --url https://api.menta.global/api/v1/users/set-password \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "email": "string", "password": "string", "user_type": "string" }' ``` **204** Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Validation error occurred" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Unauthorized" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "User not found" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/users_post_changepassword #### Usuarios # Cambiar contraseña ### `POST /v1/users/change-password` Permite cambiar la contraseña actual de un usuario por una nueva. La nueva contraseña se fija como permanente y se elimina el estado de cambio pendiente. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `email` | string | El email del usuario al cual se quiere cambiar la contraseña | | `old_password` | string | La contraseña del usuario a cambiar | | `new_password` | string | La contraseña nueva que reemplazará a la actual | > Este endpoint no requiere el header `Authorization`. Si el email no existe, la respuesta es `404`. ```bash curl --location --request POST 'https://api.menta.global/api/v1/users/change-password' \ --header 'Content-Type: application/json' \ --data-raw '{ "email": "string", "old_password":"string", "new_password": "string" }' ``` **204** Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Validation error occurred" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "User not found" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/merchants_getall #### Comercios # Listar comercios ### `GET /v1/merchants` Este endpoint permite obtener los comercios asociados a un cliente. Disponible con credenciales `CUSTOMER`; con credenciales `MERCHANT` la respuesta es `403`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` (opcional) | integer | El número de la página de resultados a obtener (si solo se envía size, por defecto es 0) | | `size` (opcional) | integer | El número de resultados por página (si solo se envía page, por defecto es 10). | | `id` (opcional) | array | Filtra por uno o más identificadores de comercio | | `status` (opcional) | array | Filtra por uno o más estados (si no es enviado, por defecto son ENABLED, DISABLED e INCOMPLETE; los comercios DELETED se excluyen salvo que se pidan)
Valores: [ENABLED, DISABLED, DELETED, INCOMPLETE] | | `country` (opcional) | string | Filtra por país | | `createDate` (opcional) | string | Filtra por fecha de creación | | `hint` (opcional) | string | Filtra por nombre de fantasía (expresión regular) | | `pendingStep` (opcional) | string | Filtra por paso pendiente de configuración | > - Los nombres de los parámetros de consulta van en camelCase. > - Si no se envía ni `page` ni `size`, la respuesta devuelve todos los comercios que coinciden, sin paginar y ordenados por nombre de fantasía. > - Los campos sin valor se omiten de cada comercio (`business_name`, `fantasy_name`, `representative`, `address.floor`, `address.apartment`, `address.neighborhood`, `address.location`, `additional_info`, `pending_steps`, `update_date` y `delete_date`). > - Cada comercio incluye `_links.self`; la respuesta también incluye enlaces a nivel de página. ```bash curl --request GET \ --url https://api.menta.global/api/v1/merchants \ --header 'Authorization: Bearer {access_token}' \ --url-query 'page=integer' \ --url-query 'size=integer' ``` **200** ```json { "_embedded": { "merchants": [ { "id": "string", "customer_id": "string", "country": "string", "status": "string", "legal_type": "string", "business_name": "string", "fantasy_name": "string", "representative": { "type": "string", "representative_id": { "type": "string", "number": "string" }, "birth_date": "2019-08-24T14:15:22Z", "name": "string", "surname": "string" }, "merchant_code": "string", "address": { "state": "string", "city": "string", "zip": "string", "street": "string", "number": "string", "floor": "string", "apartment": "string", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } }, "email": "string", "phone": "string", "activity": "string", "category": "string", "tax": { "id": "string", "type": "string" }, "additional_info": "string", "pending_steps": ["string"], "create_date": "2019-08-24T14:15:22Z", "update_date": "2019-08-24T14:15:22Z", "delete_date": "2019-08-24T14:15:22Z", "_links": { "self": { "href": "string" } } } ] }, "page": { "size": 0, "total_elements": 0, "total_pages": 0, "number": 0 } } ``` **403** `403`: Forbidden ```json { "status_code": 403, "message": "Access is denied" } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` El mismo error se devuelve ante un valor inválido en `status` o en un identificador. --- Fuente: /api_reference/merchants_get #### Comercios # Obtener comercio ### `GET /v1/merchants/{merchant_id}` Este endpoint permite obtener datos de un comercio específico. Disponible con credenciales `CUSTOMER`; con credenciales `MERCHANT` la respuesta es `403`. > - Los campos sin valor se omiten de la respuesta (`business_name`, `fantasy_name`, `representative`, `address.floor`, `address.apartment`, `address.neighborhood`, `address.location`, `additional_info`, `pending_steps`, `update_date` y `delete_date`). > - `status` puede ser `ENABLED`, `DISABLED`, `DELETED` o `INCOMPLETE`. Un comercio creado con la versión 2 queda en `INCOMPLETE` con `pending_steps` `ACQUIRER` y `PAYMENT_PLAN` hasta completar la configuración. > - Un comercio eliminado responde `404`. ```bash curl --request GET \ --url https://api.menta.global/api/v1/merchants/{merchant_id} \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json { "id": "string", "customer_id": "string", "country": "string", "status": "string", "legal_type": "string", "business_name": "string", "fantasy_name": "string", "representative": { "type": "string", "representative_id": { "type": "string", "number": "string" }, "birth_date": "2019-08-24T14:15:22Z", "name": "string", "surname": "string" }, "merchant_code": "string", "address": { "state": "string", "city": "string", "zip": "string", "street": "string", "number": "string", "floor": "string", "apartment": "string", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } }, "email": "string", "phone": "string", "activity": "string", "category": "string", "tax": { "id": "string", "type": "string" }, "additional_info": "string", "pending_steps": ["string"], "create_date": "2019-08-24T14:15:22Z", "update_date": "2019-08-24T14:15:22Z", "delete_date": "2019-08-24T14:15:22Z", "_links": { "self": { "href": "string" } } } ``` **403** `403`: Forbidden ```json { "status_code": 403, "message": "Access is denied" } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "101", "message": "merchant with id not found" } ] } ``` El comercio eliminado responde con el código `102` y el mensaje `merchant with id is deleted`. **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/merchants_post_create_v2 #### Comercios # Crear Comercio ### `POST /v2/merchants` Este endpoint permite crear un comercio asociado a un cliente. Disponible con credenciales `CUSTOMER`. La respuesta exitosa es `201`. > - El objeto `financial_info.account_info.account_type` es opcional; si se envía, se envían `code` y `type`. > - El comercio se crea con estado `INCOMPLETE` y `pending_steps` `ACQUIRER` y `PAYMENT_PLAN` hasta completar la configuración. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `customer_id` | string | Identificador del cliente al cual pertenecerá el comercio | | `country` | string | País del comercio
Valores: [ARG,MEX] | | `legal_type` | string | Si es persona física/moral cargar NATURAL_PERSON, si es una entidad jurídica seleccionar LEGAL_ENTITY
Valores: [NATURAL_PERSON,LEGAL_ENTITY] | | `business_name` | string | Nombre comercial del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-60 (MEX) | | `fantasy_name` | string | Nombre de fantasía del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-18 (MEX) | | `additional_info` (opcional) | string | Información adicional que se le puede agregar al comercio | | `address.state` | string | Provincia/Estado (Listado de provincias/estados) | | `address.city` | string | Ciudad
Validaciones:
- Alfanumérico
- Min/Max: 1-30 (ARG) / 1-18 (MEX) | | `address.zip` | string | Código postal
Validaciones:
- Alfanumérico
- Min/Max: 8-8 (ARG) / 5-10 (MEX) | | `address.street` | string | Calle
Validaciones:
- Alfanumérico
- Min: 1 | | `address.number` | string | Número de calle
Validaciones:
- Numérico
- Min/Max: 1-10 (ARG) / 1-6 (MEX) | | `address.floor` (opcional) | string | Piso del departamento | | `address.apartment` (opcional) | string | Departamento | | `address.neighborhood` (opcional) | string | Barrio/Colonia dependiendo del país | | `address.location` (opcional) | object | Coordenadas geográficas del comercio. Si se envía, deben incluirse lat y lng. Pueden obtenerse con [geocodificación](/api_reference/merchants_post_addresses_geocode). | | `address.location.lat` | number | Latitud | | `address.location.lng` | number | Longitud | | `tax_identification.type` | string | Tipo de documento del comercio
Valores: [CUIT(ARG),RFC(MEX)] | | `tax_identification.number` | string | Número de documento del comercio
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.type` | string | Tipo de representante
Valores: [PRESIDENT, PROXY, OTHER] | | `representative.name` | string | Nombre del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.surname` | string | Apellido del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.identification.type` | string | Tipo de documento del representante
Valores: [CUIT(ARG),RFC(MEX)] | | `representative.identification.number` | string | Número de documento del representante
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.email` | string | Email del representante
Validaciones:
- Email válido
- Min/Max: 1-100 | | `representative.phone` | string | Teléfono del representante
Validaciones:
- Teléfono válido
- Min/Max: 1-20 | | `financial_info.tax_condition` | string | Condición impositiva del comercio
Valores: [RESPONSABLE_INSCRIPTO, HABITUALISTA, NO_INSCRIPTO, MONOTRIBUTISTA, EXENTO, NO_CATEGORIZADO, CATEGORIZADO] | | `financial_info.account_info.cbu_or_cvu` | string | Número de CBU/CVU(ARG), CLAVE(MEX)
Validaciones:
- Numérico
- Min/Max: 22-22 (ARG) / 18-18 (MEX) | | `financial_info.account_info.account_type.code` | string | Código de tipo de cuenta. Se envía junto con `type` cuando se incluye account_type
Valores: [01 (Caja de Ahorro), 02 (Cuenta Corriente)] | | `financial_info.account_info.account_type.type` | string | Tipo de cuenta. Se envía tal cual figura en los valores (ej. Cuenta Corriente); otro formato devuelve 400
Valores: [Caja de Ahorro, Cuenta Corriente] | > Estos datos son provistos por el adquiriente al momento de dar de alta un > comercio en su plataforma ### Provincias/Estados **Provincias argentinas 🇦🇷** - BUENOS_AIRES - CATAMARCA - CHACO - CHUBUT - CAPITAL_FEDERAL - CORRIENTES - CORDOBA - ENTRE_RIOS - FORMOSA - JUJUY - LA_PAMPA - LA_RIOJA - MENDOZA - MISIONES - NEUQUEN - RIO_NEGRO - SALTA - SAN_JUAN - SAN_LUIS - SANTA_CRUZ - SANTA_FE - SANTIAGO_DEL_ESTERO - TIERRA_DEL_FUEGO - TUCUMAN **Estados de México 🇲🇽** - AGUASCALIENTES - BAJA_CALIFORNIA - BAJA_CALIFORNIA_SUR - CAMPECHE - COAHUILA - COLIMA - CHIAPAS - CHIHUAHUA - DURANGO - DISTRITO_FEDERAL - GUANAJUATO - GUERRERO - HIDALGO - JALISCO - MEXICO - MICHOACAN - MORELOS - NAYARIT - NUEVO_LEON - OAXACA - PUEBLA - QUERETARO - QUINTANA_ROO - SAN_LUIS_POTOSI - SINALOA - SONORA - TABASCO - TAMAULIPAS - TLAXCALA - VERACRUZ - YUCATAN - ZACATECAS ```bash curl --request POST \ --url https://api.menta.global/api/v2/merchants \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "customer_id": "string", "country": "string", "legal_type": "string", "business_name": "string", "fantasy_name": "string", "address":{ "state": "string", "city": "string", "zip": "string", "street": "string", "number": "string", "floor": "string", "apartment": "string", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } }, "tax_identification":{ "type": "string", "number": "string" }, "representative":{ "type": "string", "name": "string", "surname": "string", "identification":{ "type": "string", "number": "string" }, "email": "string", "phone": "string" }, "financial_info":{ "tax_condition": "string", "account_info":{ "cbu_or_cvu": "string", "account_type":{ "code": "string", "type": "string" } } } }' ``` **201** ```json { "merchant_id": "string" } ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "address.state invalid" } ] } ``` El mensaje depende de la validación que falle, por ejemplo `field must be present`, `legalType invalid`, `. invalid pattern` o `Unknown account type: `. **403** `403`: Forbidden ```json { "status_code": 403, "message": "Access is denied" } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/merchants_post_addresses_geocode #### Comercios # Geocodificar dirección ### `POST /v1/addresses/geocode` Este endpoint permite obtener las coordenadas geográficas (`lat` y `lng`) a partir de los datos de domicilio. No se debe enviar `location` en el request. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `state` | string | Provincia/Estado | | `city` | string | Ciudad | | `zip` | string | Código postal | | `street` | string | Calle | | `number` | string | Número de calle | | `floor` (opcional) | string | Piso del departamento | | `apartment` (opcional) | string | Departamento | | `neighborhood` (opcional) | string | Barrio. Se devuelve en la respuesta cuando se envía | > El objeto `location` devuelto puede utilizarse en [Crear comercio](/api_reference/merchants_post_create_v2) o en las actualizaciones de comercio. ### Provincias/Estados Listado de referencia para la creación de comercios. **Provincias argentinas 🇦🇷** - BUENOS_AIRES - CATAMARCA - CHACO - CHUBUT - CAPITAL_FEDERAL - CORRIENTES - CORDOBA - ENTRE_RIOS - FORMOSA - JUJUY - LA_PAMPA - LA_RIOJA - MENDOZA - MISIONES - NEUQUEN - RIO_NEGRO - SALTA - SAN_JUAN - SAN_LUIS - SANTA_CRUZ - SANTA_FE - SANTIAGO_DEL_ESTERO - TIERRA_DEL_FUEGO - TUCUMAN **Estados mexicanos 🇲🇽** - AGUASCALIENTES - BAJA_CALIFORNIA - BAJA_CALIFORNIA_SUR - CAMPECHE - COAHUILA - COLIMA - CHIAPAS - CHIHUAHUA - DURANGO - DISTRITO_FEDERAL - GUANAJUATO - GUERRERO - HIDALGO - JALISCO - MEXICO - MICHOACAN - MORELOS - NAYARIT - NUEVO_LEON - OAXACA - PUEBLA - QUERETARO - QUINTANA_ROO - SAN_LUIS_POTOSI - SINALOA - SONORA - TABASCO - TAMAULIPAS - TLAXCALA - VERACRUZ - YUCATAN - ZACATECAS ```bash curl --request POST \ --url https://api.menta.global/api/v1/addresses/geocode \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "state": "CAPITAL_FEDERAL", "city": "CABA", "zip": "1414", "street": "Av. Corrientes", "number": "1234", "floor": "3", "apartment": "B" }' ``` **200** ```json { "state": "CAPITAL_FEDERAL", "city": "CABA", "zip": "1414", "street": "Av. Corrientes", "number": "1234", "floor": "3", "apartment": "B", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "No location found for address" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/merchants_put #### Comercios # Actualizar comercio ### `PUT /v2/merchants/{merchant_id}` Este endpoint permite modificar un comercio asociado a un cliente. > En `PUT` se debe enviar el objeto completo del comercio. Aunque solo quieras > cambiar un campo, el request debe incluir todos los campos esperados para la > actualización. > - Un usuario `CUSTOMER` que modifique `legal_type`, `business_name`, `fantasy_name`, `email`, `phone`, el documento fiscal o los datos del representante recibe `403` si el cliente no tiene habilitada la edición de datos sensibles. Un comercio inexistente responde `404`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `legal_type` | string | Si es persona física/moral cargar NATURAL_PERSON, si es una entidad jurídica seleccionar LEGAL_ENTITY
Valores: [NATURAL_PERSON,LEGAL_ENTITY] | | `business_name` | string | Nombre comercial del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-60 (MEX) | | `fantasy_name` | string | Nombre de fantasía del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-18 (MEX) | | `additional_info` (opcional) | string | Información adicional que se le puede agregar al comercio | | `address.state` | string | Provincia/Estado (Listado de provincias/estados) | | `address.city` | string | Ciudad
Validaciones:
- Alfanumérico
- Min/Max: 1-30 (ARG) / 1-18 (MEX) | | `address.zip` | string | Código postal
Validaciones:
- Alfanumérico
- Min/Max: 8-8 (ARG) / 5-10 (MEX) | | `address.street` | string | Calle
Validaciones:
- Alfanumérico
- Min: 1 | | `address.number` | string | Número de calle
Validaciones:
- Numérico
- Min/Max: 1-10 (ARG) / 1-6 (MEX) | | `address.floor` (opcional) | string | Piso del departamento | | `address.apartment` (opcional) | string | Departamento | | `address.neighborhood` (opcional) | string | Barrio/Colonia dependiendo del país | | `address.location` (opcional) | object | Coordenadas geográficas del comercio. Si se envía, deben incluirse lat y lng. | | `address.location.lat` | number | Latitud (ej. valor obtenido desde Google Maps u otro servicio de geolocalización) | | `address.location.lng` | number | Longitud (ej. valor obtenido desde Google Maps u otro servicio de geolocalización) | | `tax_identification.type` | string | Tipo de documento del comercio
Valores: [CUIT(ARG),RFC(MEX)] | | `tax_identification.number` | string | Número de documento del comercio
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.type` | string | Tipo de representante
Valores: [PRESIDENT, PROXY, OTHER] | | `representative.name` | string | Nombre del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.surname` | string | Apellido del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.identification.type` | string | Tipo de documento del representante
Valores: [CUIT(ARG),RFC(MEX)] | | `representative.identification.number` | string | Número de documento del representante
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.email` | string | Email del representante
Validaciones:
- Email válido
- Min/Max: 1-100 | | `representative.phone` | string | Teléfono del representante
Validaciones:
- Teléfono válido
- Min/Max: 1-20 | | `financial_info.tax_condition` | string | Condición impositiva del comercio
Valores: [RESPONSABLE_INSCRIPTO, HABITUALISTA, NO_INSCRIPTO, MONOTRIBUTISTA, EXENTO, NO_CATEGORIZADO, CATEGORIZADO] | | `financial_info.account_info.cbu_or_cvu` | string | Número de CBU/CVU(ARG), CLAVE(MEX)
Validaciones:
- Numérico
- Min/Max: 22-22 (ARG) / 18-18 (MEX) | | `financial_info.account_info.account_type.code` | string | Código de tipo de cuenta
Valores: [01 (Caja de Ahorro), 02 (Cuenta Corriente)] | | `financial_info.account_info.account_type.type` | string | Tipo de cuenta
Valores: [Caja de Ahorro, Cuenta Corriente] | ### Provincias/Estados **Provincias argentinas 🇦🇷** - BUENOS_AIRES - CATAMARCA - CHACO - CHUBUT - CAPITAL_FEDERAL - CORRIENTES - CORDOBA - ENTRE_RIOS - FORMOSA - JUJUY - LA_PAMPA - LA_RIOJA - MENDOZA - MISIONES - NEUQUEN - RIO_NEGRO - SALTA - SAN_JUAN - SAN_LUIS - SANTA_CRUZ - SANTA_FE - SANTIAGO_DEL_ESTERO - TIERRA_DEL_FUEGO - TUCUMAN **Estados de México 🇲🇽** - AGUASCALIENTES - BAJA_CALIFORNIA - BAJA_CALIFORNIA_SUR - CAMPECHE - COAHUILA - COLIMA - CHIAPAS - CHIHUAHUA - DURANGO - DISTRITO_FEDERAL - GUANAJUATO - GUERRERO - HIDALGO - JALISCO - MEXICO - MICHOACAN - MORELOS - NAYARIT - NUEVO_LEON - OAXACA - PUEBLA - QUERETARO - QUINTANA_ROO - SAN_LUIS_POTOSI - SINALOA - SONORA - TABASCO - TAMAULIPAS - TLAXCALA - VERACRUZ - YUCATAN - ZACATECAS ```bash curl --request PUT \ --url https://api.menta.global/api/v2/merchants/{merchant_id} \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "legal_type": "string", "business_name": "string", "fantasy_name": "string", "address":{ "state": "string", "city": "string", "zip": "string", "street": "string", "number": "string", "floor": "string", "apartment": "string", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } }, "tax_identification":{ "type": "string", "number": "string" }, "representative":{ "type": "string", "name": "string", "surname": "string", "identification":{ "type": "string", "number": "string" }, "email": "string", "phone": "string" }, "financial_info":{ "tax_condition": "string", "account_info":{ "cbu_or_cvu": "string", "account_type":{ "code": "string", "type": "string" } } } }' ``` **200** ```json { "merchant_id": "string" } ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "address.state invalid" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "EDIT_SENSITIVE_MERCHANT_DATA feature is not enabled for customerId " } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "merchant id: not found" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/merchants_patch #### Comercios # Actualizar datos ### `PATCH /v2/merchants/{merchant_id}` Este endpoint permite modificar un comercio asociado a un cliente. > En `PATCH` los campos son parciales/nulleables: solo envía los datos que > quieres actualizar. Los campos no enviados no se modifican. Todos los campos son opcionales. > - Si se envía `address.location`, deben incluirse `lat` y `lng`; de lo contrario la respuesta es `400` con el mensaje `lat and lng are both required when location is provided`. > - Un usuario `CUSTOMER` que modifique `legal_type`, `business_name`, `fantasy_name`, `email`, `phone`, el documento fiscal o los datos del representante recibe `403` si el cliente no tiene habilitada la edición de datos sensibles. Un comercio inexistente responde `404`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `legal_type` (opcional) | string | Si es persona física/moral cargar NATURAL_PERSON, si es una entidad jurídica seleccionar LEGAL_ENTITY
Valores: [NATURAL_PERSON,LEGAL_ENTITY] | | `business_name` (opcional) | string | Nombre comercial del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-60 (MEX) | | `fantasy_name` (opcional) | string | Nombre de fantasía del comercio
Validaciones:
- Alfanumérico
- Min/Max: 1-50 (ARG) / 1-18 (MEX) | | `additional_info` (opcional) | string | Información adicional que se le puede agregar al comercio | | `address.state` (opcional) | string | Provincia/Estado (Listado de provincias/estados) | | `address.city` (opcional) | string | Ciudad
Validaciones:
- Alfanumérico
- Min/Max: 1-30 (ARG) / 1-18 (MEX) | | `address.zip` (opcional) | string | Código postal
Validaciones:
- Alfanumérico
- Min/Max: 8-8 (ARG) / 5-10 (MEX) | | `address.street` (opcional) | string | Calle
Validaciones:
- Alfanumérico
- Min: 1 | | `address.number` (opcional) | string | Número de calle
Validaciones:
- Numérico
- Min/Max: 1-10 (ARG) / 1-6 (MEX) | | `address.floor` (opcional) | string | Piso del departamento | | `address.apartment` (opcional) | string | Departamento | | `address.neighborhood` (opcional) | string | Barrio/Colonia dependiendo del país | | `address.location` (opcional) | object | Coordenadas geográficas del comercio. Si se envía, deben incluirse lat y lng. | | `address.location.lat` (opcional) | number | Latitud (ej. valor obtenido desde Google Maps u otro servicio de geolocalización). Se envía junto con `lng` cuando se incluye `location` | | `address.location.lng` (opcional) | number | Longitud (ej. valor obtenido desde Google Maps u otro servicio de geolocalización). Se envía junto con `lat` cuando se incluye `location` | | `tax_identification.type` (opcional) | string | Tipo de documento del comercio
Valores: [CUIT(ARG),RFC(MEX)] | | `tax_identification.number` (opcional) | string | Número de documento del comercio
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.type` (opcional) | string | Tipo de representante
Valores: [PRESIDENT, PROXY, OTHER] | | `representative.name` (opcional) | string | Nombre del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.surname` (opcional) | string | Apellido del representante
Validaciones:
- Alfabético
- Min/Max: 1-30 (ARG) / 1-20 (MEX) | | `representative.identification.type` (opcional) | string | Tipo de documento del representante
Valores: [CUIT(ARG),RFC(MEX)] | | `representative.identification.number` (opcional) | string | Número de documento del representante
Validaciones:
- Numérico
- Min/Max: 11-11 (ARG) / 1-15 (MEX) | | `representative.email` (opcional) | string | Email del representante
Validaciones:
- Email válido
- Min/Max: 1-100 | | `representative.phone` (opcional) | string | Teléfono del representante
Validaciones:
- Teléfono válido
- Min/Max: 1-20 | | `financial_info.tax_condition` (opcional) | string | Condición impositiva del comercio
Valores: [RESPONSABLE_INSCRIPTO, HABITUALISTA, NO_INSCRIPTO, MONOTRIBUTISTA, EXENTO, NO_CATEGORIZADO, CATEGORIZADO] | | `financial_info.account_info.cbu_or_cvu` (opcional) | string | Número de CBU/CVU(ARG), CLAVE(MEX)
Validaciones:
- Numérico
- Min/Max: 22-22 (ARG) / 18-18 (MEX) | | `financial_info.account_info.account_type.code` (opcional) | string | Código de tipo de cuenta
Valores: [01 (Caja de Ahorro), 02 (Cuenta Corriente)] | | `financial_info.account_info.account_type.type` (opcional) | string | Tipo de cuenta
Valores: [Caja de Ahorro, Cuenta Corriente] | ### Provincias/Estados **Provincias argentinas 🇦🇷** - BUENOS_AIRES - CATAMARCA - CHACO - CHUBUT - CAPITAL_FEDERAL - CORRIENTES - CORDOBA - ENTRE_RIOS - FORMOSA - JUJUY - LA_PAMPA - LA_RIOJA - MENDOZA - MISIONES - NEUQUEN - RIO_NEGRO - SALTA - SAN_JUAN - SAN_LUIS - SANTA_CRUZ - SANTA_FE - SANTIAGO_DEL_ESTERO - TIERRA_DEL_FUEGO - TUCUMAN **Estados de México 🇲🇽** - AGUASCALIENTES - BAJA_CALIFORNIA - BAJA_CALIFORNIA_SUR - CAMPECHE - COAHUILA - COLIMA - CHIAPAS - CHIHUAHUA - DURANGO - DISTRITO_FEDERAL - GUANAJUATO - GUERRERO - HIDALGO - JALISCO - MEXICO - MICHOACAN - MORELOS - NAYARIT - NUEVO_LEON - OAXACA - PUEBLA - QUERETARO - QUINTANA_ROO - SAN_LUIS_POTOSI - SINALOA - SONORA - TABASCO - TAMAULIPAS - TLAXCALA - VERACRUZ - YUCATAN - ZACATECAS ```bash curl --request PATCH \ --url https://api.menta.global/api/v2/merchants/{merchant_id} \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "legal_type": "string", "business_name": "string", "fantasy_name": "string", "address":{ "state": "string", "city": "string", "zip": "string", "street": "string", "number": "string", "floor": "string", "apartment": "string", "neighborhood": "string", "location": { "lat": -34.603722, "lng": -58.381592 } }, "tax_identification":{ "type": "string", "number": "string" }, "representative":{ "type": "string", "name": "string", "surname": "string", "identification":{ "type": "string", "number": "string" }, "email": "string", "phone": "string" }, "financial_info":{ "tax_condition": "string", "account_info":{ "cbu_or_cvu": "string", "account_type":{ "code": "string", "type": "string" } } } }' ``` **200** ```json { "merchant_id": "string" } ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "lat and lng are both required when location is provided" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "EDIT_SENSITIVE_MERCHANT_DATA feature is not enabled for customerId " } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "merchant id: not found" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/merchants_patch_setstatus #### Comercios # Actualizar estado ### `PATCH /v1/merchants/{merchant_id}/status/{status}` Cambiar estado del comercio. Disponible con credenciales `CUSTOMER`; con credenciales `MERCHANT` la respuesta es `403`. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchant_id` | string | Identificador del comercio al cual se desea cambiar el estado | | `status` | string | Nuevo estado que se desea para el comercio
Valores: [ENABLED, DISABLED, DELETED] | > - El estado `INCOMPLETE` existe, pero no se puede establecer con este endpoint: la respuesta es `405` con el mensaje `Unexpected status: INCOMPLETE`. > - Al eliminar un comercio (`DELETED`) se aplican las reglas descritas en [Pausar o eliminar comercios](/services/change_merch_status). ```bash curl --request PATCH \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/status/{status} \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' ``` **200** ```json { "id": "string", "country": "string", "customer_id": "string", "status": "string" } ``` **403** `403`: Forbidden ```json { "status_code": 403, "message": "Access is denied" } ``` **405** `405`: Method Not Allowed ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Unexpected status: INCOMPLETE" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error" } ] } ``` --- Fuente: /api_reference/merchants_installments_get #### Comercios # Obtener cuotas disponibles ### `GET /v1/merchants/{merchant_id}/installments/{acq_id}` Este endpoint permite obtener las cuotas disponibles de un comercio específico por adquirencia. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchant_id` | string | Identificador del comercio a consultar | | `acq_id` | string | Identificador del adquirente que se desea consultar
Valores: [GPS, BANORTE, AMEX] | > - Si el comercio no tiene un registro de cuotas, la respuesta es `404`. ```bash curl --request GET \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/installments/{acquirer_id} \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json { "id": "string", "customer_id": "string", "merchant_id": "string", "acquirer": "string", "enabled": "boolean", "data": [ { "brand": "string", "number": "integer", "code": "string", "financing": "string" }, ... ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "installments for merchant with id not found" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/merchants_installments_financing_post #### Comercios # Actualizar plan de cuotas ### `POST /v1/merchants/{merchant_id}/installments/{acquirer_id}/financing/{financing}/{status}` Este endpoint permite modificar el grupo de cuotas perteneciente a un tipo de financiación. - `enabled`: crea el registro de cuotas del comercio si no existe (vacío), obtiene los costos financieros del adquirente y la financiación, y agrega solo las cuotas que aún no están presentes y cuyo `number` es menor a 30. - `disabled`: quita esas cuotas. - Si no existen costos financieros para el adquirente y la financiación, la respuesta es `404`. - La respuesta es `200` con el registro de cuotas completo. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchant_id` | string | Identificador del comercio | | `acquirer_id` | string | Identificador del adquirente que se desea modificar
Valores: [GPS, BANORTE, AMEX] | | `financing` | string | Tipo de financiación a modificar
Valores: [CUOTA_SIMPLE (plan especial regulado), BANK (planes de cuotas estándar del banco/adquirente), TARJETA_NARANJA] | | `status` | string | Estado al cual se desea modificar.
Valores: [enabled, disabled] | > El plan especial regulado disponible es el de Cuota Simple en Argentina (🇦🇷), el cual aplica según las normas vigentes. El servicio también acepta el valor `TARJETA_NARANJA` en `financing`; el valor se envía respetando mayúsculas y minúsculas. ```bash curl --request POST \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/installments/{acquirer_id}/financing/{financing}/{status} \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json { "id": "string", "customer_id": "string", "merchant_id": "string", "acquirer": "string", "enabled": "boolean", "data": [ { "brand": "string", "number": "integer", "code": "string", "financing": "string" }, ... ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Financial Cost not found" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/acquirers_get #### Procesadores # Buscar procesadores ### `GET /v1/acquirers` Este endpoint proporciona el listado de procesadores del cliente. Si se envía `merchantId`, el listado corresponde a ese comercio. #### Datos de consulta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchantId` (opcional) | string | Identificador del comercio. Con este parámetro cada ítem incluye rate_types; sin él, incluye model_types | #### Datos de respuesta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `acquirer_id` | string | Identificador de la adquirencia
Valores: [GPS, PRISMA, PRISMA_QR, BANORTE, AMEX, DEPAY, PROSA, BROXEL, WUZI] | | `country` | string | País del comercio
Valores: [ARG,MEX] | | `enabled` | boolean | Estado de la adquirencia | | `payment_type` | string | Último tipo de pago devuelto por el servicio de configuración (por ejemplo QR para PRISMA_QR)
Valores: [TERMINAL, QR, PAYMENT_LINK] | | `configuration_enabled` | boolean | Esto permite identificar si una adquirencia se encuentra habilitada o no para ser configurada | | `rate_types` (opcional) | list | Tipos de tasas existentes que se pueden configurar para una determinada adquirencia. Solo se incluye cuando se envía merchantId | | `rate_types.rate_type` | string | Tipo de tasa
Valores: [AGGREGATOR, NATURAL] | | `rate_types.is_selected` | boolean | Permite identificar dentro del listado que tipo de tasa es usada por el comercio | | `rate_types.is_configured` | boolean | Permite identificar si el tipo de tasa esta configurada | | `model_types` (opcional) | list | Modelos disponibles para la adquirencia. Solo se incluye cuando no se envía merchantId | | `model_types.model_type` | string | Tipo de modelo
Valores: [AGGREGATOR, PROCESSOR] | | `model_types.is_selected` | boolean | Indica si el modelo es el seleccionado | | `model_types.is_configured` | boolean | Indica si el modelo está configurado | ```bash curl --request GET \ --url 'https://api.menta.global/api/v1/acquirers?merchantId={merchant_id}' \ --header 'Authorization: Bearer {access_token}' ``` **200** ```bash [ { "acquirer_id": "string", "country": "string", "enabled": "boolean", "payment_type": "string", "configuration_enabled": "boolean", "rate_types": [ { "rate_type": "string", "is_selected": "boolean", "is_configured": "boolean" } ] } ] ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/acquirer_get #### Procesadores # Buscar datos requeridos ### `GET /v1/acquirers/merchants` Este endpoint permite obtener la información requerida para registrar un comercio en un procesador específico. #### Datos de consulta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchantId` | string | Identificador del comercio | | `acquirerId` | string | Identificador del procesador
Valores: [GPS, PRISMA, PRISMA_QR, BANORTE, AMEX, DEPAY, PROSA, BROXEL, WUZI] | | `rateType` | string | Tipo de tasa a utilizar
Valores: [AGGREGATOR, NATURAL] | > * **merchantId:** Se obtiene de la [creación de comercios](/api_reference/merchants_post_create_v2) > * **acquirerId y rateType:** Se obtienen de la [búsqueda de procesadores](/api_reference/acquirers_get) #### Datos de respuesta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `acquirer_id` | string | Identificador de la adquirencia
Valores: [GPS, PRISMA, PRISMA_QR, BANORTE, AMEX, DEPAY, PROSA, BROXEL, WUZI] | | `customer_id` | string | Identificador único del cliente al cual estará vinculado el comercio en el sistema | | `merchant_id` | string | Identificador único del comercio que se desea registrar | | `rate_type` | string | Tipo de tasa aplicada a las transacciones del comercio
Valores: [AGGREGATOR, NATURAL] | | `payment_type` | string | Tipo de pago
Valores: [TERMINAL, QR, PAYMENT_LINK] | | `data` | list | Es una lista que contiene los distintos campos necesarios para completar el registro del comercio. Cada campo en data representa un input del formulario, y su estructura es flexible para adaptarse a la complejidad y profundidad de los datos requeridos. | | `data.name` | string | El nombre del campo que se necesita completar. Este nombre ayuda a identificar el propósito de cada campo en el formulario. | | `data.properties` | object | Contiene las propiedades específicas del campo que definen cómo debe mostrarse y comportarse en el formulario. | | `data.properties.type` (opcional) | string | Define el tipo de input, como TEXT (campo de texto), AUTOCOMPLETE (sugerencia automática), SELECT (menú desplegable), OBJECT (estructura compleja que contiene otros inputs), MULTISELECT (selección múltiple, usa properties.values) y LIST
Valores: [TEXT, AUTOCOMPLETE, SELECT, OBJECT, MULTISELECT, LIST] | | `data.properties.title` (opcional) | string | El título o etiqueta que describe el campo en el formulario. | | `data.properties.description` (opcional) | string | Una breve descripción del campo, que puede usarse como una pista para el usuario. | | `data.properties.validations` (opcional) | object | Validaciones que se aplican al input | | `data.properties.validations.required` | boolean | Indica si el campo es obligatorio (true) o no (false) | | `data.properties.href` (opcional) | string | URL donde se puede obtener información adicional para completar el campo. Por ejemplo, una lista de actividades o tipos de documentos en formato KEY/VALUE. | | `data.properties.hidden` (opcional) | boolean | Indica si el campo debe estar oculto en el formulario (true) o visible (false). | | `data.properties.value` (opcional) | string | Valor predefinido del campo. Si no está presente, significa que el input aún no tiene un valor asignado. | | `data.properties.data` (opcional) | list | Contiene campos adicionales cuando el tipo de input es OBJECT, permitiendo la recursión en la estructura. Esto se utiliza cuando se necesita un conjunto de inputs anidados. Cada input dentro de properties.data sigue la misma estructura recursiva, permitiendo formularios de múltiples niveles de profundidad. | | `data.properties.options` (opcional) | list | Lista de opciones en formato KEY/VALUE para campos de tipo SELECT o AUTOCOMPLETE | | `data.properties.values` (opcional) | list | Lista de valores seleccionados para campos de tipo MULTISELECT | | `data.properties.readonly` (opcional) | boolean | Indica que el campo es de solo lectura. No debe enviarse al registrar el comercio | ```bash curl --request GET \ --url 'https://api.menta.global/api/v1/acquirers/merchants?merchantId={merchant_id}&acquirerId={acquirer_id}&rateType={rate_type}' \ --header 'Authorization: Bearer {access_token}' ``` **200** ```bash { "acquirer_id": "string", "customer_id": "string", "merchant_id": "string", "rate_type": "string", "payment_type": "string", "data": [ { "name": "string", "properties": { "type": "string", "title": "string", "description": "string", "validations": { "required": "boolean" }, "href": "string", "hidden": "boolean", "value": "string", "data": "list", "options": "list" } } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/acquirer_post #### Procesadores # Dar de alta procesador ### `POST /v1/acquirers/merchants` Este endpoint permite almacenar la información necesaria para registrar un comercio en un procesador específico. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `acquirer_id` | string | Identificador de la adquirencia
Valores: [GPS, PRISMA, PRISMA_QR, BANORTE, AMEX, DEPAY, PROSA, BROXEL, WUZI] | | `customer_id` | string | Identificador único del cliente al cual estará vinculado el comercio en el sistema | | `merchant_id` | string | Identificador único del comercio que se desea registrar | | `rate_type` | string | Tipo de tasa aplicada a las transacciones del comercio
Valores: [AGGREGATOR, NATURAL] | | `payment_type` (opcional) | string | Tipo de pago. Si se omite, el valor por defecto es TERMINAL
Valores: [TERMINAL, QR, PAYMENT_LINK] | | `data` | list | Es una lista que contiene los distintos campos necesarios para completar el registro del comercio. Cada campo en data representa un input del formulario, y su estructura es flexible para adaptarse a la complejidad y profundidad de los datos requeridos. | | `data.name` | string | El nombre del campo que se necesita completar. Este nombre ayuda a identificar el propósito de cada campo en el formulario. | | `data.properties` | object | Contiene las propiedades específicas del campo que definen cómo debe mostrarse y comportarse en el formulario. | | `data.properties.type` (opcional) | string | Define el tipo de input, como TEXT (campo de texto), AUTOCOMPLETE (sugerencia automática), SELECT (menú desplegable), OBJECT (estructura compleja que contiene otros inputs), MULTISELECT (selección múltiple, usa properties.values) y LIST
Valores: [TEXT, AUTOCOMPLETE, SELECT, OBJECT, MULTISELECT, LIST] | | `data.properties.title` (opcional) | string | El título o etiqueta que describe el campo en el formulario. | | `data.properties.description` (opcional) | string | Una breve descripción del campo, que puede usarse como una pista para el usuario. | | `data.properties.validations` (opcional) | object | Validaciones que se aplican al input | | `data.properties.validations.required` | boolean | Indica si el campo es obligatorio (true) o no (false) | | `data.properties.href` (opcional) | string | URL donde se puede obtener información adicional para completar el campo. Por ejemplo, una lista de actividades o tipos de documentos en formato KEY/VALUE. | | `data.properties.hidden` (opcional) | boolean | Indica si el campo debe estar oculto en el formulario (true) o visible (false). | | `data.properties.value` (opcional) | string | Valor predefinido del campo. Si no está presente, significa que el input aún no tiene un valor asignado. | | `data.properties.data` (opcional) | list | Contiene campos adicionales cuando el tipo de input es OBJECT, permitiendo la recursión en la estructura. Esto se utiliza cuando se necesita un conjunto de inputs anidados. Cada input dentro de properties.data sigue la misma estructura recursiva, permitiendo formularios de múltiples niveles de profundidad. | | `data.properties.options` (opcional) | list | Lista de opciones en formato KEY/VALUE para campos de tipo SELECT o AUTOCOMPLETE | | `data.properties.values` (opcional) | list | Lista de valores seleccionados para campos de tipo MULTISELECT | | `data.properties.readonly` (opcional) | boolean | Indica que el campo es de solo lectura. No debe enviarse | > **Advertencia:** La estructura del REQUEST debe adherirse al formato especificado en el RESPONSE obtenido [aquí](/api_reference/acquirer_get), > cumpliendo con un requisito esencial: > > Cada campo de tipo **TEXT** o **SELECT** con **validations.required** configurado en TRUE debe tener un valor en > **properties.value**; en un campo **MULTISELECT** el valor va en **properties.values**. Los campos **AUTOCOMPLETE** y **OBJECT** no se verifican en esta validación. > > La lista **data** debe tener la misma cantidad de entradas y en el mismo orden que el formulario obtenido, sin incluir los campos **readonly**. De lo contrario, la respuesta es `400` con el mensaje `incomplete data form`. ### MCC para procesadores En el request que se genera para el alta de procesadores, el campo llamado **mcc** debe tener uno de los valores que figuran en el listado; de lo contrario la respuesta es `400` con el mensaje `Invalid MCC`. GPS usa el campo **category**. Para PRISMA, los MCC válidos se limitan a los establecimientos configurados del cliente, no a todo el listado. **🇦🇷 GPS** | Actividad | MCC | | ----------- | ----------- | |Miscelaneos y fabricación o venta de productos en general u otras actividades o servicios relacionados al cultivo, cria de ganado, construcción, extracción de minerales|5399| |Actividades especializadas de construcción n.c.p.|5718| |Ama de casa, Estudiante, Jubilado , sin Actividad Economica|7299| |Venta, fabricación, mantenimiento y reparación de motores, turbinas, y motocicletas|5571| |Alquiler de equipo de transporte para vía acuática, sin operarios ni tripulación|4457| |Alquiler de maquinaria y equipo de construcción e ingeniería civil|7394| |Alquiler de vehículos automotores, camiones y utilitarios|7513| |Alquiler de videos y video juegos|7994| |Caza y repoblación de animales de caza|5948| |Servicios de espectáculos artísticos, obras teatrales, musicales y artísticas|5970| |Confección de prendas de vestir n.c.p., excepto prendas de piel, cuero y de punto|7251| |Venta, instalación y reparación de articulosde electricos e iluminación|1740| |Venta, cultivo y producción de semillas de hortalizas y legumbres, flores y plantas ornamentales y árboles frutales o artificiales|5992| |Venta y elaboracion de cigarrillos y productos de tabaco|5993| |Producción y distribución de filmes y videocintas|7829| |Edición de libros, folletos, y otras publicaciones|5192| |Venta y elaboración de comidas preparadas, productos de almacen y dietética|5411| |Fabricación de artículos de cemento, fibrocemento y yeso excepto hormigón y mosaicos|1771| |Enseñanza de gimnasia, deportes y actividades físicas, servicios de practica deportiva|7941| |Enseñanza inicial, jardín de infantes, primaria y secundaria|8211| |Enseñanza artística, idiomas y cursos de informática|8220| |Enseñanza terciaria|8244| |Enseñanza universitaria excepto formación de posgrado|8299| |Explotación de criaderos de peces, granjas piscícolas y otros frutos acuáticos (acuicultura)|7998| |Fabricación, curtido, confección y terminación de artículos de cueros y prendas de vestir|5948| |Fabricación de aparatos y accesorios para fotografía excepto películas, placas y papeles sensibles|7395| |Venta y fabricación de artículos de papel y cartón de uso doméstico e higiénico sanitario|5111| |Venta de bicicletas y rodados similares|5940| |Venta y fabricación de relojería, bijouterie, joyas finas y artículos conexos|5944| |Venta, fabricación y reparacion de calzado de cuero, deportivo y marroquineria|5661| |Venta, fabricación e instalacion de carpintería metalica y productos de madera|1750| |Fabricación de carrocerías para vehículos automotores, fabricación de remolques y semirremolques|7549| |Venta e instalación de articulos de cocina, sanitarios, plomería y climatización|1711| |Fabricación de cosméticos, perfumes y productos de higiene y tocador|5977| |Fabricación de equipo médico y quirúrgico y de aparatos ortopédicos n.c.p.|5976| |Venta, alquiler y fabricacion de maquinaria y equipo de oficina, incluso informáticos|5045| |Fabricación y producción de hilados textiles de lana, pelos y sus mezclass|5949| |Fabricación de hojas de madera para enchapado, fabricación de tableros contrachapados, tableros laminados, tableros de partículas y tableros y paneles n.c.p.|7531| |Venta y fabricación de revestimientos, hornos, hogares, quemadores, electrodomésticos y equipos de audio|5200| |Fabricación de instrumentos de música|5733| |Fabricación de juegos y juguetes|5945| |Venta y fabricación de medicamentos de uso humano y productos farmacéuticos|5122| |Fabricación de productos metálicos para uso estructural|5051| |Fabricación de relojes|5094| |Fabricación de ventiladores, extractores de aire, aspiradoras y similares|7623| |Fabricación de viviendas prefabricadas de madera|1520| |Fabricación en industrias básicas de productos de hierro y acero n.c.p.|7692| |Impresión y venta de diarios y revistas|5994| |Venta de artículos de librería y papelería, maquinas y equipamiento para impresiones graficas|2741| |Industrias manufactureras n.c.p.|5698| |Inseminación artificial y servicios n.c.p. para mejorar la reproducción de los animales y el rendimiento de sus productos|7338| |Investigación y desarrollo experimental en el campo de las ciencias sociales|8249| |Lavado automático y manual de vehículos automotores|7542| |Lavado y limpieza de artículos de tela, cuero y/o de piel, incluso la limpieza en seco|7217| |Mantenimiento y reparación del motor n.c.p., mecánica integral|5532| |Construcción, reforma y reparación de obras de infraestructura para el transporte|4784| |Pintura y trabajos de decoración|5231| |Pompas fúnebres y servicios conexos|7261| |Procesamiento de datos|7321| |Producción de espectáculos teatrales y musicales|7832| |Servicios de productores y asesores de seguros|6300| |Recolección, transporte, tratamiento y disposición final de residuos|2842| |Reparación de artículos eléctricos y electrónicos de uso doméstico|7622| |Reparación de efectos personales y enseres domésticos n.c.p.|5697| |Venta y reparación de relojes y joyas|7631| |Reparación de tapizados y muebles|7641| |Venta, reparación y mantenimiento de equipos de telefonía y de comunicación|4812| |Reparación y mantenimiento de equipos informáticos|7379| |Venta, reparación y mantenimiento de equipos e instrumentos de uso médico y paramédico|5997| |Alquiler y reparación de maquinaria y equipo agropecuario y forestal|5046| |Venta, reparación y mantenimiento de máquinas y equipo de control y seguridad|5978| |Servicio de correo postal|9402| |Servicio de transporte automotor de cargas n.c.p.|4011| |Servicio de transporte automotor de mercaderías y pasajeros escolares|4131| |Servicio de transporte automotor y ferroviario de pasajeros|4111| |Servicio de transporte automotor urbano y suburbano no regular de pasajeros de oferta libre, excepto mediante taxis y remises, alquiler de autos con chofer y transporte escolar|7512| |Servicio de transporte por gasoductos y oleoductos y venta de gas, carbon y leña|5541| |Servicio de transporte aéreo de cargas y pasajeros|4511| |Servicios conexos a la producción de espectáculos teatrales y musicales|7929| |Servicios de fast food y locales de venta de comidas y bebidas al paso|5814| |Servicios de agencias de ventas de entradas|7922| |Servicios de almacenamiento en cámaras frigoríficas y venta de productos de granja|5422| |Servicios de alojamiento en hoteles, hosterías y residenciales similares, excepto por hora|7011| |Servicios de alquiler, organización y explotación de inmuebles para fiestas, convenciones y otros eventos similares|7991| |Servicios de asociaciones n.c.p.|8675| |Servicios de atención a niños y adolescentes carenciados con alojamiento|8351| |Servicios de atención médica en dispensarios, salitas, vacunatorios y otros locales de atención primaria de la salud|8099| |Servicios de entidades de tarjeta de compra y/o crédito, cajas de prevision social|4829| |Servicios de comercialización de tiempo y espacio publicitario|7311| |Servicios de consulta médica|8011| |Servicios de contabilidad, auditoría y asesoría fiscal|8931| |Servicios de cooperativas cuando realizan varias actividades|0763| |Servicios de desinfección y exterminio de plagas en el ámbito urbano|7342| |Servicios de estaciones terminales de ómnibus y ferroviárias, incluye hangares, garages|7523| |Venta y expendio de bebidas alcohólicas, elaboración de vinos|5813| |Servicios de explotación de infraestructura para el transporte aéreo, derechos de aeropuerto|4582| |Servicios de fotocopiado, preparación de documentos y otros servicios de apoyo de oficina|5044| |Servicios de fotografía|7221| |Servicios de gerenciamiento de empresas e instituciones de salud, servicios de auditoria y medicina legal, servicio de asesoramiento farmacéutico|8062| |Servicios de justicia|8111| |Servicios de limpieza de prendas prestado por tintorerías rápidas|7216| |Servicios de limpieza general de edificios, incluye venta de productos de limpieza|7349| |Servicios de mensajerías.|4215| |Servicios de mudanza|4214| |Servicios de organización, dirección y gestión de prácticas deportivas en clubes|7992| |Servicios de organizaciones políticas|8651| |Servicios de organizaciones religiosas|8661| |Servicios de parques de diversiones, jardines botánicos, zoológicos y de parques nacionales|5261| |Servicios de peluquería|7230| |Ensayos y análisis técnicos, servicios de diagnóstico en laboratorios|8734| |Servicios de recepción de apuestas de quiniela, lotería y similares relacionados a juegos de azar y apuestas|7995| |Servicios de rehabilitación física|8041| |Servicios de restaurantes y cantinas con espectáculo|5812| |Servicios de salones de baile, discotecas y similares|7911| |Servicios de salones de juegos|7933| |Servicios de sistemas de seguridad e investigación|7393| |SServicios de telecomunicaciones|4814| |Producción y servicios de televisión|4899| |Servicios de transporte automotor de pasajeros mediante taxis y remises, alquiler de autos con chofer|4121| |Servicios de tratamiento de belleza, excepto los de peluquería|7298| |Venta comisión o consignación de mercaderías, otros servicios empresariales|5960| |Servicios industriales para la industria confeccionista|7210| |Servicios inmobiliarios realizados a cambio de una retribución o por contrata n.c.p.|7278| |Servicios inmobiliarios realizados por cuenta propia, con bienes urbanos propios o arrendados n.c.p.|5681| |Servicios mayoristas de agencias de viajes|4411| |Servicios minoristas de agencias de viajes|4722| |Servicios odontológicos|8021| |Servicios para la regulación de las actividades sanitarias, educativas, culturales, y restantes servicios sociales, excepto seguridad social obligatoria|7361| |Servicios de arquitectura e ingeniería y servicios conexos de asesoramiento técnico|8911| |Servicios relacionados con la salud humana n.c.p.|8042| |Servicios sociales con o sin alojamiento|8050| |Servicios veterinarios y venta de productos, fabricación de medicamentos de uso veterinario|0742| |Venta al por mayor de abonos, fertilizantes y plaguicidas|5169| |Venta al por mayor y menor de artículos de bazar y menaje|5251| |Venta y fabricación de artículos de ferretería y materiales eléctricos|5065| |Venta y fabricación de equipamiento e instrumentos ópticos, fotografía y sus accesorios|8043| |Venta al por mayor de artículos de uso doméstico o personal n.c.p|5973| |Venta de equipos de audio, video y televisión|7841| |Venta al por mayor de instrumental médico y odontológico y artículos ortopédicos|5047| |Venta de juguetes, artículos de cotillón y juegos de mesa|7296| |Venta de libros, revistas y publicaciones nuevos o usados|5942| |Servicios de jardinería y mantenimiento de espacios verdes y venta de maquinaria o equipos agropecuarios|0780| |Venta y confección de ropa de trabajo, uniformes, guardapolvos, hilados y tejidos|5137| |Venta al por mayor de muebles e instalaciones para la industria, el comercio y oficinas|5021| |Venta y fabricación de colchones, somieres, frazadas, mantas, ponchos, colchas, cobertores, etc.|5712| |Venta al por mayor de partes, piezas y accesorios de vehículos automotores|5533| |Venta de prendas y accesorios de vestir|5691| |Venta de productos cosméticos, de tocador y de perfumería|5912| |Venta y elaboración de leches y productos lácteos|5451| |Venta y fabricación de tapices y alfombras|5714| |Venta, fabricación y distribución de biocombustibles, combustible nuclear, sustancias y materiales radiactivos|5542| |Venta y fabricación de equipo de protección y seguridad, calzado, prendas o accesorios|5139| |Venta al por menor de antigüedades|5932| |Venta y fabricación de cerraduras, herrajes y artículos de ferretería|5085| |Venta al por menor de artículos nuevos n.c.p.|5947| |Venta al por menor de artículos para el hogar y obras de arte|5971| |Venta al por menor de artículos usados, excepto automotores y motocicletas|5931| |Fabricación, aserrado y cepillado de madera implantada, nativa y fabricacion de aberturas y estructuras para construcción|5983| |Fabricación de artículos de deporte|5998| |Venta al por menor de indumentaria deportiva|5655| |Venta al por menor de indumentaria para bebés y niños|5641| |Fabricación de equipo médico y quirúrgico y de aparatos ortopédicos electrónicos y/o eléctricos|5975| |Venta al por menor de materiales de construcción n.c.p.|5039| |Venta y fabricación de sellos, lápices, lapiceras, bolígrafos, sellos y artículos similares para oficinas y artistas|5972| |Venta y elaboración de productos de panadería, confitería y pastas|5462| |Venta al por menor de papel, cartón, materiales de embalaje y artículos de librería|5943| |Venta y fabricación de pinturas, barnices y productos de revestimiento similares, tintas de imprenta y masillas|5198| |Venta al por menor en comercios no especializados, sin predominio de productos alimenticios y bebidas|5309| |Venta de autos, camionetas y utilitarios nuevos y usados|5511| |Venta de vehículos automotores nuevos y usados|5271 **🇦🇷 PRISMA** | MCC | Actividad | | ----------- | ----------- | |742|VETERINARIAS ACUARIOS| |763|COOPERATIVAS AGRICOLAS| |780|JARDINERIA - FLORICULTURA| |1520|VIVIENDAS INDUSTRIALES| |1731|ILUMINACION ARTEFACTOS ACCESOR| |1750|CARPINTERIAS| |1761|TECHOS REPARACION| |1771|TRABAJOS HORMIGON Y CONCRETO| |2741|SERV DE IMPRESIONES-IMPRENTA| |4011|FERROCARRIL| |4111|FERRIES - TRANSPORTE DE PASAJE| |4112|SUBTE\/TRANSP DE PASAJEROS| |4113|TRANSPORTE INTERURBANO| |4119|SERVICIOS DE AMBULANCIAS| |4121|ALQUILER AUTOS CON CHOFER| |4131|EMPRESAS DE TRANSPORTES| |4214|MUDANZAS| |4215|SERVICIOS DE MENSAJERIA| |4225|GRANDES TIENDAS| |4411|STEAMSHIPS AND CRUISE LINES| |4457|BOTES: ALQUILER Y LEASING| |4468|SUMINISTROS Y SERVICIOS MARINO| |4511|LINEAS AEREAS Y DE NAVEGACIO| |4582|AEROPUERTOS PRIVADOS PISTAS AT| |4722|AGENCIAS DE VIAJES Y TURISMO| |4784|AUTOPISTAS Y PEAJES| |4789|ALQUILER DE TAXI AEREO| |4812|EQUIPOS DE TELEFONIA| |4813|RECARGAS| |4814|SERV DE TELECOMUNICACIONES| |4815|VISAPHONE| |4821|SERVICIO DE TELEGRAFO| |4829|PAGO DE TARJETA DE CREDITO| |4830|CAJAS PREVISIONALES| |4899|SERV DE TELEVISION POR CABLE| |4900|EMPRESAS DE SERVICIOS| |5013|SUMINISTROS PARA VEHICULOS| |5021|AMOBLAM OFICINA Y COMERCIAL| |5039|MATER CONSTRUCCION-NO CLASIF| |5044|EQUIP DE OFICINA:FOTOCOPIADO| |5045|INSUMOS INFORMATICOS| |5046|MAQUINARIA AGRICOLA| |5047|INSTRUMENTAL MEDICO DE PRECISI| |5051|METALURGICAS Y FUNDICIONES| |5065|PARTES Y EQUIPAM ELECTRICOS| |5072|FERRETERIAS,ABERTURAS,HERRAJES| |5074|EQUIP Y SUMIN DE PLOMERIA| |5085|FERRETERIAS INDUSTRIALES| |5094|RELOJES, JOYAS, PIEDRAS PREC| |5099|BIENES DURABLES-NO CLASIF| |5111|PAPELERIA Y SUMIN PARA OFIC| |5122|DROGUERIAS| |5131|SEDERIAS, MERCERIAS, RETACER| |5137|UNIFORME E INDUMENTARIA COMERCIAL| |5139|CALZADO PARA UNIFORMES| |5169|FERTILIZANTES Y AGROQUIMICOS| |5172|PETROLEO Y DERIVAD (NO COMB)| |5192|LIBROS Y PUBLIC ESPECIALIZAD| |5193|SUMIN PARA FLORERIAS Y VIVER| |5198|PINTURERIAS| |5200|GRAN TIENDA DE MATERIALES| |5211|MATERIALES PARA LA CONSTRUCCIO| |5231|PINTURERIAS PAPELES PINTADOS| |5251|BAZARES FERRETERIAS| |5261|PARQUES Y JARDINES| |5271|CASAS RODANTES| |5309|TIENDAS LIBRES DE IMPUESTOS| |5310|TIENDAS DE DESCUENTOS| |5311|TIENDAS DEPARTAMENTAL| |5411|ALMACENES SUPERMERCADOS| |5422|FRIGORIFICOS VTA AL PUBLICO| |5451|PRODUCTOS LACTEOS| |5462|PANADERIAS-CONFITERIAS| |5532|GOMERIAS| |5533|ACCESORIOS Y REPUESTOS PARA AU| |5541|ESTACIONES DE SERVICIO-EXCLU| |5571|MOTOS Y BICICLETAS| |5592|CASAS RODANTES MOTORIZADAS| |5598|ARTICULOS PARA CAMPING| |5611|BOUTIQUE HOMBRES| |5641|ROPA INFANTIL| |5651|BOUTIQUE UNISEX| |5655|PRENDAS DEPORTIVAS| |5661|ZAPATERIAS| |5681|PELETERIAS| |5697|SASTRE SURCIDORA MODISTA ARREG| |5698|PELUCAS| |5712|AMOBLAMIENTOS| |5713|COLCHONERIAS| |5714|TAPICERIAS| |5718|CHIMENEAS HOGARES ACCESORIOS| |5719|HOGAR TIENDAS ESPECIALIZADAS| |5811|PROVEEDORES DE ALIMENTOS| |5812|RESTAURANTES| |5813|BARES AMERICANOS CONFITERIAS| |5814|FAST FOOD| |5921|VINOTECAS LICORERIAS| |5931|NEGOCIOS DE MERCADERIA USADA R| |5932|ANTIGUEDADES| |5937|REPRODUCCION DE ANTIGUEDADES| |5940|VTA Y REPARACION DE BICICLETAS| |5941|ARTICULOS PARA DEPORTES| |5942|LIBRERIAS VTA TEXTOS| |5943|LIBRERIAS PAPELERIAS UTILES VA| |5944|JOYERIAS RELOJERIAS| |5945|JUGUETERIAS| |5946|FOTOGRAFIA OPTICAS| |5947|REGALOS| |5948|ARTICULOS DE CUERO| |5949|LANAS TEJIDOS HILADOS| |5960|MARKETING DIRECTO - SEGUROS| |5962|MARKETING DIRECTO - VIAJES E| |5963|VENTAS PUERTA A PUERTA| |5964|COMERCIOS DE CATALOGO| |5965|COM.DE CATALOGO Y VTAS P\/MEN| |5966|COM.DE TELEMERCADEO P\/CORREO| |5967|MARKETING DIRECTO INBOUND E| |5970|ARTE GALERIAS| |5971|CUADROS Y OBJETOS DE ARTE| |5972|FILATELIA| |5973|SANTERIAS| |5975|AUDIFONOS VENTA Y REPARACION| |5976|ORTOPEDIA| |5977|COSMETOLOGIA EQUIPOS| |5978|VENTA DE MAQUINAS DE OFICINA| |5992|FLORERIAS VIVEROS| |5993|TABAQUERIAS| |5994|DIARIOS Y REVISTAS VTAS| |5995|CRIADEROS, PRODUCTOS VARIOS| |5996|CONSTRUCCION DE PILETAS| |5997|AFEITADORAS ELECTRICAS VTA Y S| |5998|TOLDOS, LONAS, MALLAS| |6513|ADM Y ALQ BIENES RAICES| |6540|COMPRA\/RECARGA VALOR ALMACENAD| |7011|HOTELES RESIDENCIALES TEMPORAR| |7012|TIEMPO COMPARTIDO| |7210|LAVADERO AUTOMATICO PRENDAS| |7211|LAVADEROS FAMILIARES| |7216|TINTORERIAS| |7217|LIMPIEZA DE ALFOMBRAS,TAPICERI| |7221|ESTUDIOS FOTOGRAFICOS| |7230|PELUQUERIAS| |7251|CONFECCION Y VENTA DE SOMBRERO| |7261|SERVICIOS FUNEBRES| |7273|SERV SALIDAS Y COMP SOCIAL| |7276|GESTORIAS LIQUIDACION IMPUESTOS| |7278|SERVICIOS DE COMPRA Y SHOPPING| |7296|ALQUILER DE DISFRACES,COTILLON| |7297|SPA \/ CENTROS DE BELLEZA| |7298|INSTITUTOS DE BELLEZA INTEGRAL| |7299|SERVICIOS PERSONALES| |7311|ASESORAMIENTO PUBLICITARIO| |7321|ORG DE INFORMES CREDITICIOS| |7333|ARTICULOS PARA DIBUJO| |7338|SERVICIOS DE REPRODUCCION Y CO| |7339|SERV. DE SECRETARIAS| |7342|SERVICIO DE EXTERMINACION Y DE| |7349|LIMPIEZA Y MANTENIMIENTO| |7361|AGENCIA DE EMPLEO| |7372|SERVICIO DE PROCESAMIENTO DE D| |7375|SERV DE RECUPERACION INFORM| |7379|REPAR Y MANT DE COMPUTADORAS| |7392|CONSULTORA Y RELAC PUBLIC| |7393|AG DE DETECTIVES Y SEGURIDAD| |7394|LEASING Y ALQUILER DE EQUIPOS| |7395|LABORATORIOS Y REVELADOS FOTOG| |7512|ALQUILER AUTOS SIN CHOFER| |7513|ALQ DE CAMIONES Y UTILITARIO| |7519|ALQUILER DE VEHICULOS RECREACI| |7523|GARAGES Y PARCELAS PARA ESTACI| |7531|CHAPISTAS Y PINTORES DE AUTOMO| |7534|REPARACION Y RECAPADO DE NEUMA| |7542|LAVADEROS DE AUTOMOVILES| |7549|SERVICIOS REMOLQUES| |7622|REPARACION DE ESTEREOS Y RADIO| |7623|ACONDICIONADORES DE AIRE REPAR| |7629|ELECTRONICA REPARACIONES| |7631|ORFEBRES JOYEROS MODELISTAS| |7641|REPARACION DE MUEBLES| |7692|SERVICIOS DE SOLDADURAS| |7699|REPARACION ARTEFACTOS PARA EL| |7829|PROD Y DISTRIB DE PELICULAS| |7832|CINES TEATROS ESPECTACULOS| |7841|VIDEO CLUBES| |7911|ARTICULOS DE BALLET| |7922|TEATROS Y AGENCIAS DE ESPECTAC| |7929|BANDAS ORQUESTAS Y ENTRETENIMI| |7932|POOL BILLARES, BOWLINGS| |7933|BOWLINGS| |7941|DEPORTES COMERCIALES PROFESION| |7991|EXHIBICIONES TURISTICAS| |7992|CAMPOS DE GOLF| |7993|VIDEO JUEGOS (SUMINISTROS)| |7994|ESTABLECIMIENTOS JUEGOS VIDEO| |7997|ASOCIACIONES CIVILES| |7998|ACUARIOS, OCEANARIOS| |7999|CLUBES Y GIMNASIOS| |8011|MEDICOS| |8021|ODONTOLOGIA| |8031|TRAUMATOLOGOS| |8041|KINESIOLOGO, QUIROPRACTICO| |8042|OFTALMOLOGOS| |8043|DISPENSARIOS OPTICOS| |8049|PEDICUROS| |8050|SERVICIOS DE NI(ERA Y AYUDA PE| |8062|SANATORIOS HOSPITALES| |8071|LABORATORIOS DE ANALISIS CLINI| |8099|OTROS SERVICIOS MEDICOS| |8111|ABOGADOS| |8211|ESCUELAS NIV INICIAL Y MEDIO| |8241|ESCUELA POR CORREO| |8244|ESCUELA DE NEGOCIOS| |8249|SERVICIOS VOCACIONALES| |8299|CURSOS PARA DESARROLLO| |8351|SERVICIOS DE CUIDADO DE NI(OS| |8398|ORG. BIEN PUBLICO, DE CARIDAD| |8651|ORGANIZACIONES POLITICAS| |8661|ORGANIZACIONES RELIGIOSAS| |8675|ASOCIACIONES AUTOMOVILISTICAS| |8734|LAB DE PRUEBAS NO MEDICINAL| |8911|INGENIERIA Y ARQUITECTURA| |8931|ESTUDIOS CONTABLES| |9211|COSTOS DE JUICIOS, PENS ALIM| |9222|MULTAS| |9311|IMPUESTOS, RENTAS, TASAS| |9399|OTROS SERVICIOS DE GOBIERNO| |9400|DISTRIBUIDORES| |9402|SERV. POSTAL GUBERNAMENTAL| |9950|COMPRAS DENTRO DE LAS COMPA#| |1711|CALEFACCION - PLOMERIA - AIRE| |1740|ALBA#ILERIA - MAMPOSTERIA| |1799|EMBALAJES, CAJAS DE CARTON| |2791|REPARACION DE FOTOCOPIADORAS| |2842|RECOLECCION TRAT DE RESIDUOS| |4723|SOLO ALEMANIA-OPERADOR TURIS| |4816|COMERCIO ELECTRONICO| |4822|PAGO DE SERVICIO - TEL CELULAR| |4825|TRANSFERENCIAS Y REINTEGROS| |4831|DESPACHO DE EFECTIVO| |4912|CONSORCIOS,EXPENSAS DTOS-LOC| |4915|COUNTRIES, BARRIOS PRIVADOS| |5134|UNIFORMES PARA AGRO| |5199|BIENES NO DURADERO-NO CLASIF| |5269|SEMILLERAS| |5300|CLUBES MAYORISTAS| |5331|NEGOCIOS DE VARIEDADES| |5399|FERIAS-EXPOSICIONES-MERCADERIA| |5441|ROTISERIAS COMIDAS PARA LLEV| |5499|BOMBONERIAS| |5511|TALLERES MECANICOS| |5521|CONCESIONARIOS DE AUTOMOVILES| |5531|CONCESIONARIOS OFICIALES| |5542|COMBUSTIBLE| |5551|NAUTICA Y PESCA| |5561|AUTO CAMPING| |5599|ARMERIAS Y CUCHILLERIAS| |5621|BOUTIQUE DAMAS| |5631|SOIREE NOVIAS| |5691|MISCELANEOS| |5699|LENCERIAS MERCERIAS| |5722|DECORACIONES| |5732|ARTICULOS PARA EL HOGAR| |5733|AUDIO VIDEO CLUBES| |5734|DISQUERIAS| |5735|INSTRUMENTOS MUSICALES| |5815|VTA DE PELICULAS LIBROS VISA I| |5816|JUEGOS INTERNACIONALES VISA IN| |5817|PAGO SOFTWARE VISA INT| |5912|FARMACIAS PERFUMERIAS| |5935|PROTECCION CATASTROFES ALARMAS| |5983|VENTAS DE LUBRICANTES| |6211|PRODUCTORES DE SEGURO| |6300|SEGUROS GENERALES| |6320|SEGUROS DE VIDA| |6321|EMPRESAS DE ASISTENCIA AL VIAJ| |7032|RECREOS INFANTILES, SALONES| |7033|ART. DE CAMPING Y PESCA| |7277|ESTUDIOS JURIDICOS DEUDAS CASA| |7399|EQUIPOS DE COMPUTACION VTAS Y| |7535|MATERIALES ELECTRICOS| |7538|ELECTRICIDAD CARBURACION AUTOM| |7833|CULTURA ESPECTACULOS ORG PUBLI| |7996|PROMOCION DE ESPECTACULOS| |8220|COLEGIOS INSTITUTOS| |8641|POLIDEPORTIVOS RECREOS| |8642|BALNEARIOS| |8699|MUTUALES OBRAS SOCIALES| |8999|GESTORIAS,SERV.PREST.POR TERCE| |9001|PROD.BALANCEADOS P\/CRIANZA ANI| |9002|SILOS:CEREALES Y SEMILLAS\/FORR| |9003|SISTEMAS DE FERTILIZACION| |9004|MOLINOS| |9005|MAQ.AGRICOLA:UNIDADES NUEV\/U| |9006|MAQUINARIA AGRICOLA:REPUESTOS| |9007|CONSIGNATARIOS DE HACIENDA| |9008|GANADERIA: CABA#AS| |9010|GRANDES PROVEEDORES AGRO| |9011|SISTEMAS DE RIEGO| |9012|GRANDES PROVEEDORES DISTRIBUTI| |9013|SERV AGROPECUARIOS - NO CALIF| |9014|CASILLAS RURALES:VENTA Y ALQUI| |9015|BALANZAS PARA EL AGRO| |9016|FUMIGACIONES| |9017|PLASTICOS PARA EL AGRO| |9018|MADERERAS| |9019|INSTALACIONES RURALES| |9020|EQUIPOS SATELITALES| |9021|TANQUES| |9022|GALPONES,TINGLADOS Y TECHOS| |9023|GRUPOS ELECTROGENOS| |9024|SOCIEDADES RURALES| |9025|ORGANISMOS| |9751|SUPERMERCADOS DE UK-USO REG| |9752|EST.DE SERV DE UK-USO REG| |9999|CONSUMO NF| |5540|SHOPS DE ESTACIONES DE SERVICIOS| **🇲🇽 BANORTE** | MCC | Actividad | | ----------- | ----------- | |742|SERVICIOS VETERINARIOS| |763|COOPERATIVAS AGRICOLAS| |780|SERVICIOS DE HORTICULTURA Y DE JARDINERIA| |1520|CONTRATISTAS EN GENERAL- RESIDENCIAL Y COMERCIAL| |1711|CONTRATISTAS (CALEFACCION VENTAS SERVICIO E INSTALACIONES)| |1731|CONTRATISTAS ELECTRICISTAS| |1740|CONTRATISTAS (YESO) (CANTERA Y MAMPOSTERIA) (TEJAS)| |1750|CONTRATISTAS CARPINTERIA| |1761|CONTRATISTAS TECHOS ESTRUCTURAS Y LAMINAS| |1771|CONTRATISTAS CONSTRUCTORAS| |1799|CONTRATISTAS (DEMOLICIONES) (PERFORACION) (CRISTALERIA)| |2741|PUBLICACIONES E IMPRESIONES EN GENERAL| |2791|TIPOGRAFIAS PLACAS TRABAJOS SIMILARES| |2842|LIMPIEZA ESPECIALIZADA PULIDOS Y SERVICIOS SANITARIOS| |4011|FERROCARRILES| |4111|TRANSBORDADORES (TRANSPORTE LOCAL)| |4112|FERROCARRIL DE PASAJEROS| |4119|SERVICIOS DE AMBULANCIA| |4121|LIMOSINAS (TAXIS)| |4131|AUTOBUSES FORANEOS| |4214|COMPAÑIAS DE MUDANZAS Y ALMACENAJE| |4215|TRASLADOS FLETES (SERVICIOS DE MENSAJERIA)| |4225|ALMACENES DEPOSITOS (BODEGAS)| |4411|LINEAS DE CRUCEROS (BARCOS DE VAPOR)| |4457|RENTA\/ARRENDAMIENTO YATES Y LANCHAS| |4468|SERVICIO\/ACCESORIOS MARITIMOS| |4511|OTRAS LINEAS AEREAS -FLETES AEREOS- NO CLASIFICADA| |4582|AEROPUERTOS TERMINALES AEREAS| |4722|AGENCIAS DE VIAJES OPERADORAS DE VIAJES| |4784|CUOTA PUENTES (CUOTAS Y TARIFAS PUENTES Y CARRETERAS)| |4789|SERVICIOS DE TRANSPORTE -NO CLASIFICADO| |4812|EQUIPOS DE TELECOMUNICACION| |4814|SERVICIOS DE TELECOMUNICACION INCLUYENDO LLAMADAS| |4816|COMERCIOS ELECTRONICOS| |4821|SERVICIOS TELEGRAFO| |4829|GIROS BANCARIOS\/POSTALES| |4899|PAGO DE SERVICIO POR TELEVISION CABLE\/POR EVENTO| |4900|SERVICIOS GUBERNAMENTALES AGUA ELECTRICIDAD SANITA| |5013|VEHICULOS DE MOTOR ACCESORIOS Y AUTO PARTES| |5021|MUEBLES PARA OFICINA Y COMERCIOS| |5039|MATERIALES PARA LA CONSTRUCCION NO CLASIFICADOS| |5044|EQUIPOS DE OFICINA FOTOGRAFICO FOTOCOPIADO| |5045|COMPUTADORAS EQUIPO PERIFERICO DE COMPUTADORAS| |5046|EQUIPO COMERCIAL NO CLASIFICADO| |5047|EQUIPO Y SUMINISTROS HOSPITALES| |5051|CENTROS DE SERVICIO PARA EQUIPOS DE OFICINA| |5065|PARTES Y EQUIPO ELECTRICO| |5072|FERRETERIAS ACCESORIOS Y EQUIPO| |5074|EQUIPO PLOMERIA Y CALEFACCION| |5085|ACCESORIOS INDUSTRIALES NO CLASIFICADOS| |5094|METALES Y PIEDRAS PRECIOSAS RELOJERIA Y JOYERIA| |5099|BIENES DURADEROS NO CLASIFICADOS| |5111|ARTICULOS DE ESCRITORIO OFICINA Y PAPELERIA| |5122|MEDICINAS MEDICINAS DE PATENTE FARMACOS DIVERSOS| |5131|MERCERIAS| |5137|UNIFORMES HOMBRES \/ MUJERES \/ NIÑOS| |5139|CALZADO| |5169|PRODUCTOS QUIMICOS Y ALIACIONES NO CLASIFICADOS| |5172|PETROLEO Y PRODUCTOS DERIVADOS| |5192|LIBROS PERIODICOS Y REVISTAS| |5193|ACCESORIOS PARA FLORERIAS FLORES E INVERNADEROS| |5198|DISTRIBUIDOR DE PINTURAS Y BARNICES| |5199|PERECEDEROS NO CLASIFICADOS| |5200|ALMACEN DE ELECTRODOMESTICOS| |5211|CIMBRAS \/ MADERERIAS (MATERIALES PARA CONSTRUCCION| |5231|PAPEL TAPIZ (PINTURAS Y PAPEL TAPIZ) (VIDRIERIAS)| |5251|FERRETERIA| |5261|ACCESORIOS JARDIN (ACCESORIOS JARDINERIA),| |5271|DISTRIBUIDORES CAMPERS Y REMOLQUES| |5300|CLUBES DE MAYORISTAS| |5309|TIENDAS LIBRES DE IMPUESTO| |5310|TIENDAS DE DESCUENTO| |5311|TENDAS DEPARTAMENTALES| |5331|TIENDAS DE PARTICIPACION ESTATAL| |5399|ALMACEN DE MERCANCIAS EN GENERAL| |5411|ABARROTES EN GENERAL ULTRAMARINOS\/SUPERMERCADOS| |5422|CONGELADORES VITRINAS CARNICERIAS| |5441|DULCERIAS (PASTELERIAS Y CONFITERIAS)| |5451|LECHERIAS CREMERIAS LACTEOS| |5462|PANADERIAS| |5499|TIENDAS COMIDA RAPIDA(ENLATADOS Y CONGELADOS)| |5532|LLANTAS AUTOMOTORES DISTRIBUIDOR DE LLANTAS AUTOMO| |5533|AUTOPARTES ACCESORIOS AUTOMOTORES| |5541|ESTACIONES DE SERVICIO GASOLINERIAS| |5542|DISPENSADOR AUTOMATICO DE GASOLINA| |5551|DISTRIBUIDORES DE YATES BARCOS LANCHAS| |5561|DISTRIBUIDORES DE CAMPERS| |5571|DISTRIBUIDORES Y AGENCIAS MOTOCICLETAS| |5598|DISTRIBUIDORES DE AUTOS PARA LA NIEVE| |5611|BOUTIQUE ROPA PARA NIÑOS, (ROPA CABALLEROS Y NIÑOS)| |5621|ROPA CASUAL DAMAS BOUTIQUES ROPA CASUAL DAMAS| |5631|BOUTIQUE ROPA ESPECIAL \/ LENCERIAS| |5641|BOUTIQUES ROPA NIÑOS Y BEBES (ROPA NIÑOS Y BEBES)| |5651|BOUTIQUES ROPA PARA TODA LA FAMILIA| |5655|ROPA EQUITACION (ROPA DEPORTIVA)| |5661|ZAPATERIAS| |5681|PIELES FINAS| |5691|ROPA PARA CABALLEROS Y DAMAS| |5697|ALTA COSTURA CABALLEROS Y DAMAS, (ALTA COSTURA DAMA)| |5698|PELUCAS Y BISONES| |5699|ROPA Y ACCESORIOS MISCELANEOS (ROPA MISCELANEO)| |5712|MOBILIARIO ESPECIAL PARA EL HOGAR MISCELANEO (VENT| |5713|ALFOMBRAS Y TAPETES| |5714|CORTINAS CORTINEROS (TAPICERIAS)| |5718|ACCESORIOS PARA CHIMENEAS CHIMENEAS| |5719|EQUIPAMIENTO PARA EL HOGAR EXCEPTO ELECTRODOMESTICOS| |5722|ACCESORIOS ELECTRODOMESTICOS| |5732|TIENDAS DE ELECTRONICA| |5733|TIENDAS DE MUSICA INSTRUMENTOS MUSICALES PIANOS| |5734|TIENDAS DE SOFTWARE PARA COMPUTADORAS| |5735|TIENDA DE DISCOS| |5811|ALIMENTOS PROVEEDORES Y DISTRIBUIDORES| |5812|RESTAURANTES (CAFETERIAS)| |5813|BARES BEBIDAS ALCOHOLICAS (TABERNAS) (DISCOTECAS)| |5814|COMERCIO QUE VENDE COMIDA PREPARADA PARA CONSUMO| |5912|DROGUERIAS (FARMACIAS)| |5921|DEPOSITOS DE CERVEZAS (VINATERIAS)| |5931|TIENDAS DE ARTICULOS USADOS| |5932|TIENDAS DE ANTIGUEDADES BAZARES VENTA REPARACION| |5933|CASAS DE EMPEÑO| |5935|VENTAS DE SALDOS| |5936|CHACHARAS| |5937|REPRODUCCION DE ANTIGUEDADES| |5940|BICICLETAS VENTA Y REPARACION| |5941|DEPORTES Y ACCESORIOS| |5942|LIBRERIAS| |5944|RELOJERIAS (JOYERIAS) (PLATERIAS)| |5945|JUEGOS DE MESA Y PASATIEMPOS| |5946|ARTICULOS Y ACCESORIOS FOTOGRAFICOS| |5947|TIENDAS DE REGALOS (REGALOS Y ARTESANIAS)| |5948|ARTICULO DE PIEL (MALETAS Y EQUIPAJES)| |5949|TELAS Y CASIMIRES (MERCERIAS) (BONETERIAS)| |5950|CRISTALERIAS| |5960|MERCADEO DIRECTO SERVICIOS DE SEGUROS| |5962|MERCADO DIRECTO SERVICIOS RELACIONADOS CON VIAJES| |5963|VENTAS DE PUERTA EN PUERTA| |5964|MERCADO DIRECTO VENTAS POR CATALOGO| |5965|MERCADEO DIRECTO TIENDAS AL MENUDEO| |5967|MERCADEO DIRECTO COMERCIANTES QUE PRESTAN SERVICIOS| |5968|MERCADEO DIRECTO SUBSCRIPCION \/ CARGO AUTOMATICO| |5969|MERCADEO DIRECTO NO CLASIFICADO| |5970|ARTICULOS PARA EL ARTISTAS (ARTICULOS DE ARTE)| |5971|GALERIAS DE ARTE (DISTRIBUIDORES DE ARTE)| |5972|COLECCION DE MONEDAS| |5973|ARTICULOS RELIGIOSOS| |5975|ARTICULOS PARA LA SORDERA VENTAS REPARACION Y ACCESORIOS| |5976|ARTICULO ORTOPEDICOS PROTESIS VENTA REPARACION Y ACCESORIOS| |5977|TIENDAS COSMETICOS| |5978|MAQUINAS DE ESCRIBIR VENTAS REPARACION ACCESORIOS| |5983|DISTRIBUIDOR DE GAS LICUADO| |5992|FLORERIAS| |5993|TABAQUERIAS| |5994|PUESTOS DE PERIODICOS Y REVISTAS| |5995|TIENDAS DE MASCOTAS ALIMENTO Y ACCESORIOS| |5996|VENTA SERVICIO ACCESORIOS ALBERCAS| |5997|VENTAS REPARACION RAZURADORAS| |5998|VENTA DE TOLDOS (VENTA DE TIENDAS DE CAMPAÑA)| |5999|DISTRIBUIDORES DE HIELO, (FUEGOS ARTIFICIALES)| |6010|BANCOS DISPOSICIONES DE EFECTIVO EN VENTANILLA| |6011|BANCOS DISPOSICIONES AUTOMATICAS DE EFECTIVO| |6012|AUTOFINANCIAMIENTOS SERVICIOS FINANCIEROS| |6051|ORDENES DE PAGO INSTITUCIONES NO FINANCIERAS| |6211|AGENTES TRANSACCIONES DE BOLSA| |6300|ASEGURADORAS VENTAS DE SEGUROS POLIZAS| |7011|SERVICIOS NO CLASIFICADOS HOTELES MOTELES CENTROS| |7012|TIEMPO COMPARTIDO| |7032|CAMPAMENTOS NIÑOS| |7033|TRAILER PARKS, (CAMPAMENTOS)| |7210|SERVICIOS LAVANDERIA| |7211|SERVICIO PAÑALES (LAVANDERIAS AUTOMATICAS)| |7216|TINTORERIAS| |7217|LIMPIEZA TAPETES (LIMPIEZA ALFOMBRAS)| |7221|ESTUDIOS FOTOGRAFICOS| |7230|SALONES DE BELLEZA (PELUQUERIAS) (ESTETICAS)| |7251|LIMPIEZA DE SOMBREROS Y REPARACION DE CALZADO| |7261|SERVICIOS FUNERARIOS (CREMATORIOS),| |7273|EDECANES (DAMAS DE COMPAÑIA)| |7276|CONTADORES PREPARACION DE DECLARACION DE IMPUESTOS| |7277|ASESOR FINANCIERO (CONSEJEROS Y ASESORES PER| |7278|ASESORIAS COMPRA\/VENTA BIENES INMUEBLES| |7296|RENTA UNIFORMES (RENTA DISFRACES) (RENTA SMOKINGS)| |7297|SALONES MASAJES| |7298|CLINICAS BELLEZA (CLINICA SALUD)| |7299|RENTA DEPARTAMENTOS EDIFICIO DE DEPARTAMENTOS (OTR| |7311|SERVICIOS PUBLICITARIOS| |7321|BUROS DE CREDITO (BURO DE CREDITO AL CONSUMIDOR)| |7333|FOTOGRAFIA ARTE Y ANUNCIOS COMERCIALES| |7338|SERVICIO DE FOTOCOPIADO REPRODUCCIONES| |7339|SERVICIOS SECRETARIALES Y ESTENOGRAFICOS| |7342|SERVICIOS FUMIGACION (SERVICIOS EXTERMINIO DE PLAGAS)| |7349|SERVICIOS DE CONSERJERIA LIMPIEZA Y MANTENIMIENTO| |7361|AGENCIAS DE EMPLEOS (SERVICIOS EVENTOS ESPECIALES)| |7372|SERVICIO DE PROCESAMIENTO DE DATOS| |7375|SERVICIOS DE CONSULTA\/ENCUESTAS DE INFORMACION| |7379|MANTENIMIENTO REPARACION DE COMPUTADORAS SERVICIOS| |7392|SERVICIOS RELACIONES PUBLICAS (SERVICIOS CONSULTORIA)| |7393|GUARDIAS DE SEGURIDAD (AGENCIAS DETECTIVES PRIVADO| |7394|RENTA MUEBLES (RENTA DE HERRAMIENTAS EQUIPO Y MUEB| |7395|LABORATORIOS FOTOGRAFICOS- REVELADO Y RETOQUE| |7399|OTROS SERVICIOS EMPRESARIALES NO CLASIFICADOS| |7511|TRANSACIONES EN TRANSITO CARRETERO| |7512|ARRENDADORAS DE AUTOS NO CLASIFICADAS| |7513|RENTA CAMIONES (RENTA ACCESORIOS PARA REMOLQUES)| |7519|RENTA CASAS RODANTES (RENTA VEHICULOS RECREATIVOS| |7523|ESTACIONAMIENTOS\/PENSIONES| |7531|TALLERES HOJALATERIA| |7534|TALLERES VULCANIZADORAS| |7535|TALLERES PINTURA DE AUTOS| |7538|TALLERES MECANICOS| |7542|SERVICIO LAVADO DE AUTOS| |7549|SERVICIO GRUAS Y TRASLADOS| |7622|TALLER DE REPARACION APARATOS ELECTRONICOS| |7623|TALLER DE REPARACION AIRE ACONDICIONADO| |7629|TALLERES DE REPARACION ELECTRICOS Y EQUIPOS PEQUEÑOS| |7631|TALLER DE REPARACION RELOJES DE PULSO| |7641|RETAPIZADOS (TALLER DE REPARACION MUEBLES Y ACABADOS)| |7692|TALLER SOLDADURA ELECTRICA Y AUTOGENA| |7699|TALLERES DE REPARACION MISCELANEOS NO CLASIFICADOS| |7829|PRODUCCION Y DISTRIBUCION DE PELICULAS Y VIDEOS| |7832|CINES TEATROS| |7841|RENTA DE VIDEOS| |7911|BAILE SALONES Y ESCUELAS DE BAILE| |7922|TEATROS Y CINES| |7929|BANDAS ORQUESTAS GRUPOS, DIVERSIONES NO CLASIFICADO| |7932|BILLARES| |7933|BOLICHES| |7941|CLUBES DEPORTIVOS PROFESIONALES| |7991|EXHIBICIONES Y ATRACCIONES TURISTICAS| |7992|CAMPOS DE GOLF PUBLICO| |7993|VENTA DE VIDEO JUEGOS ACCESORIOS| |7994|VIDEO JUEGOS ESTABLECIMIENTOS| |7995|CASINOS CASAS DE JUEGO| |7996|ADIVINOS LECTURA DE CARTAS (CIRCOS) (PARQUES DE DIVERSION)| |7997|CLUBS DEPORTIVOS MEMBRESIAS| |7998|ACUARIOS ESPECTACULOS MARINOS| |7999|JARDINES BOTANICOS| |8011|DOCTORES (MEDICOS)| |8021|ORTODONCISTAS (DENTISTAS)| |8031|OSTEOPATAS| |8041|QUIROPRACTICOS| |8042|OPTOMETRISTAS (OFTALMOLOGOS)| |8043|OPTICAS LENTES Y ANTEOJOS| |8049|PEDICURISTAS, (QUIROPEDISTAS)| |8050|SERVICIOS DE RECUPERACION (SERVICIOS DE ENFERMERAS| |8062|HOSPITALES| |8071|LABORATORIOS DENTALES (LABORATORIOS MEDICOS)| |8099|SERVICIOS MEDICOS Y PARAMEDICOS NO CLASIFICADOS| |8111|SERVICIOS LEGALES (ABOGADOS)| |8211|ESCUELAS SECUNDARIAS (ESCUELAS PRIMARIAS)| |8220|UNIVERSIDADES (COLEGIOS Y PREPARATORIAS) (ESCUELAS)| |8241|ESCUELAS CURSOS POR CORRESPONDENCIA| |8244|ESCUELAS ADMINISTRACION| |8249|ESCUELAS PROFESIONALES (PROFESIONAL)| |8299|ESCUELAS Y ACADEMIAS NO CLASIFICADAS| |8351|GUARDERIAS (PUERICULTURA) (SERVICIOS DE CUIDADO)| |8398|ORGANIZACIONES DE SERVICIO SOCIAL| |8641|ASOCIACIONES CIVICAS Y FRATERNIDADES| |8651|ORGANIZACIONES POLITICAS| |8661|ORGANIZACIONES RELIGIOSAS| |8675|ASOCIACIONES AUTOMOVILISTICAS| |8699|SINDICATOS (ASOCIACIONES- NO CLASIFICADAS)| |8734|LABORATORIOS DE PRUEBAS (NO MEDICOS)| |8911|PROYECTOS INGENIERILES Y DE ARQUITECTURA| |8931|SERVICIOS CONTABILIDAD (SERVICIOS CONTABLES)| |8999|SERVICIOS PROFESIONALES NO CLASIFICADOS| |9211|PENSIONES ALIMENTICIAS, (COSTOS DE JUICIOS)| |9222|MULTAS| |9223|PAGOS Y DEPOSITOS DE FIANZAS| |9311|PAGOS DE IMPUESTOS| |9399|OTROS PAGOS DE SERVICIOS NO CLASIFICADOS (BOMBERO| |9402|SERVICIOS POSTALES SOLO GOBIERNO| |9950|COMPRAS INTERGUBERNAMENTALES| |9995|FACILEASING| |9996|OPERATIVA NIPPER| **🇲🇽 AMEX** | MCC | Actividad | | ----------- | ----------- | |0742|VETERINARIAS ACUARIOS| |0743|VINOTECAS LICORERIAS| |0763|COOPERATIVAS AGRICOLAS| |0780|JARDINERIA - FLORICULTURA| |1520|VIVIENDAS INDUSTRIALES| |1711|CALEFACCION - PLOMERIA - AIRE| |1740|ILUMINACION ARTEFACTOS ACCESOR ALBA#ILERIA - MAMPOSTERIA| |1750|CARPINTERIAS| |1761|TECHOS REPARACION| |1771|TRABAJOS HORMIGON Y CONCRETO| |1799|CONTRATISTAS COMERCIALES ESPECIALES| |2741|SERV DE IMPRESIONES-IMPRENTA EMBALAJES, CAJAS DE CARTON REPARACION DE FOTOCOPIADORAS| |2791|ORFEBRES JOYEROS MODELISTAS| |2842|RECOLECCION TRAT DE RESIDUOS| |3998|FERROCARRIL CHINO| |4011|FERRIES - TRANSPORTE DE PASAJE| |4111|SUBTE/TRANSP DE PASAJEROS TRANSPORTE INTERURBANO| |4119|SERVICIOS DE AMBULANCIAS| |4121|ALQUILER AUTOS CON CHOFER| |4131|EMPRESAS DE TRANSPORTES| |4214|MUDANZAS| |4215|SERVICIOS DE MENSAJERIA| |4225|GRANDES TIENDAS| |4411|STEAMSHIPS AND CRUISE LINES| |4457|BOTES: ALQUILER Y LEASING| |4468|SUMINISTROS Y SERVICIOS MARINO| |4511|LINEAS AEREAS Y DE NAVEGACIO| |4582|AEROPUERTOS PRIVADOS PISTAS AT| |4722|AGENCIAS DE VIAJES Y TURISMO| |4733|VENTA DE ENTRADAS PARA GRANDES LUGARES ESCÉNICOS| |4784|AUTOPISTAS Y PEAJES| |4789|ALQUILER DE TAXI AEREO| |4812|EQUIPOS DE TELEFONIA| |4814|SERV DE TELECOMUNICACIONES| |4815|RECARGAS| |4816|RED INFORMÁTICA/SERVICIOS DE INFORMACIÓN*| |4821|SERVICIO DE TELEGRAFO| |4829|PAGO DE TARJETA DE CREDITO, CAJAS PREVISIONALES| |4899|SERV DE TELEVISION POR CABLE| |4900|EMPRESAS DE SERVICIOS| |5013|SUMINISTROS PARA VEHICULOS| |5021|AMOBLAM OFICINA Y COMERCIAL| |5039|MATER CONSTRUCCION-NO CLASIF| |5044|EQUIP DE OFICINA:FOTOCOPIADO| |5045|INSUMOS INFORMATICOS| |5046|EQUIPO COMERCIAL - NO CLASIFICADO EN OTRA PARTE| |5047|INSTRUMENTAL MEDICO DE PRECISI| |5051|METALURGICAS Y FUNDICIONES| |5065|PARTES Y EQUIPAM ELECTRICOS| |5072|FERRETERIAS,ABERTURAS,HERRAJES| |5074|EQUIP Y SUMIN DE PLOMERIA| |5085|FERRETERIAS INDUSTRIALES| |5094|RELOJES, JOYAS, PIEDRAS PREC| |5099|BIENES DURABLES-NO CLASIF| |5111|PAPELERIA Y SUMIN PARA OFIC| |5122|DROGUERIAS| |5131|SEDERIAS, MERCERIAS, RETACER| |5137|UNIFORME E INDUMENTARIA COMERCIAL| |5139|CALZADO PARA UNIFORMES| |5169|FERTILIZANTES Y AGROQUIMICOS| |5172|PETROLEO Y DERIVAD (NO COMB)| |5192|LIBROS Y PUBLIC ESPECIALIZAD| |5193|SUMIN PARA FLORERIAS Y VIVER| |5198|PINTURERIAS| |5199|GRAN TIENDA DE MATERIALES| |5200|ARTICULOS PARA EL HOGAR| |5211|MATERIALES PARA LA CONSTRUCCIO| |5231|PINTURERIAS PAPELES PINTADOS| |5251|BAZARES FERRETERIAS| |5261|PARQUES Y JARDINES| |5271|CASAS RODANTES| |5300|CLUBES MAYORISTAS| |5309|TIENDAS LIBRES DE IMPUESTOS| |5310|TIENDAS DE DESCUENTOS| |5311|TIENDAS DEPARTAMENTAL| |5331|TIENDAS DE VARIEDADES| |5398|MAYORISTA CORPORATIVO| |5399|MISCELANEOS| |5411|ALMACENES SUPERMERCADOS| |5422|FRIGORIFICOS VTA AL PUBLICO| |5441|TIENDAS DE DULCE, NUECES Y CONFITERIA| |5451|PRODUCTOS LACTEOS| |5462|PANADERIAS-CONFITERIAS| |5511|CONCESIONARIOS DE AUTOMOVILES| |5521|AUTO Y CAMION| |5531|TIENDA DE ARTICULOS PARA EL HOGAR Y AUTOMOVIL| |5532|GOMERIAS| |5533|ACCESORIOS Y REPUESTOS PARA AU| |5541|ESTACIONES DE SERVICIO-EXCLU| |5542|COMBUSTIBLE| |5551|DISTRIBUIDORES DE BARCOS| |5552|CARGA DE VEHICULOS ELECTRICOS| |5561|ARTICULOS PARA CAMPING| |5571|MOTOS Y BICICLETAS| |5592|CASAS RODANTES MOTORIZADAS| |5598|CONCESIONARIAS DE MOTOS DE NIEVE| |5611|BOUTIQUE HOMBRES| |5621|BOUTIQUE DAMAS| |5631|LENCERIAS MERCERIAS| |5641|ROPA INFANTIL| |5651|TIENDAS DE ROPA FAMILIAR| |5655|PRENDAS DEPORTIVAS| |5661|ZAPATERIAS| |5681|PELETERIAS| |5691|BOUTIQUE UNISEX| |5697|SASTRE SURCIDORA MODISTA ARREG| |5698|PELUCAS| |5712|AMOBLAMIENTOS, COLCHONERIAS| |5713|TIENDA DE REVESTIMIENTO PARA PISOS| |5714|TAPICERIAS| |5715|MAYORISTAS DE BEBIDAS ALCOHOLICAS| |5718|CHIMENEAS HOGARES ACCESORIOS| |5719|HOGAR TIENDAS ESPECIALIZADAS| |5722|TIENDAS DE ELECTRODOMESTICOS| |5732|TIENDAS DE ARTICULOS DE ELECTRONICA| |5733|INSTRUMENTOS MUSICALES| |5734|TIENDAS DE SOFTWARE| |5735|DISQUERIAS| |5811|PROVEEDORES DE ALIMENTOS| |5812|RESTAURANTES| |5813|BARES AMERICANOS CONFITERIAS VINOTECAS LICORERIAS| |5814|FAST FOOD| |5815|VTA DE PELICULAS LIBROS VISA I| |5816|JUEGOS INTERNACIONALES VISA IN| |5817|PRODUCTOS DIGITALES: APLICACIONES (EXCLUYE JUEGOS)| |5818|GRANDES COMERCIANTES DE BIENES DIGITALES| |5912|FARMACIAS PERFUMERIAS| |5921|TIENDAS DE PAQUETES: CERVEZA, VINO Y LICORES| |5931|NEGOCIOS DE MERCADERIA USADA R| |5932|ANTIGUEDADES| |5933|CASAS DE EMPEÑO| |5935|PATIOS DE DEMOLICIÓN Y SALVAMENTO| |5937|REPRODUCCION DE ANTIGUEDADES| |5940|VTA Y REPARACION DE BICICLETAS| |5941|ARTICULOS PARA DEPORTES| |5942|LIBRERIAS VTA TEXTOS| |5943|LIBRERIAS PAPELERIAS UTILES VA| |5944|JOYERIAS RELOJERIAS| |5945|JUGUETERIAS| |5946|FOTOGRAFIA OPTICAS| |5947|REGALOS| |5948|ARTICULOS DE CUERO| |5949|LANAS TEJIDOS HILADOS| |5950|CRISTALERIAS| |5960|MARKETING DIRECTO - SEGUROS| |5962|MARKETING DIRECTO - VIAJES E| |5963|VENTAS PUERTA A PUERTA| |5964|COMERCIOS DE CATALOGO| |5965|COM.DE CATALOGO Y VTAS P/MEN| |5966|COM.DE TELEMERCADEO P/CORREO| |5967|MARKETING DIRECTO INBOUND E| |5968|COMERCIOS DE SUSCRIPCIONES C| |5969|COMERCIOS DE MERCADEO DIRECT| |5970|ARTE GALERIAS| |5971|CUADROS Y OBJETOS DE ARTE| |5972|FILATELIA| |5973|SANTERIAS| |5975|AUDIFONOS VENTA Y REPARACION| |5976|ORTOPEDIA| |5977|COSMETOLOGIA EQUIPOS| |5978|VENTA DE MAQUINAS DE OFICINA| |5983|DISTRIBUIDORES DE COMBUSTIBLE: GASOLINA, MADERA, CARBÓN Y PETRÓLEO LICUADO| |5992|FLORERIAS VIVEROS| |5993|TABAQUERIAS| |5994|DIARIOS Y REVISTAS VTAS| |5995|CRIADEROS, PRODUCTOS VARIOS| |5996|CONSTRUCCION DE PILETAS| |5997|AFEITADORAS ELECTRICAS VTA Y S| |5998|TOLDOS, LONAS, MALLAS| |5999|COMPRA/RECARGA VALOR ALMACENAD| |6010|INSTITUCIONES FINANCIERAS - DESEMBOLSOS MANUALES DE EFECTIVO| |6011|INSTITUCIONES FINANCIERAS: DESEMBOLSOS DE EFECTIVO AUTOMATIZADOS| |6012|INSTITUCIONES FINANCIERAS - MERCANCÍAS Y SERVICIOS*| |6051|INSTITUCIONES NO FINANCIERAS: MONEDA EXTRANJERA, GIROS POSTALES (NO TRANSFERENCIAS BANCARIAS), VALES Y VIAJES| |6211|VALORES - CORREDORES Y DISTRIBUIDORES| |6300|PRODUCTORES DE SEGURO , SEGUROS GENERALES, SEGUROS DE VIDA, EMPRESAS DE ASISTENCIA AL VIAJE| |6513|AGENTES INMOBILIARIOS Y ADMISTRACIONES - ALQUILERES| |6538|PAGOS P2P| |6540|VALOR ALMACENADO/COMPRA/CARGA CON TARJETA DE REGALO*| |7011|HOTELES RESIDENCIALES TEMPORAR| |7012|TIEMPO COMPARTIDO| |7013|AGENTE DE BIENES RAÍCES - CORREDORES| |7032|CAMPAMENTOS DEPORTIVOS Y RECREATIVOS| |7033|PARQUES DE CASAS RODANTES Y CAMPAMENTOS| |7210|LAVADERO AUTOMATICO PRENDAS| |7211|LAVADEROS FAMILIARES| |7216|TINTORERIAS| |7217|LIMPIEZA DE ALFOMBRAS,TAPICERI| |7221|ESTUDIOS FOTOGRAFICOS| |7230|PELUQUERIAS| |7251|CONFECCION Y VENTA DE SOMBRERO| |7261|SERVICIOS FUNEBRES| |7273|SERV SALIDAS Y COMP SOCIAL| |7276|GESTORIAS LIQUIDACION IMPUESTOS| |7277|SERVICIOS DE ASESORAMIENTO: DEUDAS, MATRIMONIO Y PERSONAL| |7278|SERVICIOS DE COMPRA Y SHOPPING| |7280|HOSPITAL PRIVADO| |7295|SERVICIOS DE NIÑERA Y LIMPIEZA| |7296|ALQUILER DE DISFRACES,COTILLON| |7297|SALONES DE MASAJE| |7298|SPA / CENTROS DE BELLEZA, INSTITUTOS DE BELLEZA INTEGRAL| |7299|SERVICIOS PERSONALES| |7311|ASESORAMIENTO PUBLICITARIO| |7321|ORG DE INFORMES CREDITICIOS| |7322|AGENCIAS DE COBRO DE DEUDA| |7333|ARTICULOS PARA DIBUJO| |7338|SERVICIOS DE REPRODUCCION Y CO| |7339|SERV. DE SECRETARIAS| |7342|SERVICIO DE EXTERMINACION Y DE| |7349|LIMPIEZA Y MANTENIMIENTO| |7361|AGENCIA DE EMPLEO| |7372|SERVICIO DE PROCESAMIENTO DE D| |7375|SERVICIOS DE RECUPERO DE INFORMACIÓN| |7379|REPAR Y MANT DE COMPUTADORAS| |7392|CONSULTORA Y RELAC PUBLIC| |7393|AG DE DETECTIVES Y SEGURIDAD| |7394|LEASING Y ALQUILER DE EQUIPOS| |7395|LABORATORIOS Y REVELADOS FOTOG| |7399|SERVICIOS COMERCIALES NO CLASIFICADOS EN OTRA PARTE| |7512|ALQUILER AUTOS SIN CHOFER| |7513|ALQ DE CAMIONES Y UTILITARIO| |7519|ALQUILER DE VEHICULOS RECREACI| |7523|GARAGES Y PARCELAS PARA ESTACI| |7531|CHAPISTAS Y PINTORES DE AUTOMO| |7534|REPARACION Y RECAPADO DE NEUMA| |7535|TALLERES DE PINTURA AUTOMOTRIZ| |7538|TALLERES DE SERVICIO AUTOMOTRIZ (NO CONCESIONARIOS)| |7542|LAVADEROS DE AUTOMOVILES| |7549|SERVICIOS REMOLQUES| |7622|ELECTRONICA REPARACIONES| |7623|ACONDICIONADORES DE AIRE REPAR| |7629|REPARACION DE ESTEREOS Y RADIO| |7641|REPARACION DE MUEBLES| |7692|SERVICIOS DE SOLDADURA| |7699|REPARACION ARTEFACTOS PARA EL| |7800|LOTERÍAS PROPIEDAD DEL ESTADO| |7801|ESTADO - CASINOS CON LICENCIA (APUESTAS EN LÍNEA)| |7802|ESTADO - CARRERAS DE CABALLOS/PERROS CON LICENCIA*| |7829|PROD Y DISTRIB DE PELICULAS| |7832|CINES TEATROS ESPECTACULOS| |7841|VIDEO CLUBES| |7911|ARTICULOS DE BALLET| |7922|TEATROS Y AGENCIAS DE ESPECTAC| |7929|BANDAS ORQUESTAS Y ENTRETENIMI| |7932|POOL BILLARES, BOWLINGS| |7933|BOWLINGS| |7941|DEPORTES COMERCIALES PROFESION| |7991|EXHIBICIONES TURISTICAS| |7992|CAMPOS DE GOLF| |7993|VIDEO JUEGOS (SUMINISTROS)| |7994|ESTABLECIMIENTOS JUEGOS VIDEO| |7995|LOTERIAS Y AGENCIAS DE JUEGO, APUESTAS Y JUEGOS DE AZAR| |7996|PARQUES DE ATRACCIONES, CIRCOS, CARNAVALES Y ADIVINOS| |7997|ASOCIACIONES CIVILES| |7998|ACUARIOS, OCEANARIOS| |7999|CLUBES Y GIMNASIOS| |8011|MEDICOS| |8021|ODONTOLOGIA| |8031|TRAUMATOLOGOS| |8041|KINESIOLOGO, QUIROPRACTICO| |8042|OFTALMOLOGOS| |8043|DISPENSARIOS OPTICOS| |8049|PEDICUROS| |8050|SERVICIOS DE NI(ERA Y AYUDA PE| |8062|SANATORIOS HOSPITALES| |8071|LABORATORIOS DE ANALISIS CLINI| |8099|OTROS SERVICIOS MEDICOS| |8111|ABOGADOS| |8211|ESCUELAS NIV INICIAL Y MEDIO| |8220|FACULTADES, UNIVERSIDADES, ESCUELAS PROFESIONALES Y COLEGIOS UNIVERSITARIOS| |8241|ESCUELA POR CORREO| |8244|ESCUELA DE NEGOCIOS| |8249|SERVICIOS VOCACIONALES| |8299|CURSOS PARA DESARROLLO| |8351|SERVICIOS DE CUIDADO DE NI(OS| |8398|ORG. BIEN PUBLICO, DE CARIDAD| |8641|ASOCIACIONES CÍVICAS, SOCIALES Y FRATERNALES| |8651|ORGANIZACIONES POLITICAS| |8661|ORGANIZACIONES RELIGIOSAS| |8675|ASOCIACIONES AUTOMOVILISTICAS| |8699|ORGANIZACIONES DE MEMBRESÍA NO CLASIFICADAS EN OTRA PARTE| |8734|LAB DE PRUEBAS NO MEDICINAL| |8911|INGENIERIA Y ARQUITECTURA| |8931|ESTUDIOS CONTABLES| |8999|SERVICIOS PROFESIONALES NO CLASIFICADOS EN OTRA PARTE| |9222|MULTAS| |9223|IMPUESTOS, RENTAS, TASAS| |9399|OTROS SERVICIOS DE GOBIERNO| |9400|PAGOS DE TASAS DE EMBAJADA| |9402|SERV. POSTAL GUBERNAMENTAL| |9950|VENTAS INTERNAS - CORPORATIVO| ```bash curl --request POST \ --url https://api.menta.global/api/v1/acquirers/merchants \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "acquirer_id": "string", "customer_id": "string", "merchant_id": "string", "rate_type": "string", "payment_type": "string", "data": [ { "name": "string", "properties": { "type": "string", "title": "string", "description": "string", "validations": { "required": "boolean" }, "href": "string", "hidden": "boolean", "value": "string", "data": "list", "options": "list" } } ] }' ``` **204** ```json ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "incomplete data form" } ] } ``` Otros mensajes posibles: ` is required`, `Invalid MCC`, `field must be present`. **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Access denied" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_getall #### Planes de pago # Obtener todos los planes ### `GET /v1/fee-rules` Obtener los planes de pago creados por un cliente para ofrecer a sus comercios. > - Se listan todos los planes del cliente, incluidos los que pertenecen a un comercio específico (campo `merchant_id`). > - `is_selected` es siempre `false` en este endpoint; solo es significativo al [obtener los planes de un comercio](/api_reference/plans_getmerchant). > - `commission` se devuelve como la fracción almacenada (por ejemplo, `0.015` para un plan creado con `1.5`), no como porcentaje. > - `merchant_id` y `alias` se omiten cuando no tienen valor; sin `merchant_id`, el plan aplica a todos los comercios. ```bash curl --request GET \ --url https://api.menta.global/api/v1/fee-rules \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json [ { "id": "string", "payment_method": "string", "term": "integer", "commission": "number", "card_brand": "string", "is_selected": "boolean", "has_installments": "boolean", "is_international": "boolean", "merchant_id": "string", "alias": "string" } ] ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_getmerchant #### Planes de pago # Planes de un comercio ### `GET /v1/merchants/{merchant_id}/fee-rules` Obtener los planes de pago disponibles para un comercio específico. #### Datos de respuesta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `id` | string | ID del plan de pago | | `payment_method` | string | Tipo de medio de pago
Valores: [CREDIT, DEBIT, PREPAID] | | `term` | integer | Días de acreditación | | `commission` | number | Comisión almacenada como fracción (0.015 equivale a 1.5 %) | | `card_brand` | string | Tipo de tarjeta
Valores: [VISA, MASTERCARD, AMEX, CARNET, MAESTRO, DISCOVER, CABAL, NARANJA, UNIONPAY, DINERS] | | `has_installments` | boolean | Aplica cuando se paga en cuotas | | `is_international` | boolean | Aplica para tarjetas internacionales | | `is_selected` | boolean | Se indica si dentro de las opciones de planes de pago que puede seleccionar es la cual se está aplicando actualmente | | `merchant_id` (opcional) | string | Comercio al que pertenece el plan. Se omite cuando el plan aplica a todos los comercios | | `alias` (opcional) | string | Descripción para identificar el plan de pago. Se omite cuando no tiene valor | > - Si el comercio tiene planes seleccionados, se devuelven solo los planes sin `merchant_id` o los del propio comercio. > - Si el comercio no tiene ninguna selección, se devuelven todos los planes del cliente, incluidos los de otros comercios, con `is_selected` en `false`. ```bash curl --request GET \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/fee-rules \ --header 'Authorization: Bearer {access_token}' ``` **200** ```json [ { "id": "string", "payment_method": "string", "term": "integer", "commission": "number", "card_brand": "string", "has_installments": "boolean", "is_international": "boolean", "is_selected": "boolean", "merchant_id": "string", "alias": "string" } ] ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_post_create #### Planes de pago # Crear plan de pago ### `POST /v1/fee-rules` Este endpoint permite crear un plan de pago. En caso de que algún comercio no cuente con la correcta asignación de un plan de pago, dichos pagos no poseerán cálculos impositivos asociados. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `payment_method` | string | Tipo de medio de pago
Valores: [CREDIT, DEBIT, PREPAID] | | `term` | integer | Días de acreditación | | `commission` | number | Porcentaje de comisión a cobrar por pago. Por ejemplo, 1.5 equivale a 1,5 % | | `card_brand` | string | Tipo de tarjeta
Valores: [VISA, MASTERCARD, AMEX, CARNET, MAESTRO, DISCOVER, CABAL, NARANJA, UNIONPAY, DINERS] | | `has_installments` (opcional) | boolean | Aplica cuando se paga en cuotas (si no es enviado, por defecto es false) | | `is_international` (opcional) | boolean | Aplica para tarjetas internacionales (si no es enviado, por defecto es false) | | `merchant_id` (opcional) | string | Se puede indicar si aplica a un único comercio | | `alias` (opcional) | string | descripción para identificar el plan de pago | > El body es un único objeto, no un array. Para crear varios planes se envía un request por cada uno. La respuesta es `201` con el plan creado; `commission` se devuelve ya dividido por 100. ```bash curl --request POST \ --url https://api.menta.global/api/v1/fee-rules \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "payment_method": "string", "term": integer, "commission": number, "card_brand": "string", "has_installments": boolean, "merchant_id": "string", "alias": "string", "is_international": boolean }' ``` **201** ```json { "id": "string", "customer_id": "string", "merchant_id": "string", "payment_method": "string", "term": "integer", "card_brand": "string", "is_international": "boolean", "commission": "number", "has_installments": "boolean", "alias": "string" } ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "012", "message": "message not readable" } ] } ``` Se devuelve cuando falta alguno de los campos (`payment_method`, `term`, `commission` o `card_brand`) o el body no es un objeto válido. **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_post_apply #### Planes de pago # Seleccionar plan de pago ### `POST /v1/merchants/{merchant_id}/fee-rules` Permite seleccionar un listado de planes de pago para un comercio. Deben enviarse todos los que aplican al comercio: la lista enviada reemplaza la selección actual. Disponible con credenciales `CUSTOMER`. El body es un array JSON de identificadores (UUID) de planes de pago. La respuesta es `201` con el array de planes seleccionados. > - Un identificador inexistente responde `404`. > Asegúrate de que cada comercio tenga asociado un plan de pago para cada combinación posible, caso contrario no tendrá cálculos impositivos asociados ```bash curl --request POST \ --url https://api.menta.global/api/v1/merchants/{merchant_id}/fee-rules \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '[ "{fee_rule_id}", "{fee_rule_id2}" ]' ``` **201** ```json [ { "id": "string", "customer_id": "string", "merchant_id": "string", "payment_method": "string", "term": "integer", "card_brand": "string", "is_international": "boolean", "commission": "number", "has_installments": "boolean", "alias": "string" } ] ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "404", "message": "Rule with id not found" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_delete #### Planes de pago # Eliminar plan de pago ### `DELETE /v1/fee-rules/{id}` Permite la posibilidad de eliminar un plan de pago que no se encuentre actualmente en uso. > - La respuesta exitosa es `204`, sin contenido en el body. > - Un plan asignado a un comercio no se puede eliminar: la respuesta es `422`. > - Un `{id}` que no es un UUID devuelve `400`. ```bash curl --request DELETE \ --url https://api.menta.global/api/v1/fee-rules/{id} \ --header 'Authorization: Bearer {access_token}' ``` **204** Sin contenido en el body. **422** `422`: Unprocessable Entity ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "301", "message": "Rule with id is in use" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/plans_post_bulk_assign #### Planes de pago # Asignación masiva de planes ### `POST /v1/fee-rules/bulk-assign` Permite asignar un listado de planes de pago para un listado de comercios. ### `POST /v1/fee-rules/bulk-assign/all` Permite asignar un listado de planes de pago a todos los comercios. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchant_ids` (opcional) | `Array` | Identificadores de comercios. Se envía solo en bulk-assign | | `payment_plan_ids` | `Array` | Identificadores a planes de pago (ver más abajo). | **Nota:** El listado de planes de pago se obtiene desde [aquí](/api_reference/plans_getall). De ese listado obtenemos el campo ID al que hacemos referencia como payment_plan_id ``` [ { "id": "UUID", "payment_method": "string", "term": "integer", "commission": "number", "card_brand": "string", "is_selected": "boolean", "has_installments": "boolean", "is_international": "boolean" } ] ``` > Asegúrate de revisar bien los planes de pago y comercios. La asignación > reemplaza solo los planes actuales que tienen la misma combinación de > `card_brand`, `payment_method`, `is_international` y `has_installments` que > un plan enviado; los demás planes asignados se conservan. La respuesta es `201` > sin contenido en el body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/fee-rules/bulk-assign \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "merchant_ids": [ "{merchant_id1}", "{merchant_id2}" ], "payment_plan_ids" : [ "{payment_plan_id1}", "{payment_plan_id2}" ] }' ``` ```bash curl --request POST \ --url https://api.menta.global/api/v1/fee-rules/bulk-assign/all \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "payment_plan_ids" : [ "{payment_plan_id1}", "{payment_plan_id2}" ] }' ``` **201** Sin contenido en el body. **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/webhooks_get_subscriptions #### Webhooks # Obtener suscripciones ### `GET /v1/webhooks` Este endpoint permite obtener todas las suscripciones a Webhooks que tiene un cliente. Las suscripciones se devuelven como una lista de elementos e incluyen todas las del cliente, también las creadas a nivel de comercio. Esos ítems incluyen `merchant_id`; en las suscripciones del cliente el campo se omite. ```bash curl --request GET \ --url https://api.menta.global/api/v1/webhooks \ --header 'Authorization: Bearer {access_token}' \ ``` **200** ```json [ { "id": "string", "customer_id": "string", "notification_url": "string", "notification_type": "array" } ] ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_get_subscriptions_merchant #### Webhooks # Obtener suscripciones ### `GET /v1/merchants/{merchantId}/webhooks` Este endpoint permite obtener todas las suscripciones a Webhooks que tiene un comercio. Las suscripciones se devuelven como una lista de elementos. ```bash curl --request GET \ --url https://api.menta.global/api/v1/merchants/{merchantId}/webhooks \ --header 'Authorization: Bearer {access_token}' \ ``` **200** ```json [ { "id": "string", "customer_id": "string", "merchant_id" : "string", "notification_url": "string", "notification_type": "array" } ] ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_post_create_subscription #### Webhooks # Crear nueva suscripción ### `POST /v1/webhooks` Este endpoint permite suscribirse a notificaciones de Webhooks. Cuando te suscribes, recibirás notificaciones en una URL especificada y se utilizará una clave secreta para garantizar la seguridad de la comunicación. Para hacer esto, necesitas: Crear un token secreto para el webhook y guarda el token de forma segura en tu servidor para poder acceder a él posteriormente y validar las notificaciones del webhook. > Este servicio permite crear más de una suscripción manteniendo todos esos webhooks conectados, utilizando diferentes urls, tipos y secrets según sea necesario. Ten en cuenta que si tienes más de una suscripción al mismo url, recibirás más de un mensaje. > > Es recomendable solo tener una suscripción, esta opcionalidad permite informar a mas de un sistema a la vez en caso de ser necesario. > Cada notificación recibida incluye una firma que debe verificarse antes de procesarla. Ver [Validación de los webhooks](/services/webhooks#validación-de-los-webhooks). | Parámetro | Tipo | Descripción | | --- | --- | --- | | `secret_key` | string | Clave secreta para validar las firmas en las notificaciones de webhook. Debe contener como mínimo 8 caracteres, una mayúscula y un carácter especial de este conjunto: !@#$%^&* | | `notification_url` | string | URL donde se generará el evento de notificación | | `notification_type` | array | Lista de tipos de eventos a los que deseas suscribirte
Valores: [OPERATION_CREATED, TAXED_OPERATION_CREATED, ACTION_SEND_EMAIL_OPERATION] | ### Tipos de notificaciones * `OPERATION_CREATED`: Notificaciones sobre la creación de operaciones con datos básicos. * `TAXED_OPERATION_CREATED`: Notificaciones sobre la creación de operaciones con cálculos impositivos aplicados. * `ACTION_SEND_EMAIL_OPERATION`: Notificación para el envío de comprobante por email. > - Un `notification_type` desconocido o un JSON mal formado responde `400` con el mensaje `bad request`. El servicio también acepta el valor `MOCK_OPERATION_CREATED` (ver [Generar notificación de prueba](/api_reference/webhooks_post_create_mock)). > - La respuesta exitosa es `201` sin body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/webhooks \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "secret_key": "string", "notification_url": "string", "notification_type": ["OPERATION_CREATED", "TAXED_OPERATION_CREATED"] }' ``` **201** `201`: Created Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "400", "message": "bad request" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_post_create_subscription_merchant #### Webhooks # Suscripción por comercio ### `POST /v1/merchants/{merchantId}/webhooks` Este endpoint permite a los comercios suscribirse a notificaciones de Webhooks. Cuando te suscribes, recibirás notificaciones en una URL especificada y se utilizará una clave secreta para garantizar la seguridad de la comunicación. Para hacer esto, necesitas: Crear un token secreto para el webhook y guarda el token de forma segura en tu servidor para poder acceder a él posteriormente y validar las notificaciones del webhook. > Este servicio permite crear más de una suscripción manteniendo todos esos webhooks conectados, utilizando diferentes urls, tipos y secrets según sea necesario. Ten en cuenta que si tienes más de una suscripción al mismo url, recibirás más de un mensaje. > > Es recomendable solo tener una suscripción, esta opcionalidad permite informar a mas de un sistema a la vez en caso de ser necesario. > Cada notificación recibida incluye una firma que debe verificarse antes de procesarla. Ver [Validación de los webhooks](/services/webhooks#validación-de-los-webhooks). | Parámetro | Tipo | Descripción | | --- | --- | --- | | `secret_key` | string | Clave secreta para validar las firmas en las notificaciones de webhook. Debe contener como mínimo 8 caracteres, una mayúscula y un carácter especial de este conjunto: !@#$%^&* | | `notification_url` | string | URL donde se generará el evento de notificación | | `notification_type` | array | Lista de tipos de eventos a los que deseas suscribirte
Valores: [OPERATION_CREATED, TAXED_OPERATION_CREATED, ACTION_SEND_EMAIL_OPERATION] | ### Tipos de notificaciones * `OPERATION_CREATED`: Notificaciones sobre la creación de operaciones con datos básicos. * `TAXED_OPERATION_CREATED`: Notificaciones sobre la creación de operaciones con cálculos impositivos aplicados. * `ACTION_SEND_EMAIL_OPERATION`: Notificación para el envío de comprobante por email. > - Un `notification_type` desconocido o un JSON mal formado responde `400` con el mensaje `bad request`. El servicio también acepta el valor `MOCK_OPERATION_CREATED` (ver [Generar notificación de prueba](/api_reference/webhooks_post_create_mock)). > - La respuesta exitosa es `201` sin body. ```bash curl --request POST \ --url https://api.menta.global/api/v1/merchants/{merchantId}/webhooks \ --header 'Authorization: Bearer {access_token}' \ --header 'Content-Type: application/json' \ --data '{ "secret_key": "string", "notification_url": "string", "notification_type": ["OPERATION_CREATED", "TAXED_OPERATION_CREATED"] }' ``` **201** `201`: Created Sin contenido en el body. **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "400", "message": "bad request" } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_delete_subscription #### Webhooks # Borrar suscripción ### `DELETE /v1/webhooks/{subscription_id}` Este endpoint permite borrar una suscripción con su identificador. ```bash curl --request DELETE \ --url https://api.menta.global/api/v1/webhooks/{subscription_id} \ --header 'Authorization: Bearer {access_token}' \ ``` **200** ```json ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **403** `403`: Forbidden ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "403", "message": "Subscription not associated with customerId: X, merchantId: Y" } ] } ``` **404** `404`: Not Found ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "404", "message": "Not found subscription: " } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_post_create_mock #### Webhooks # Notificación de prueba ### `POST /v1/webhooks/mock/send-payment-notification` Este endpoint permite generar una notificación real para probar su correcta integración sin necesidad de generar pagos. Se generará una notificación de tipo `MOCK_OPERATION_CREATED` y será enviada de la misma manera que una operación `OPERATION_CREATED` compuesta con datos de prueba y su correspondientes headers de seguridad. De esta manera se podrá validar que su servidor está recibiendo correctamente las notificaciones y probar su integración de forma integral. El body es opcional: | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchant_id` (opcional) | string | Comercio para el que se genera la notificación | ```bash curl --request POST \ --url https://api.menta.global/api/v1/webhooks/mock/send-payment-notification \ --header 'Authorization: Bearer {access_token}' \ ``` **201** `201`: Created Sin contenido en el body. **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "401", "message": "Unauthorized" } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "code": "500", "message": "internal server error" } ] } ``` --- Fuente: /api_reference/webhooks_event_create # Webhooks Una vez que te suscribes a notificaciones de transacciones, recibirás eventos cuando se creen nuevas transacciones en tus comercios. **URL de notificación:** TU_URL, configurada en el alta de la suscripción **Esquema del cuerpo de la solicitud:** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `notification_type` | string | Tipo de notificación
Valores: [OPERATION_CREATED, TAXED_OPERATION_CREATED] | | `merchant_id` | string | ID del comercio | | `user` | string | Usuario que realizó la operación | | `datetime` | string | Fecha y hora de la operación
Valores: [2000-12-31T00:00:00Z] | | `detail` | object | Detalles del evento por cada operación | ## Evento de operación creada **Tipo de evento:** OPERATION_CREATED **Esquema del cuerpo de la solicitud:** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `detail.terminal_id` | string | ID del terminal | | `detail.operation_id` | string | ID de la operación | | `detail.qr_id` (opcional) | string | ID del qr | | `detail.ticket_id` | string | ID del ticket | | `detail.operation_type` | string | Tipo de operación
Valores: [PAYMENT, REFUND, ANNULMENT] | | `detail.operation_status` | string | Estado de la operación
Valores: [FAILED, APPROVED, REJECTED] | | `detail.currency` | string | Moneda de la operación
Valores: [ARS, MEX] | | `detail.operation_amount` | string | Monto de la operación, enviado como cadena de texto | | `detail.operation_additional_info` | string | Información adicional de la operación | | `detail.payment_method_type` | string | Tipo de método de pago
Valores: [CREDIT, DEBIT, PREPAID, QR] | | `detail.payment_method_detail` | string | Detalle del método de pago | | `detail.transaction_id` | string | ID de la transacción que vincula las operaciones | | `detail.reference_operation_id` (opcional) | string | ID de operación de pago de referencia (solo aplica para REFUND y ANNULMENT) | ## Evento de operación con cálculos impositivos **Tipo de evento:** TAXED_OPERATION_CREATED **Esquema del cuerpo de la solicitud:** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `detail.customer_id` | string | ID del cliente | | `detail.merchant_id` | string | ID del comercio | | `detail.terminal_id` | string | ID de la terminal | | `detail.merchant_additional_info` | string | Información adicional del comercio | | `detail.transaction_id` | string | ID de la transacción | | `detail.operation_id` | string | ID de la operación | | `detail.request_id` (opcional) | string | Identificador de la solicitud que originó la operación | | `detail.operation_number` | integer | Número de la operación | | `detail.operation_additional_info` | string | Información adicional de la operación | | `detail.serial_number` | string | Número de serie | | `detail.operation_type` | string | Tipo de operación
Valores: [PAYMENT, REFUND, ANNULMENT] | | `detail.payment_method` | string | Método de pago
Valores: [CREDIT, DEBIT, PREPAID, QR] | | `detail.gross_amount` | number | Monto bruto de la operación | | `detail.currency` | string | Moneda de la operación
Valores: [ARS, MEX] | | `detail.datetime` | string | Fecha de la operación | | `detail.status` | string | Estado de la operación
Valores: [FAILED, APPROVED, REVERSED, REJECTED] | | `detail.installments` | integer | Número de cuotas | | `detail.financing` (opcional) | string | Tipo de financiación de cuotas | | `detail.user` | string | Usuario que realizó la operación | | `detail.acquirer` | string | Adquirente que realizó la operación
Valores: [PRISMA, GPS, BANORTE, AMEX] | | `detail.operation_detail` | object | Detalles adicionales de la operación | | `detail.tax_info` | object | Información de impuestos | **Esquema del detalle de la operación (operation_detail):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `reference_operation_id` (opcional) | string | ID de operación de pago de referencia (solo aplica para REFUND y ANNULMENT) | | `reference_operation_number` (opcional) | integer | Número de operación de pago de referencia (solo aplica para REFUND y ANNULMENT) | | `qr_id` (opcional) | string | ID del código QR asociado a la transacción | | `rrn` (opcional) | string | Número de referencia de la transacción | | `authorization_code` (opcional) | string | Código de autorización de la transacción | | `additional_info` (opcional) | string | Información adicional sobre la operación | | `card` (opcional) | object | Detalles de la tarjeta utilizada en la operación | | `holder_name` (opcional) | string | Nombre del titular de la tarjeta | | `holder_document` (opcional) | string | Documento de identificación del titular de la tarjeta | | `description` (opcional) | string | Descripción de la operación. Si la operación no tiene cálculo de impuestos, el valor es el texto fijo Error al calcular los impuestos | | `response_description` (opcional) | string | Descripción de la respuesta del adquirente | | `response_code` (opcional) | string | Código de respuesta del adquirente | | `response_name` (opcional) | string | Nombre de la respuesta del adquirente | | `situation_code` (opcional) | string | Código de situación de la operación | | `situation_message` (opcional) | string | Mensaje de situación de la operación | | `tip_amount` (opcional) | number | Monto de las propinas | | `input_mode` (opcional) | string | Método de lectura
Valores: [CONTACTLESS, EMV, STRIPE] | **Esquema del detalle de la tarjeta (card):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `card_bin` (opcional) | string | Número bin de la tarjeta | | `card_mask` (opcional) | string | Número enmascarado de la tarjeta | | `card_brand` (opcional) | string | Marca de la tarjeta | | `is_international_card` (opcional) | boolean | Si la tarjeta es internacional | **Esquema de la información de impuestos (tax_info):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `term` | integer | Cantidad de días | | `payment_date` | string | Fecha de pago
Valores: [2000-12-31T00:00:00Z] | | `net_amount` | number | Monto neto | | `customer_term` | integer | Cantidad de días del cliente | | `customer_payment_date` | string | Fecha de pago del cliente
Valores: [2000-12-31T00:00:00Z] | | `customer_net_amount` | number | Monto neto del cliente | | `tax_breakdown` | array | Desglose de impuestos | **Esquema del desglose de impuestos (tax_breakdown):** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `tax_code` | string | Código de impuesto | | `reference` | string | Descripción del impuesto | | `amount` | number | Monto del impuesto | | `rate` (opcional) | number | Tasa del impuesto | **Códigos de desglose de impuestos (tax_code):** - **MENTA_TO_CUSTOMER_COMMISSION**: Comisión de Menta - **MENTA_TO_CUSTOMER_COMMISSION_VAT_TAX**: IVA sobre la comisión de Menta - **MENTA_DISCOUNT**: Descuento de Menta - **ACQUIRER_TO_CUSTOMER_COMMISSION**: Comisión de la condición comercial - **ACQUIRER_TO_CUSTOMER_COMMISSION_VAT_TAX**: IVA sobre la comisión de adquiriente - **CUSTOMER_TO_MERCHANT_COMMISSION**: Tasa del plan de pago que pone el cliente - **CUSTOMER_TO_MERCHANT_COMMISSION_VAT_TAX**: IVA sobre la tasa del plan de pago - **FINANCIAL_COST**: Costo financiero de la tarjeta - **FINANCIAL_COST_VAT_TAX**: IVA sobre el costo financiero - **MERCHANT_VAT_TAX**: IVA sobre el total del monto del comercio - **MERCHANT_INCOME_TAX**: Impuesto a las ganancias del comercio - **CUSTOMER_VAT_TAX**: IVA sobre el total del monto del cliente - **CUSTOMER_INCOME_TAX**: Impuesto a las ganancias del cliente - **MERCHANT_IIBB_TAX**: Ingresos brutos del comercio - **INSTALLMENT_AMOUNT**: Importe por cuota ## Evento de envío de comprobante por email **Tipo de evento:** ACTION_SEND_EMAIL_OPERATION **Esquema del cuerpo de la solicitud:** El objeto `detail` es el mismo de la operación con cálculos impositivos (`TAXED_OPERATION_CREATED`). Además, el cuerpo de la notificación incluye el siguiente campo de primer nivel, al mismo nivel que `notification_type`, `merchant_id`, `user`, `datetime` y `detail` (no dentro de `detail`): | Parámetro | Tipo | Descripción | | --- | --- | --- | | `destination_email` | string | Email del destinatario del comprobante de pago. | #### Notificación base ```json { "notification_type": "OPERATION_CREATED", "merchant_id": "db3ae307-4a5c-4cbb-b48c-80bf1a3fde1d", "user": "user@email.com", "datetime": "2022-12-31T23:23:23Z", "detail": { ... } } ``` #### Notificación: OPERATION_CREATED ```json { "notification_type": "OPERATION_CREATED", "merchant_id": "db3ae307-4a5c-4cbb-b48c-80bf1a3fde1d", "user": "user@email.com", "datetime": "2022-12-31T23:23:23Z", "detail": { "terminal_id": "72171704-7806-4347-b08b-bc2d2d96e68e", "operation_id": "2fce7d49-f3e2-4b1f-a7bb-7f16d3ea64a2", "ticket_id": "111111111", "operation_type": "PAYMENT", "qr_id": null, "operation_status": "APPROVED", "currency": "ARS", "operation_amount": "200000", "operation_additional_info": "ABC1234", "payment_method_type": "DEBIT", "payment_method_detail": "VISA", "transaction_id": "bbc7571f-750c-43b5-9baf-f5d1d9a4dc42", "reference_operation_id": "50c7571f-750c-43b5-9baf-f5d1d9a4d022" } } ``` #### Notificación: TAXED_OPERATION_CREATED ```json { "notification_type": "TAXED_OPERATION_CREATED", "merchant_id": "c2192cf8-e221-4ccc-83d4-1c2105d46b9a", "user": "user@email.com", "datetime": "2023-09-19T20:07:32Z", "detail": { "customer_id": "a9733025-9b74-4cf9-b4fb-f71eeb037054", "merchant_id": "45b1d469-e3e5-4ac6-8fe2-2e620d00f9a8", "terminal_id": "c08d4aa6-d560-41c1-acbf-b183eb3794dd", "merchant_additional_info": "35701", "transaction_id": "1b35e569-dc28-47be-897f-1c2a9e5a5305", "operation_id": "6debca65-4faf-48fd-a065-faf32735a52a", "operation_number": 183863925, "operation_additional_info": "", "serial_number": "98282329166214", "operation_type": "PAYMENT", "payment_method": "CREDIT", "gross_amount": 21, "currency": "ARS", "datetime": "2024-03-05T20:21:03-03:00", "status": "APPROVED", "installments": 1, "financing": "ESTANDAR", "user": "user@email.com", "acquirer": "PRISMA", "operation_detail": { "card": { "card_bin": "47617390", "card_mask": "XXXXXXXXXXXX0119", "card_brand": "VISA", "is_international_card": false }, "holder_name": "Tarjetahabiente", "holder_document": "", "description": "APROBADO", "input_mode": "CONTACTLESS", "reference_operation_number": 394221095, "reference_operation_id": "50c7571f-750c-43b5-9baf-f5d1d9a4d022", "rrn": "1234567890", "authorization_code": "123456" }, "tax_info": { "term": 2, "payment_date": "2024-02-23T09:26:54-03:00", "net_amount": 18.02, "customer_term": 8, "customer_payment_date": "2024-03-04T09:26:54-03:00", "customer_net_amount": 20.54, "tax_breakdown": [ { "tax_code": "MENTA_TO_CUSTOMER_COMMISSION", "reference": "Menta to customer commission", "amount": 0.07, "rate": 0.35 }, { "tax_code": "MENTA_TO_CUSTOMER_COMMISSION_VAT_TAX", "reference": "Menta to customer commission VAT Tax", "amount": 0.02, "rate": 0.21 }, { "tax_code": "ACQUIRER_TO_CUSTOMER_COMMISSION", "reference": "Acquirer to customer commission", "amount": 0.38, "rate": 1.8 }, { "tax_code": "ACQUIRER_TO_CUSTOMER_COMMISSION_VAT_TAX", "reference": "Acquirer to customer commission VAT Tax", "amount": 0.08, "rate": 0.21 }, { "tax_code": "CUSTOMER_TO_MERCHANT_COMMISSION", "reference": "Customer to merchant commission", "amount": 1.26, "rate": 5.99 }, { "tax_code": "CUSTOMER_TO_MERCHANT_COMMISSION_VAT_TAX", "reference": "Customer to merchant commission VAT Tax", "amount": 0.26, "rate": 0.21 }, { "tax_code": "MERCHANT_VAT_TAX", "reference": "Merchant VAT Tax", "amount": 0.58, "rate": 0.21 }, { "tax_code": "MERCHANT_INCOME_TAX", "reference": "Merchant Income Tax", "amount": 0.19 }, { "tax_code": "MERCHANT_IIBB_TAX", "reference": "Merchant IIBB Tax", "amount": 0.68 } ] } } } ``` --- Fuente: /api_reference/terminals_get #### Terminales # Obtener terminales ### `GET /v1/terminals` Este endpoint permite obtener las terminales asociadas a un cliente. | Parámetro | Tipo | Descripción | | --- | --- | --- | | `page` (opcional) | integer | El número de la página de resultados a obtener (>=0). Por defecto: 0 | | `size` (opcional) | integer | El número de resultados por página (>=1). Por defecto: 10. | | `serialCode` (opcional) | string | Filtro por número de serie de la terminal | | `terminalId` (opcional) | string | Filtro por identificador de terminal (UUID) | | `status` (opcional) | string | Filtro por estado de la terminal.
Valores: [ACTIVE, INACTIVE] | | `stock` (opcional) | boolean | Filtro por terminales en stock. Por defecto: false | | `createDate` (opcional) | string | Filtro por fecha de creación | > - `features` puede contener `MANUAL`, `STRIPE`, `CHIP` y `CONTACTLESS`. > - Cada terminal incluye también `color`, `imei1`, `imei2`, `mode` y el enlace `_links.self`. ```bash curl --request GET \ --url https://api.menta.global/api/v1/terminals \ --header 'Authorization: Bearer {access_token}' \ --url-query 'page=integer' \ --url-query 'size=integer' ``` **200** ```json { "_embedded": { "terminals": [ { "id": "string", "merchant_id": "string", "customer_id": "string", "serial_code": "string", "hardware_version": "string", "trade_mark": "string", "model": "string", "status": "ACTIVE", "features": [ "CONTACTLESS" ], "color": "string", "imei1": "string", "imei2": "string", "mode": "string", "create_date": "2019-08-24T14:15:22Z", "update_date": "2019-08-24T14:15:22Z", "delete_date": "2019-08-24T14:15:22Z", "_links": { "self": { "href": "string" } } } ] }, "page": { "size": 0, "total_elements": 0, "total_pages": 0, "number": 0 } } ``` **400** `400`: Bad Request ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Invalid credentials", "metadata": { "query_string": "..." } } ] } ``` **401** `401`: Unauthorized ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Authentication failed", "metadata": { "query_string": "..." } } ] } ``` **500** `500`: Internal Server Error ```json { "datetime": "2023-11-14T12:34:56Z", "errors": [ { "message": "Internal server error", "metadata": { "query_string": "..." } } ] } ``` --- Fuente: /api_reference/cloud_terminals_payment_intentions_post #### Intenciones de Pago # Crear intención de pago ### `POST /cloud-terminals/payment-intentions` Permite crear una nueva intención de pago sobre una terminal física del ecosistema Menta. Al invocarlo se envía el importe y la información del comercio a la terminal para que la persona usuaria confirme la compra. No realiza el cobro inmediato; simplemente prepara la transacción en la terminal. La terminal indicada debe estar **CONECTADA**. Esta validación aplica a las acciones que se envían a la terminal (creación y cancelación de intención). Si no hay terminal conectada, la API responde **422** con el mensaje *"No connected terminal found for the provided parameters"* y no persiste ni envía el comando. > - El identificador de la intención (`request_id`) lo genera el servidor y se devuelve en el body de la respuesta `201`. Conserva ese valor para consultar o cancelar la intención. > - El rol `CUSTOMER` o `MERCHANT` puede invocar el endpoint. El comercio o cliente debe tener habilitada la funcionalidad `CLOUD_TERMINAL`; de lo contrario la respuesta es `403`. #### Encabezados ```bash Authorization: Bearer {access_token} ``` #### Body (JSON) | Parámetro | Tipo | Descripción | | --- | --- | --- | | `customer_id` | string | Identificador del cliente provisto por Menta | | `merchant_id` | string | Identificador del comercio | | `terminal_id` | string | Identificador de la terminal donde se realizará el cobro | | `amount` | string | Importe a cobrar como cadena numérica en unidades mínimas, sin separador decimal (^[0-9]+$). Ejemplo: 10000 equivale a 100.00 | | `payment_method` (opcional) | string | Método de pago, por ejemplo CREDIT o DEBIT | | `card_brand` (opcional) | string | Marca de la tarjeta (VISA, MASTERCARD, etc.) | | `installments` (opcional) | integer | Número de cuotas. Debe ser 0 o mayor | | `additional_info` (opcional) | string | Texto opcional visible en reportes/recibos. Máximo 255 caracteres | | `is_tip_allowed` (opcional) | boolean | Permite agregar propina en la terminal. Por defecto: false | | `is_print_allowed` (opcional) | boolean | Habilita impresión de comprobante en la terminal. Por defecto: true | ```bash curl --location --request POST 'https://api.menta.global/api/v1/cloud-terminals/payment-intentions' \ --header 'Authorization: Bearer {access_token}' \ --data-raw '{ "customer_id": "{customer_id}", "merchant_id": "{merchant_id}", "terminal_id": "{terminal_id}", "amount": "10000", "payment_method": "CREDIT", "card_brand": "VISA", "installments": 3, "additional_info": "Compra en restaurante - Mesa 5", "is_tip_allowed": true, "is_print_allowed": true }' ``` **201** `201`: Created ```json { "request_id": "84d8c5dc-c71a-42de-80e7-9a457e174be3", "terminal_id": "{terminal_id}", "merchant_id": "{merchant_id}", "customer_id": "{customer_id}", "data": { "amount": "10000", "payment_method": "CREDIT", "card_brand": "VISA", "installments": 3, "additional_info": "Compra en restaurante - Mesa 5", "is_print": true, "is_tip": true } } ``` Los campos sin valor se omiten. En `data`, `is_print` e `is_tip` reflejan `is_print_allowed` e `is_tip_allowed`. **400** `400`: Bad Request ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [ { "message": "must be a numeric string (e.g. '10000' = 100.00)" } ] } ``` Ejemplo para un `amount` inválido. Los demás campos validados usan mensajes como `must be a valid UUID` o `must not exceed 255 characters`. **401** `401`: Unauthorized ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Unauthorized" }] } ``` **403** `403`: Forbidden ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Feature CLOUD_TERMINAL is not enabled" }] } ``` También responde `403` si el mensaje es `Feature CLOUD_TERMINAL is not available` o si el comercio o la terminal no pertenecen al solicitante. **409** `409`: Conflict ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Event already exists for requestId and terminalId" }] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [ { "resource": "/cloud-terminals/payment-intentions", "message": "No connected terminal found for the provided parameters" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` **503** `503`: Service Unavailable ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [ { "resource": "/cloud-terminals/payment-intentions", "message": "A required dependency is temporarily unavailable" } ] } ``` --- Fuente: /api_reference/cloud_terminals_payment_intentions_delete #### Intenciones de Pago # Cancelar intención de pago ### `DELETE /cloud-terminals/payment-intentions` Permite cancelar una intención de pago previamente generada en una terminal antes de que la persona usuaria complete la transacción. Al cancelar la intención, la terminal vuelve a la pantalla de espera y queda lista para recibir una nueva solicitud. La terminal indicada debe estar **CONECTADA**. Si no hay terminal conectada, la API responde **422** y no envía la cancelación. Cuando la cancelación se liquida (`EXECUTED` o `NOT_DELIVERED`), la intención de pago relacionada pasa a `CANCELLED`. #### Parámetros de consulta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchantId` (opcional) | string | Si el access_token es de un usuario CUSTOMER, se debe enviar el identificador del comercio. Si el usuario es MERCHANT no hace falta enviarlo. | | `terminalId` | string | Identificador de la terminal | | `requestId` | string | Identificador de la intención a cancelar: el `request_id` que devuelve el servidor al crearla | > - La respuesta exitosa es `204` sin body e incluye el encabezado `X-API-REQUEST-ID` con el `request_id` de la cancelación. > - Si ya existe una cancelación para ese `requestId` y terminal, la respuesta es `409`. > - Para usuarios CUSTOMER y MERCHANT, un comercio o terminal inexistente o ajeno responde `403`. #### Encabezados ```bash Authorization: Bearer {access_token} ``` ```bash curl --location --request DELETE \ 'https://api.menta.global/api/v1/cloud-terminals/payment-intentions?terminalId={terminal_id}&requestId={request_id}' \ --header 'Authorization: Bearer {access_token}' \ ``` **204** `204`: No Content **401** `401`: Unauthorized ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Unauthorized" }] } ``` **409** `409`: Conflict ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Event already exists for requestId and terminalId" }] } ``` **422** `422`: Unprocessable Entity ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [ { "resource": "/cloud-terminals/payment-intentions", "message": "No connected terminal found for the provided parameters" } ] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/cloud_terminals_payment_intentions_list_get #### Intenciones de Pago # Obtener intenciones de pago ### `GET /cloud-terminals/payment-intentions` Obtiene las intenciones de pago (eventos de tipo `CLOUD_TERMINAL`) con filtros por terminal, requestId, rango de fechas, flow y paginación. Devuelve los eventos de tipo `CLOUD_TERMINAL`, que incluyen intenciones de pago y cancelaciones. Para acotar el resultado se puede enviar `flow`. #### Parámetros de consulta | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchantId` (opcional) | string | Filtro por comercio | | `terminalId` (opcional) | string | Identificador del terminal | | `requestId` (opcional) | string | Identificador de la intención de pago | | `start` (opcional) | string | Inicio del rango. Formato: yyyy-MM-dd'T'HH:mm:ssXXX, incluyendo el offset (por ejemplo 2026-09-30T00:00:00-03:00 o 2026-09-30T00:00:00Z) | | `end` (opcional) | string | Fin del rango. Mismo formato que start, incluyendo el offset | | `flow` (opcional) | string | Filtro por flow | | `status` (opcional) | string | Filtro por estado de la intención, igual al valor de la tabla de estados | | `page` (opcional) | integer | Número de página (0-based). Por defecto: 0 | | `size` (opcional) | integer | Tamaño de página. Por defecto: 10 | > **Advertencia:** - `start` y `end` requieren un offset (`Z` o por ejemplo `-03:00`). En la URL, el signo `+` de un offset debe codificarse como `%2B`. ## Estados de intenciones de pago | Valor | Descripción | |----------------|-------------| | `CREATED` | Creado. | | `PENDING` | Pendiente de entrega a la terminal. | | `DELIVERED` | Entregado a la terminal. | | `PROCESSING` | La terminal recibió la solicitud de intención de pago. | | `EXECUTED` | Cobro confirmado por la operación (estado final). | | `CANCELLED` | Intención anulada, o cancelada automáticamente si tras 3 minutos no se recibió la confirmación del cobro (estado final). | | `NOT_DELIVERED`| No entregado a la terminal (estado final de error). | ## Filtros válidos para el parámetro `flow` | Valor | Descripción | |-----------------------|-----------------------| | `PAYMENT_INTENT` | Intención de pago. | | `PAYMENT_CANCELLATION`| Cancelación de pago. | #### Encabezados ```bash Authorization: Bearer {access_token} ``` ```bash curl --location --request GET \ 'https://api.menta.global/api/v1/cloud-terminals/payment-intentions?terminalId={terminal_id}&page=0&size=10' \ --header 'Authorization: Bearer {access_token}' ``` **200** `200`: OK ```json { "data": [ { "customer_id": "1176a88f-b436-4068-8189-5bfb19bfc3a2", "merchant_id": "5f520602-38f8-4067-a8b1-fe363f8b481d", "terminal_id": "42cc723b-017d-4ecf-ab10-05f20bafa4da", "request_id": "a7f0f6e7-a6fb-4cec-ac08-f43ded94308a", "type": "CLOUD_TERMINAL", "status": "CREATED", "created_at": "2026-02-10T14:59:07Z", "data": { "flow": "PAYMENT_INTENT", "amount": "10000", "payment_method": "CREDIT", "card_brand": "MASTERCARD", "installments": 3, "additional_info": "Pago de prueba", "is_print_allowed": true, "is_tip_allowed": true } } ], "page": { "size": 10, "total_elements": 10, "total_pages": 1, "number": 0 } } ``` **401** `401`: Unauthorized ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Unauthorized" }] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ``` --- Fuente: /api_reference/cloud_terminals_payment_intentions_get #### Intenciones de Pago # Obtener intención de pago ### `GET /cloud-terminals/payment-intentions/{requestId}` Permite consultar el detalle de una única intención de pago. Se debe indicar el identificador de la intención a consultar (`requestId`). El servicio consulta los reportes de transacciones y devuelve los datos de la transacción asociada a la intención, incluyendo impuestos e información de la tarjeta. El campo `status` es el estado de la transacción (por ejemplo `APPROVED`), no el estado de la intención. Mientras no exista una transacción, la respuesta es `404`. Los estados de la intención (`CREATED`, `PROCESSING`, etc.) se consultan en el endpoint [Obtener intenciones de pago](/api_reference/cloud_terminals_payment_intentions_list_get). | Parámetro | Tipo | Descripción | | --- | --- | --- | | `requestId` | string | UUID v4 que identifica la intención (parámetro de ruta) | **Parámetros de consulta** | Parámetro | Tipo | Descripción | | --- | --- | --- | | `merchantId` (opcional) | string | Si el access_token es de un usuario CUSTOMER, se debe enviar el identificador del comercio. Si el usuario es MERCHANT no hace falta enviarlo. | > El `requestId` puede obtenerse del response del POST al crear la intención (Crear intención de pago) o del endpoint [Obtener intenciones de pago](/api_reference/cloud_terminals_payment_intentions_list_get), que incluye el `request_id` en cada ítem de la lista. > > Campos adicionales de la respuesta: `operation_detail` puede incluir `reference_operation_number` y `reference_operation_id` (se omiten cuando no tienen valor) y cada ítem de `tax_breakdown` tiene los campos `tax_code`, `reference`, `amount` y `rate`. #### Encabezados ```bash Authorization: Bearer {access_token} ``` ```bash curl --location --request GET \ 'https://api.menta.global/api/v1/cloud-terminals/payment-intentions/{request_id}' \ --header 'Authorization: Bearer {access_token}' ``` **200** `200`: OK ```json { "request_id": "84d8c5dc-c71a-42de-80e7-9a457e174be3", "customer_id": "0862687a-7a5e-49c2-bcb9-c3342458c7ac", "merchant_id": "85628b4b-040e-43c6-badf-9150ae39996a", "terminal_id": "c8282b1e-5161-4a00-9350-a16cbe194f73", "operation_additional_info": "", "amount": 1150, "status": "APPROVED", "detail": { "customer_id": "0862687a-7a5e-49c2-bcb9-c3342458c7ac", "merchant_id": "85628b4b-040e-43c6-badf-9150ae39996a", "terminal_id": "c8282b1e-5161-4a00-9350-a16cbe194f73", "merchant_additional_info": "", "transaction_id": "f7fb50ad-eef9-45c9-a14d-2b0ab0a7d3b6", "operation_id": "20781f10-656e-493d-979d-7320b4983f84", "operation_number": 500534923, "operation_additional_info": "", "serial_number": "33633265123459", "operation_type": "PAYMENT", "payment_method": "CREDIT", "gross_amount": 1150, "currency": "ARS", "datetime": "2025-10-14T10:41:04-03:00", "status": "APPROVED", "installments": 1, "financing": "ESTANDAR", "user": "caja01@restaurante.com", "acquirer": "PRISMA", "operation_detail": { "tip_amount": 150.00, "card": { "card_bin": "45079900", "card_mask": "XXXXXXXXXXXX9473", "card_brand": "VISA", "is_international_card": false }, "holder_name": "Tarjetahabiente", "holder_document": "", "description": "Transacciones exitosas", "input_mode": "CONTACTLESS", "rrn": "000000004883", "authorization_code": "B19162" }, "tax_info": { "term": 1, "payment_date": "2025-10-15T12:00:00-03:00", "net_amount": -987.90, "customer_term": 1, "customer_payment_date": "2025-10-15T12:00:00-03:00", "customer_net_amount": 987.90, "tax_breakdown": [] } } } ``` **401** `401`: Unauthorized ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "Unauthorized" }] } ``` **404** `404`: Not Found ```json { "datetime": "2025-06-11T13:26:01.176Z", "errors": [{ "message": "An error occurred while finding transaction " }] } ``` **500** `500`: Internal Server Error ```json { "status_code": 500, "message": "internal server error" } ```