API Woonivers
Este API tiene implementada la autenticación con cabecera HTTP X-API-Key
.
Solicite este dato a su contacto técnico de Woonivers.
La integración se realizará en el entorno de sandbox con la base de host https://sandbox.woonivers.com/api/v1/
.
Una vez realizadas las pruebas necesarias se podrá cambiar a producción mediante el host https://api.woonivers.com/api/v1/
.
Considere los valores de estos parámetros como opciones de configuración de su entorno para facilitar su cambio cuando suba de entorno.
- X-API-Key
- Base host del entorno
📋Casos de uso
Venta (Solicitar emisión DER)
Un viajero compra en una tienda y solicita el Tax Free sobre esa compra.
Se solicita la emisión del DER para registrar la compra.
Obligatorios
Estas llamadas son obligatorias a la hora de realizar una venta.
Petición | Descripción |
---|---|
GET /traveller | Para comprobar que existe el viajero. |
POST /der | Para solicitar la emisión del documento electrónico de reembolso. |
Opcionales
Estas llamadas son opcionales a la hora de realizar una venta.
Petición | Descripción |
---|---|
POST /traveller | Para crear el viajero si no existe. |
PUT /traveller | Para actualizar la información del viajero. |
Devolución total (Solicitar cancelación DER)
Un viajero que ha comprado en una tienda quiere hacer una devolución de todos los artículos.
Se solicita la cancelación del DER.
Obligatorios
Estas llamadas son obligatorias a la hora de realizar una devolución total.
Petición | Descripción |
---|---|
GET /der | Para solicitar la búsqueda del documento electrónico de reembolso. |
DELETE /der | Para solicitar la cancelación del documento electrónico de reembolso. |
Devolución parcial (Solicitar cancelación DER y Solicitar emisión DER)
Un viajero que ha comprado en una tienda quiere hacer una devolución de algunos artículos.
Se solicita la cancelación del DER y se solicita la emisión de un DER nuevo.
Obligatorios
Estas llamadas son obligatorias a la hora de realizar una devolución parcial.
Petición | Descripción |
---|---|
GET /der | Para solicitar la búsqueda del documento electrónico de reembolso. |
DELETE /der | Para solicitar la cancelación del documento electrónico de reembolso. |
POST /der | Para solicitar la emisión del documento electrónico de reembolso. |
🧳Viajero
[POST /traveller] Creación de viajero
POST /traveller
Petición
Obligatorios
Campo | Descripción | Formato | Ejemplo |
---|---|---|---|
country | País del comercio en formato ISO 3166-1 A-3. | ISO 3166-1 A-3 | ESP |
locale | Idioma de los mensajes intercambiados vía API | es_ES | es_ES |
email | Dirección de correo electrónico de contacto del viajero para el envío de información exclusivamente del proceso de tax free. | Cualquier email válido. | john@doe.com |
first_name | Nombre de pila del viajero tal y como aparece en su documento de identificación. | 1 a 50 caracteres alfanuméricos con espacio en blanco. | John |
last_name | Apellidos del viajero tal y como aparece en su documento de identificación. | 1 a 50 caracteres alfanuméricos con espacio en blanco. | Doe |
phone | Número de teléfono del viajero con el fin de contactar con el para gestiones relacionadas con el tax free. | 5-20 dígitos | |
phone_prefix | Prefijo del número de teléfono del viajero con el fin de contactar con el para gestiones relacionadas con el tax free. | 1 a 3 caracteres alfanuméricos con espacio en blanco. | 34 |
birth_date | Fecha de nacimiento del viajero. | Formato ISO 8601 (YYYY-MM-DD) | 1990-01-25 |
document_type | Tipo de documento del viajero. | PASSPORT_ID_TYPE o NATIONAL_ID_TYPE | PASSPORT_ID_TYPE |
document_id | Número de documento del viajero. | Alfanuméricos sin espacios. | 123456789 |
document_country | País del documento del viajero. | ISO 3166-1 A-3 | ESP |
notes | Información adicional del viajero. | Alfanuméricos con espacio en blanco hasta. | |
residence_country | País de residencia del viajero. | ISO 3166-1 A-3 | ESP |
zip_code | Código postal del viajero. | Alfanuméricos sin espacios. | 28001 |
city | Ciudad del viajero. | Alfanuméricos con espacios en blanco. | Madrid |
address | Dirección del viajero. | Alfanuméricos con espacios en blanco. | Calle de la Princesa, 1 |
Opcionales
Ninguno es opcional.
Respuestas
Código de respuesta | Descripción |
---|---|
201 | Viajero creado correctamente |
400 | Petición no válida. Se devolverá el error explícito |
401 | No autorizado. |
Respuesta
Campo | Descripción | Formato | Ejemplo |
---|---|---|---|
id | Número generado por Woonivers. | Numérico | 12345 |
request_id | Identificador único de la llamada API. Se recomienda almacenar para agilizar los procesos de Soporte. | uuid4 | 4b0a6622-37dd-4e6a-aba3-804ce8f9818f |
Adicionalmente llegarán todos los campos de la creación del viajero |
Ejemplo de petición
{
"country": "ESP",
"locale": "en",
"email": "john@doe.com",
"first_name": "John",
"last_name": "Doe",
"phone": "123456789",
"phone_prefix": "34",
"birth_date": "1990-01-25",
"document_type": "PASSPORT_ID_TYPE",
"document_id": "123456789",
"document_country": "ESP",
"notes": "string",
"residence_country": "ESP",
"zip_code": "28001",
"city": "Madrid",
"address": "Calle de la Princesa, 1"
}
Ejemplo de respuesta 201
{
"country": "ESP",
"locale": "en",
"email": "john@doe.com",
"first_name": "John",
"last_name": "Doe",
"phone": "123456789",
"phone_prefix": "34",
"birth_date": "1990-01-25",
"document_type": "PASSPORT_ID_TYPE",
"document_id": "123456789",
"document_country": "ESP",
"notes": "string",
"residence_country": "ESP",
"zip_code": "28001",
"city": "Madrid",
"address": "Calle de la Princesa, 1",
"request_id": "string",
"id": 12345
}
Ejemplo de respuesta 400
{
"error": {
"code": "400",
"message": ["User '{{email}}' already exists."]
}
}
Ejemplo de respuesta 401
{
"request_id": "string",
"error": {
"code": "401",
"message": "Unauthorized access, please provide valid credentials"
}
}
[GET /traveller] Obtener datos del viajero
GET /traveller?traveller_id={{traveller_id}}
GET /traveller?document_id={{document_id}}
Para obtener los datos del viajero, necesitaremos conocer uno de estos datos:
traveller_id
: identificador único del viajero interno en Woonivers.document_id
: identificador único del documento de identificación del viajero.
Petición
Respuestas
Código de respuesta | Descripción |
---|---|
200 | Viajero encontrado correctamente |
401 | No autorizado. |
404 | No encontrado. |
Ejemplo de respuest 200
{
"country": "ESP",
"locale": "en",
"email": "john@doe.com",
"first_name": "John",
"last_name": "Doe",
"phone": "123456789",
"phone_prefix": "34",
"birth_date": "1990-01-25",
"document_type": "PASSPORT_ID_TYPE",
"document_id": "123456789",
"document_country": "ESP",
"notes": "string",
"residence_country": "ESP",
"zip_code": "28001",
"city": "Madrid",
"address": "Calle de la Princesa, 1"
}
Ejemplo de respuesta 401
{
"request_id": "string",
"error": {
"code": "401",
"message": "Unauthorized access, please provide valid credentials"
}
}
Ejemplo de respuest 404
{
"request_id": "string",
"error": {
"code": "404",
"message": "Traveller not found"
}
}
[PUT /traveller] Actualizar información del viajero
PUT /traveller/<traveller_id>
Para actualizar la información del viajero, necesitaremos conocer uno de estos datos:
traveller_id
: identificador único del viajero interno en Woonivers.
Petición y respuesta
Se enviarán los mismos de datos que en una creación de viajero. Los tipos de respuestas serán los mismos que en la creación de viajero.
🧾DER
[POST /der] Solicitar emisión DER
POST /der
Petición
Campo | Descripción | Formato | Ejemplo |
---|---|---|---|
country | País del comercio en formato ISO 3166-1 A-3. | ISO 3166-1 A-3 | ESP |
locale | Idioma de los mensajes intercambiados vía API | es_ES | es_ES |
order | Identificador de la factura simplificada. Número de ticket. | Alfanuméricos sin espacios. | TICKET00001 |
order_datetime | Fecha y hora de la compra. | Formato ISO 8601 (YYYY-MM-DDTHH:MM:SS) | 2025-01-01T00:00:00 |
currency | Moneda utilizada para el pago. | ISO 4217 acrónimo | eur |
traveller_id | Identificador intenro de Woonivers del viajero. Tendrá que hacer la consulta de obtener viajero antes de esta llamada API. | uuid4 | 4b0a6622-37dd-4e6a-aba3-804ce8f9818f |
products | Colección (array) de productos que estarán sujetos al taxfree. | [] | Ver siguiente bloque de documentación. |
Colección (array) de productos que estarán sujetos al taxfree:
Campo | Descripción | Formato | Ejemplo |
---|---|---|---|
amount | Cantidad de producto | Número entero | 1 |
description | Descripción del producto | Alfanuméricos con espacio en blanco | Producto 1 |
classification | Clasificación del producto, abreviatura oficial | Enum | ALI - Alimentación. # ALT - Alcohol y tabaco. # CUL - Bienes culturales y artesanía. # DEP - Deportes y ocio. # EDM - Electrodomésticos. # HOG - Hogar y decoración. # ELI - Informática y electrónica. # MOD - Moda y accesorios. # PER - Perfumería, cosmética y farmacia. # JOY - Joyería y relojería. # DTO - Descuentos # MAS - Mascotas |
tax_rate | Tasa de impuesto aplicado al producto | Número decimal | 7.5 |
tax_base | Base imponible del producto | Número entero | 4000 |
tax_amount | Cantidad de impuesto aplicado al producto | Número entero | 400 |
total_tax | Total de impuestos aplicados al producto | Número entero | 4400 |
serial_number | Número de serie del producto. Solo es OBLIGATORIO en joyería y electrónica. | Alfanuméricos sin espacios | Serial number |
Códigos HTTP de respuesta
Código de respuesta | Descripción |
---|---|
201 | DER emitido correctamente |
400 | Petición no válida. Se devolverá el error explícito |
401 | No autorizado. |
Ejemplo de respuesta 201
{
"request_id": "string",
"metadata": {
"key_sample1": "value_sample1",
"key_sample2": "value_sample2"
},
"order": "order_id",
"retailer_id": "B12345678",
"retailer_name": "Woonivers S.L.",
"shop_name": "Woonivers Store S.L.",
"products": [
{
"amount": 1,
"description": "Producto 1",
"classification": "ALI",
"tax_rate": 7.5,
"tax_base": 4000,
"tax_amount": 400,
"total_tax": 4400,
"serial_number": "Serial number",
"metadata": {
"key_sample1": "value_sample1",
"key_sample2": "value_sample2"
}
}
],
"name": "aeat",
"created_at": "2020-01-01T00:00:00Z",
"aeat_id": "24ES10521265",
"aeat_ilr": "GETREF0000000000000010720",
"aeat_csv_der": "NRGQ38U583D7RGUK"
}
Como añadido a los campos que se enviaron en la emisión, la respuesta incluye los siguientes campos:
Campo | Descripción |
---|---|
request_id | Identificador único de la llamada API |
name | Nombre del regulador que genera el DER |
created_at | Fecha de emisión del DER en formato ISO 8601 |
aeat_id | Identificador de la AEAT |
aeat_ilr | Identificador local de referencia |
aeat_csv_der | CSV declaración electrónica |
Ejemplo de respuesta 400
{
"error": {
"code": "400",
"message": {
"invoice_date": [
"Traveller ID does not exist."
]
}
}
}
Ejemplo de respuesta 401
{
"request_id": "string",
"error": {
"code": "401",
"message": "Unauthorized access, please provide valid credentials"
}
}
[GET /der] Solicitar búsqueda DER
GET /der/<order_id>
Se utilizará el parámetro order_id
para buscar el orden de compra.
Respuestas
Código de respuesta | Descripción |
---|---|
201 | Viajero creado correctamente |
401 | No autorizado |
404 | No encontrado. |
Ejemplo de respuesta 201
El mismo resultado que en la emisión de DER más el traveller_id
.
Ejemplo de respuesta 401
{
"request_id": "string",
"error": {
"code": "401",
"message": "Unauthorized access, please provide valid credentials"
}
}
Ejemplo de respuesta 404
{
"request_id": "string",
"error": {
"code": "404",
"message": "DER not found"
}
}
[DELETE /der] Solicitar cancelación DER
DELETE /der/delete/<order_id>
Anulación de un DER en el caso que aún no se haya visado.
Se utilizará el parámetro order_id
para buscar el DER y anularlo.
Respuestas
Código de respuesta | Descripción |
---|---|
200 | DER anulado correctamente |
401 | No autorizado. |
404 | DER no encontrado. |
Ejemplo de respuesta 200
{
"request_id": "request_id",
"metadata": {
"key_sample1": "value_sample1",
"key_sample2": "value_sample2"
}
}
Ejemplo de respuesta 401
{
"request_id": "string",
"error": {
"code": "401",
"message": "Unauthorized access, please provide valid credentials"
}
}
Ejemplo de respuesta 404
{
"request_id": "string",
"error": {
"code": "404",
"message": "DER not found"
}
}