---
title: Integración
slug: puntos-de-venta
icon: {"lucideIcon":"BadgeCheck"}
docTags: 
createdAt: 2024-05-02T20:15:08.892Z
---

Las siguientes apis te permitirán interactuar con tus puntos de venta y solicitar operaciones de pago.

**Tipos de Punto de Venta**

- Dispositivos Físicos (POS)
- QR (Estáticos)

**Dispositivos Físicos**

El DEVICE del POS se puede obtener en la pantalla de Configuración => Información del Sistema => Referencia o tomando el Serial Number del dispositivo ( Etiqueta en la parte posterior ) y agregando el identificador de la marca separado por dos puntos.

Marcas:

- Ingenico: ING. Ej. "ING:123AAA1235566"
- Urovo: URO. Ej. "URO:123AAA1235566"
- Verifone
- NexGo
- Newland

**Tipos de Operaciones Permitidas**

- Pago en POS con Tarjeta, QR y cualquier otro medio de pago aceptado
- QR Estático con Orden



:::ApiMethodV2
```json
{
  "name": "Solicitar operación en Punto de Venta",
  "method": "POST",
  "url": "https://api.mobbex.com/p/pos/:device/operation",
  "description": "Esta api te permitirá generar una intención de cobro sobre un punto de venta",
  "tab": "examples",
  "examples": {
    "languages": [
      {
        "id": "8mBbDJwNIYYr8MAGQFZCq",
        "language": "curl",
        "code": "curl --location --globoff 'https://api.mobbex.com/p/pos/:uid/operation/{uid}' \\\n--header 'Accept: application/json' \\\n--header 'Content-Type: application/json' \\\n--data '{\"total\":\"Number\",\"currency\":\"string\",\"description\":\"string\",\"reference\":\"string\",\"test\":\"Boolean\",\"webhook\":\"string\",\"intent\":\"string\",\"installments\":\"Array\",\"sources\":\"Array\",\"timeout\":\"Number\"}'",
        "customLabel": ""
      },
      {
        "id": "DQP2yQ1SThcUx3UmVL3iy",
        "language": "nodejs",
        "code": "var request = require('request');\nvar options = {\n   'method': 'POST',\n   'url': 'https://api.mobbex.com/p/pos/:uid/operation/{uid}',\n   'headers': {\n      'Accept': 'application/json',\n      'Content-Type': 'application/json'\n   },\n   body: JSON.stringify({\n      \"total\": \"Number\",\n      \"currency\": \"string\",\n      \"description\": \"string\",\n      \"reference\": \"string\",\n      \"test\": \"Boolean\",\n      \"webhook\": \"string\",\n      \"intent\": \"string\",\n      \"installments\": \"Array\",\n      \"sources\": \"Array\",\n      \"timeout\": \"Number\"\n   })\n\n};\nrequest(options, function (error, response) {\n   if (error) throw new Error(error);\n   console.log(response.body);\n});\n",
        "customLabel": ""
      },
      {
        "id": "vj0VPw4rVaqQpImeRk2-h",
        "language": "javascript",
        "code": "var myHeaders = new Headers();\nmyHeaders.append(\"Accept\", \"application/json\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\n   \"total\": \"Number\",\n   \"currency\": \"string\",\n   \"description\": \"string\",\n   \"reference\": \"string\",\n   \"test\": \"Boolean\",\n   \"webhook\": \"string\",\n   \"intent\": \"string\",\n   \"installments\": \"Array\",\n   \"sources\": \"Array\",\n   \"timeout\": \"Number\"\n});\n\nvar requestOptions = {\n   method: 'POST',\n   headers: myHeaders,\n   body: raw,\n   redirect: 'follow'\n};\n\nfetch(\"https://api.mobbex.com/p/pos/:uid/operation/{uid}\", requestOptions)\n   .then(response => response.text())\n   .then(result => console.log(result))\n   .catch(error => console.log('error', error));",
        "customLabel": ""
      },
      {
        "id": "mHfACFDR1UablcsjW4lX6",
        "language": "python",
        "code": "import requests\nimport json\n\nurl = \"https://api.mobbex.com/p/pos/:uid/operation/{uid}\"\n\npayload = json.dumps({\n   \"total\": \"Number\",\n   \"currency\": \"string\",\n   \"description\": \"string\",\n   \"reference\": \"string\",\n   \"test\": \"Boolean\",\n   \"webhook\": \"string\",\n   \"intent\": \"string\",\n   \"installments\": \"Array\",\n   \"sources\": \"Array\",\n   \"timeout\": \"Number\"\n})\nheaders = {\n   'Accept': 'application/json',\n   'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n",
        "customLabel": ""
      },
      {
        "id": "sFKRjOo8kCa9ZRcNRcGrD",
        "language": "ruby",
        "code": "require \"uri\"\nrequire \"json\"\nrequire \"net/http\"\n\nurl = URI(\"https://api.mobbex.com/p/pos/:uid/operation/{uid}\")\n\nhttps = Net::HTTP.new(url.host, url.port)\nhttps.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Accept\"] = \"application/json\"\nrequest[\"Content-Type\"] = \"application/json\"\nrequest.body = JSON.dump({\n   \"total\": \"Number\",\n   \"currency\": \"string\",\n   \"description\": \"string\",\n   \"reference\": \"string\",\n   \"test\": \"Boolean\",\n   \"webhook\": \"string\",\n   \"intent\": \"string\",\n   \"installments\": \"Array\",\n   \"sources\": \"Array\",\n   \"timeout\": \"Number\"\n})\n\nresponse = https.request(request)\nputs response.read_body\n",
        "customLabel": ""
      }
    ],
    "selectedLanguageId": "8mBbDJwNIYYr8MAGQFZCq"
  },
  "results": {
    "languages": [
      {
        "id": "n9FBuEfajuBqxp7AG-qsB",
        "language": "200",
        "customLabel": "",
        "code": "{\n    \"result\": true,\n    \"data\": {\n        \"intent\": {\n            \"type\": \"payment.v2\",\n            \"token\": \"620198a7-291e-4bde-9248-43b34d59e8c9\"\n        },\n        \"test\": true\n    }\n}"
      },
      {
        "id": "ON09lZuoPRkHuvuBgWdWN",
        "language": "404",
        "customLabel": "",
        "code": "{\n      \"message\": \"Ain't no cake like that.\"\n    }"
      }
    ],
    "selectedLanguageId": "n9FBuEfajuBqxp7AG-qsB"
  },
  "request": {
    "pathParameters": [
      {
        "name": "device",
        "kind": "required",
        "type": "string",
        "description": "ID del dispositivo sobre el que se solicita una operación ",
        "children": []
      }
    ],
    "queryParameters": [],
    "headerParameters": [
      {
        "name": "x-api-key",
        "kind": "required",
        "type": "string",
        "description": "API Key de la entidad",
        "children": []
      },
      {
        "name": "x-access-token",
        "kind": "required",
        "type": "String",
        "description": "Access Token de la entidad",
        "children": []
      },
      {
        "name": "Content-Type",
        "kind": "required",
        "type": "string",
        "description": "application/json",
        "children": []
      }
    ],
    "bodyDataParameters": [
      {
        "name": "total",
        "kind": "required",
        "type": "Number",
        "description": "Monto de la operación a solicitar"
      },
      {
        "name": "currency",
        "kind": "required",
        "type": "string",
        "description": "Moneda de la operación. Formato letras ISO 4217",
        "children": []
      },
      {
        "name": "description",
        "kind": "optional",
        "type": "string",
        "description": "Descripción de la operación",
        "children": []
      },
      {
        "name": "reference",
        "kind": "optional",
        "type": "string",
        "description": "Reference externa de la operación asignada por el consumidor del servicio. El servicio no permite 2 operaciones aprobadas con el mismo reference",
        "children": []
      },
      {
        "name": "test",
        "kind": "optional",
        "type": "Boolean",
        "description": "Indica si la operación se realiza en modo de pruebas",
        "children": []
      },
      {
        "name": "webhook",
        "kind": "optional",
        "type": "string",
        "description": "URL donde se realizará la notificación de las diferentes actualizaciones sobre el cobro solicitado.",
        "children": []
      },
      {
        "name": "intent",
        "kind": "optional",
        "type": "string",
        "description": "Flujo de la operación, permite soportar operaciones en 2 pasos. Valores posibles: \"payment.2-step\", \"payment.v2\". Por defecto la captura de la operación es automática",
        "children": []
      },
      {
        "name": "installments",
        "kind": "optional",
        "type": "Array",
        "description": "Permite la limitación de los Planes Activos al pagar la orden. Para realizar dicha limitación se debe enviar un array de referencias/códigos de planes. Los ejemplos puedes encontrarlos más abajo en la documentación. ",
        "children": []
      },
      {
        "name": "sources",
        "kind": "optional",
        "type": "Array",
        "description": "Permite la limitación de los medios de pago aceptados. De esta forma, podrán utilizarse los medios aquí definidos.",
        "children": []
      },
      {
        "name": "timeout",
        "kind": "optional",
        "type": "Number",
        "description": "Tiempo de vida en minutos durante el cual podrá ser utilizada la intención de cobro, luego de este tiempo no tendrá validez. Por defecto son 15 minutos.",
        "children": []
      },
      {
        "name": "customer",
        "kind": "optional",
        "type": "Object",
        "description": "Objeto con los datos del cliente",
        "children": [
          {
            "name": "email",
            "kind": "required",
            "type": "string",
            "description": "Email del cliente. Este parámetro es necesario para la notificación al cliente."
          },
          {
            "name": "name",
            "kind": "required",
            "type": "string",
            "description": "Nombre del cliente. Este parámetro es necesario."
          },
          {
            "name": "identification",
            "kind": "optional",
            "type": "string",
            "description": "DNI del cliente. Este parámetro es necesario si desea agregar seguridad a la operación."
          },
          {
            "name": "phone",
            "kind": "optional",
            "type": "string",
            "description": "Número de teléfono del cliente."
          }
        ]
      },
      {
        "name": "split",
        "kind": "optional",
        "type": "array",
        "description": "Array para Split de Pago. Lea la sección más abajo.",
        "": "Array para Split de Pago. Lea la sección más abajo."
      }
    ],
    "formDataParameters": []
  },
  "currentNewParameter": {
    "label": "Body Parameter",
    "value": "bodyDataParameters"
  },
  "hasTryItOut": false,
  "autoGeneratedAnchorSlug": "solicitar-operacin-en-punto-de-venta",
  "legacyHash": "4zSx_4oKeorBgngy2olWf"
}
```
:::

