---
title: Puntos de Venta (POS)
slug: puntos-de-venta-pos
icon: 💲
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.

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: VER. Ej "VER:123-123-123"



:::ApiMethodV2
```json
{
  "name": "Solicitar operación en Punto de Venta",
  "method": "POST",
  "url": "https://api.unicobros.com.ar/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.unicobros.com.ar/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.unicobros.com.ar/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.unicobros.com.ar/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.unicobros.com.ar/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.unicobros.com.ar/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": "sFKRjOo8kCa9ZRcNRcGrD"
  },
  "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. No debe enviarse como array vacío",
        "": "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. No debe enviarse como array vacío"
      },
      {
        "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. No debe enviarse como array vacío",
        "": "Permite la limitación de los medios de pago aceptados. De esta forma, podrán utilizarse los medios aquí definidos. No debe enviarse como array vacío"
      },
      {
        "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."
          }
        ],
        "schema": [
          {
            "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": "Permite dividir el cobro del checkout en varias entidades de Unicobros. Ver ejemplo seccion \"Split de Pagos\".",
        "": "Permite dividir el cobro del checkout en varias entidades de Unicobros. Ver ejemplo seccion \"Split de Pagos\"."
      },
      {
        "name": "options",
        "kind": "optional",
        "type": "object",
        "description": "",
        "": "object",
        "children": [
          {
            "name": "sendToDevice",
            "kind": "optional",
            "type": "boolean",
            "description": "En caso de utilizar el ID del POS al generar la intención de pago, enviar este campo en true"
          }
        ],
        "schema": [
          {
            "name": "sendToDevice",
            "kind": "optional",
            "type": "boolean",
            "description": "En caso de utilizar el ID del POS al generar la intención de pago, enviar este campo en true"
          }
        ]
      }
    ],
    "formDataParameters": []
  },
  "currentNewParameter": {
    "label": "Body Parameter",
    "value": "bodyDataParameters"
  },
  "hasTryItOut": false,
  "autoGeneratedAnchorSlug": "solicitar-operacin-en-punto-de-venta",
  "legacyHash": "4zSx_4oKeorBgngy2olWf"
}
```
:::

### 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.unicobros.com.ar/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"
			}
        }
    }
}
```

##

## Punto de venta sin dispositivo asociado

En caso de no tener el **Punto de Venta** un dispositivo asociado se puede generar operaciones de pago utilizando el ID del punto de venta (remplezar **:device** por **ID del punto de venta**) . Para crear puntos de venta revisar la documentación [ver.](https://ayuda.unicobros.com.ar/crear-punto-de-venta#9IQncrVjq9L77CDM8pB5G) En este caso el QR debe descargarse desde la consola y las intenciones de pago se generan sobre ese QR.&#x20;

Ejemplo:

```json
{
    "total": 26,
    "currency": "ARS",
    "description": "TestQR1234",
     "reference": "test- 1234 qr",
    "test": false,
    "webhook": "www.webhooks/test.com",
    "intent": "payment.v2",
    "timeout": 10,
    "options": { "sendToDevice": true }
}
```



# 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.

**Importante**: si la terminal es productiva, no admite la variable "test" en true.&#x20;

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.

## Modos del Punto de Venta

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.