**Ejemplos del nodo `installments`:**

Existen 3 formas de Limitar Planes:

- *Ocultar determinados planes de todo el conjunto de planes existentes:*

Estos planes se pueden limitar por referencia o por ID de plan

```json
{
    "installments": ["-ahora_12", "-ahora_18"]
}
```

- *Limitar los Planes a las elegidos en el Array:*

Estos planes se pueden limitar por referencia o por ID de plan

```json
{
    "installments": ["1", "3", "ahora_12"]
}
```

- *Mostrar planes especiales basado en Reglas Avanzadas*

### Cancelar una operación en Progreso

Si una operación está en progreso en el POS se puede cancelar la misma utilizando la API. Sólo se puede cancelar una operación a la vez.

:::ApiMethodV2
```json
{
  "name": "Cancelar operación",
  "method": "DELETE",
  "url": "https://api.mobbex.com/p/pos/:device/operation",
  "description": "Cancelar operación en progreso en el POS",
  "tab": "examples",
  "examples": {
    "languages": [
      {
        "id": "zSM2rH8rQTQVVM9BuPy_O",
        "language": "javascript",
        "code": "var myHeaders = new Headers();\nmyHeaders.append(\"Accept\", \"application/json\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\n   \"id\": \"String\"\n});\n\nvar requestOptions = {\n   method: 'GET',\n   headers: myHeaders,\n   body: raw,\n   redirect: 'follow'\n};\n\nfetch(\"https://api.cakes.com\", requestOptions)\n   .then(response => response.text())\n   .then(result => console.log(result))\n   .catch(error => console.log('error', error));",
        "customLabel": ""
      }
    ],
    "selectedLanguageId": "zSM2rH8rQTQVVM9BuPy_O"
  },
  "results": {
    "languages": [
      {
        "id": "Uh7lseCopEeEDFoOzG9sF",
        "language": "200",
        "customLabel": "",
        "code": "{\n      \"name\": \"Cake's name\",\n    }"
      },
      {
        "id": "cet4dmp6lYPAa4Em3Eirk",
        "language": "404",
        "customLabel": "",
        "code": "{\n      \"message\": \"Ain't no cake like that.\"\n    }"
      }
    ],
    "selectedLanguageId": "Uh7lseCopEeEDFoOzG9sF"
  },
  "request": {
    "pathParameters": [
      {
        "name": "device",
        "kind": "required",
        "type": "string",
        "description": "ID del dispositivo sobre el que se solicita una operación ",
        "children": []
      }
    ],
    "queryParameters": [],
    "headerParameters": [],
    "bodyDataParameters": [],
    "formDataParameters": []
  },
  "currentNewParameter": {
    "label": "Path Parameter",
    "value": "pathParameters"
  },
  "hasTryItOut": false,
  "autoGeneratedAnchorSlug": "cancelar-operacin",
  "legacyHash": "HgvdaswAe4QSCp7zQyDvB"
}
```
:::

## Webhooks

```json
{
    "type": "pos",
    "data": {
        "result": true,
         "view": {
            "type": "card"
        },
        "payment": {
            "created": "2024-04-16T23:04:40.523Z",
            "currency": {
              "code": "ARS",
              "locale": "es-AR",
              "symbol": "$",
              "text": "Peso Argentino"
            },
            "description": "Orden 11111111111",
            "id": "3Z6D9YF71L0LGGRR8DRT3W",
            "operation": {
              "type": "payment.v2"
            },
            "reference": "1111111111",
            "requestedCurrency": {
              "code": "ARS",
              "locale": "es-AR",
              "symbol": "$",
              "text": "Peso Argentino"
            },
            "requestedTotal": 145170,
            "riskAnalysis": {
              "band": "N/A",
              "level": "N/A"
            },
            "source": {
              "cardholder": {
                "identification": "12123123",
                "name": "Bruce Wayne"
              },
              "expiration": {
                "month": "06",
                "year": "24"
              },
              "installment": {
                "amount": 145170,
                "count": 1,
                "description": "1 Cuota",
                "reference": "1",
                "tags": [],
                "uid": "NzqWp58GA"
              },
              "name": "Visa Banco Santander",
              "number": "46600000****4601",
              "reference": "visa.santanderrio",
              "transaction": {
                "authorizationCode": "004288",
                "batchNo": "",
                "resultCode": "0",
                "retrievalReferenceNo": "410723133668",
                "ticketNo": "",
                "transactionId": "3Z6D9YF71L0LGGRR8DRT3W"
              },
              "type": "card",
              "variant": "credit"
            },
            "status": {
              "code": "200",
              "data": {},
              "message": "Transacción Aprobada",
              "resultCode": "0",
              "text": "Aprobado",
              "view": "default"
            },
            "total": 145170,
            "updated": "2024-04-16T23:04:42.146Z"
        },
        "entity": {
            "name": "Wayne Inc",
            "uid": "iambatman"
        },
        "customer": {
            "uid": "12123123",
            "name": "Juan Perez Wayne",
            "phone": "12123123",
            "identification": "110303456",
            "email": "soybatman@wayneinc.com"
        },
        "user": {
            "name": "Juan Perez Wayne",
            "email": "soybatman@wayneinc.com"
        },
        "source": {
            "name": "Visa Banco Santander",
            "reference": "visa.santanderrio",
            "type": "card"
        },
        "pos": {
            "name": "POS Nombre",
			"description": "-",
			"mode": "normal",
			"reference": "POS:MY_REF",
			"terminal": {
				"uid": "GDQ3V8L4EE6AAE5L9NWCK5",
				"reference": "ING:123AAA1235566",
				"serialNumber": "123AAA1235566"
			}
        }
    }
}
```

## Modo de Pruebas

Para probar en el POS cree una operación con la variable "test" en true. Para poder simular los diferentes estados debe utilizar el "total" de la operación, por ejemplo si desea que la transacción se apruebe el total debe ser 200. Vea la documentación de "Códigos de Estado" para mayor detalle y posibilidades de prueba.

Luego de crear la transacción con las condiciones indicadas proceda a utilizar cualquier tarjeta real, la operación no será cobrada sino que será simulada de acuerdo a lo indicado.

# Split

Este servicio soporta Split de pagos cuando la orden es creada via API tanto en POS como en QR. Recomendamos la lectura de la siguiente sección para conocer el funcionamiento del servicio de Split.

[Ir a Implementación Split](docId\:hxbJjuuvII4WPJXmYq_bD)

## Modos del Punto de Venta Físico

Actualmente se soportan 2 modos:

- Modo NORMAL: en este modo quien opera el POS puede ingresar el monto de la operación con el teclado en pantalla.
- Modo ESCLAVO: en este modo el POS se transforma en un dispositivo que debe ser controlado 100% desde la API sin que el usuario pueda intervenir.

En todos los modos soportados la API aquí documentada puede ser utilizada permitiendo integrar el POS al 100% a su sistema de caja.

