Ventanilla única del IVA (OSS)
Próximamente: cómo facturará tu aplicación con el IVA del país del consumidor por la ventanilla única (modelos 035 y 369): quién usa qué régimen, prueba de la ubicación, tipos de IVA de la Unión, rectificativas, suscripciones y errores.
Actualizado el . 12 min de lectura
Incluido en todos los planes. Ver precios
Próximamente
Estamos validando esta sección con especialistas antes de ponerla a tu disposición. Esta guía explica cómo funcionará el contrato de la API. Mientras tanto, cualquier dato de la ventanilla única en una petición (taxSystem: "EU_OSS", líneas EU_VAT, vatRateClass, ossSupplyType, consumerResidence.evidenceItems o la consulta de tipos de IVA) responde 403 con errorCode: "FEATURE_COMING_SOON" y featureKey: "finance.oss". Tus facturas de siempre no cambian.
La ventanilla única del IVA permite declarar en un solo modelo, el 369 trimestral, el IVA de las ventas de servicios electrónicos (y, en el régimen de la Unión, de las ventas a distancia de bienes) a consumidores finales de otros Estados miembros. Cada venta lleva el IVA del país donde está el consumidor, no el de tu organización.
Con la API, tu aplicación emite esas facturas con taxSystem: "EU_OSS".
UTILIA OS comprueba las reglas, resuelve el tipo de IVA del país del
consumidor en la fecha de la venta, lo congela en la factura y deja la
operación lista para el modelo 369 de tu organización. El alta en la
ventanilla única (el modelo 035) y su periodo los registra tu
organización en UTILIA OS, no tu aplicación.
Plan, permisos y disponibilidad
- Disponibilidad: la función está en «Próximamente». Antes que nada se comprueba si está disponible para tu organización; si no,
403 FEATURE_COMING_SOON. No es un bloqueo de plan ni de permisos, así que no se resuelve ampliando el plan ni concediendo permisos: no lo reintentes. En los SDK se reconoce conisFeatureComingSoonError(is_feature_coming_soon_erroren Python). Ver Funciones que llegan próximamente. - Plan: el aplicativo Finanzas, como el resto de las facturas.
- Permisos de la aplicación: los de siempre. Emitir exige
crm:invoices:writeycrm:invoices:issue, y consultar los tipos de IVA,crm:invoices:read. No hay permisos nuevos.
Qué régimen usa tu organización
El régimen lo decide dónde está establecida tu organización, no tu
aplicación. Cada factura EU_OSS lleva en ossScheme el régimen con el
que se emitió.
| Tu organización está establecida en | Régimen (ossScheme) | Qué ventas van por la ventanilla única |
|---|---|---|
| Solo Canarias, Ceuta o Melilla (o fuera de la Unión) | Régimen exterior (OSS_NON_UNION_SCHEME) | Todos los servicios a consumidores de la Unión, desde el primer euro, incluidos los de la península y Baleares, con el IVA español al 21 % y país ES. Solo servicios: una línea de bienes da 400 OSS_GOODS_NOT_ALLOWED. |
| La península, Baleares o un territorio foral | Régimen de la Unión (OSS_UNION_SCHEME) | Las ventas a consumidores de otros Estados miembros, solo si tu organización ha superado el umbral de 10.000 € o ha ejercido la opción por tributar en destino. Servicios y ventas a distancia de bienes. Nunca España: esas ventas van con IVA español en el modelo 303. |
Algunos detalles de cada régimen:
- Régimen exterior. Los consumidores de Canarias tributan por el IGIC, y los de Ceuta y Melilla por el IPSI: no van por la ventanilla única. Si tu organización tiene vigente el régimen exterior, una venta de servicios a un consumidor de la Unión, también de la península, tiene que ir con
EU_OSS. Con otro sistema,400 OSS_DESTINATION_VAT_REQUIRED. - Régimen de la Unión: el umbral. Se suman, sin IVA, los servicios de telecomunicaciones, radiodifusión y electrónicos a consumidores de otros Estados miembros y las ventas a distancia de bienes, del año en curso y del anterior. La venta que cruza el umbral ya va con el IVA del país del consumidor.
- Régimen de la Unión: la opción. Se ejerce en el modelo 036 y dura al menos dos años naturales.
- Régimen de la Unión, sin umbral ni opción. La venta va con IVA español, y una factura
EU_OSSda400 OSS_DESTINATION_NOT_APPLICABLE. - Régimen de la Unión, con umbral superado u opción vigente. Una factura con IVA español a un consumidor de otro Estado da
400 OSS_THRESHOLD_EXCEEDED(umbral superado) uOSS_DESTINATION_VAT_REQUIRED(opción vigente). El mensaje dice si hay que darse de alta antes en la ventanilla única. - Sin periodo de alta vigente en la fecha de la venta,
400 OSS_NOT_REGISTERED. - Régimen y régimen fiscal de la organización. Si no cuadran (por ejemplo, un régimen exterior en una organización de la península),
400 OSS_SCHEME_REGIME_MISMATCH.
Ventas por tiendas de aplicaciones
Si vendes tu aplicación o sus suscripciones a través de una tienda (App Store, Google Play u otra) que cobra al cliente o fija las condiciones, la ley presume que la tienda vende en nombre propio. La venta al consumidor es de la tienda, no tuya:
- No factures esas ventas como ventas a consumidores ni por la ventanilla única: la tienda es quien repercute el IVA al consumidor.
- Lo que tú facturas es la venta a la tienda, entre empresas y fuera de la ventanilla única.
- Por la ventanilla única solo van tus ventas directas: las que cobras en tu web o con tu propia pasarela de pago.
UTILIA OS no puede saber por qué canal se hizo cada venta: decidirlo es responsabilidad de tu aplicación.
Requisitos de una factura EU_OSS
| Requisito | Si no se cumple |
|---|---|
Venta a un consumidor final. Un NIF-IVA de la Unión en recipient.taxId o en user.taxId la convierte en una venta entre empresas, fuera de la ventanilla única. | 400 OSS_B2B_NOT_ALLOWED |
| En euros. | 400 OSS_CURRENCY_NOT_EUR |
Todas las líneas con taxType: "EU_VAT". Sin retención, inversión del sujeto pasivo ni recargo de equivalencia. | 400 VALIDATION_ERROR |
consumerResidence con region: "OTHER_EU" y su countryCode (un Estado miembro), o region: "PENINSULA_BALEARES" en el régimen exterior. | 400 OSS_COUNTRY_NOT_ALLOWED; con CANARIAS, CEUTA_MELILLA o NON_EU, 400 TAX_SYSTEM_RESIDENCE_MISMATCH |
La prueba de la ubicación en consumerResidence.evidenceItems (ver más abajo). | 400 OSS_LOCATION_EVIDENCE_INSUFFICIENT |
| Una simplificada, hasta 400 € con el IVA incluido. Imprime «Tipo aplicado: IVA Francia 20 % (IVA incluido)». | 422 SIMPLIFIED_INVOICE_AMOUNT_EXCEEDED: emite una ordinaria |
La factura imprime «IVA del país del consumidor (ventanilla única)», el
rótulo de cada tipo («IVA Francia 20 %») y «Estado miembro de consumo:
Francia». Las simplificadas y las ordinarias van en series separadas, y
conviene numerar estas ventas en una serie propia de tu aplicación con
seriesCode.
El tipo de IVA de cada línea
Tu aplicación no fija el porcentaje. En cada línea EU_VAT indica la
clase del tipo con vatRateClass y UTILIA OS resuelve el porcentaje
del país del consumidor para esa clase en la fecha de expedición:
vatRateClass | Qué es |
|---|---|
STANDARD | Tipo general. Es el valor por defecto. |
REDUCED | Tipo reducido. |
REDUCED_SECOND | Segundo tipo reducido. |
SUPER_REDUCED | Tipo superreducido. |
PARKING | Tipo «parking». |
ZERO | Tipo cero. |
ossSupplyType dice qué vendes: SERVICES, el valor por defecto, o
GOODS, una venta a distancia de bienes, solo en el régimen de la
Unión.
Cada Estado solo tiene algunas clases. Si el país no tiene tipo para esa
clase en esa fecha, la respuesta es 400 OSS_RATE_NOT_AVAILABLE con
lineNumber: nunca se factura al 0 % por defecto. El porcentaje queda
congelado en la línea (taxRate): aunque el país cambie su tipo
después, la factura y sus rectificativas conservan el que se aplicó. Con
pricesIncludeTax: true, la base se calcula con ese porcentaje.
Consultar los tipos vigentes
Para calcular tus precios antes de facturar, pide los tipos del país y la fecha. Lo que devuelve esta consulta es lo que se aplicará al emitir.
/api/external/v1/invoices/eu-vat-ratesTipos de IVA vigentes de los Estados miembros de la Unión en una fecha. Sin country, los 27. Permiso: crm:invoices:read; exige la facturación activada y la ventanilla única disponible para tu organización.
{
"date": "2026-10-15",
"rates": [
{
"countryCode": "FR",
"vatCountryCode": "FR",
"countryName": "Francia",
"rateClass": "STANDARD",
"rateClassLabel": "tipo general",
"percentage": 20,
"validFrom": "2014-01-01",
"validTo": null,
"label": "Francia: tipo general",
"sourceRef": "https://ec.europa.eu/taxation_customs/tedb/"
}
]
}- datequery
- Fecha AAAA-MM-DD. Por defecto, hoy en la zona horaria de tu organización. Para una factura es su fecha de expedición.
- countryquery
- Estado miembro en ISO 3166-1 alfa-2 (Grecia es GR). Sin él, los 27. Un país que no es de la Unión da 400 OSS_COUNTRY_NOT_ALLOWED.
- rates[].vatCountryCodestringobligatorio
- Código del Estado en el sistema IVA de la Unión: coincide con countryCode salvo Grecia (EL).
- rates[].rateClassenumobligatorio
- La clase, el valor que mandas en vatRateClass.
- rates[].percentagenumberobligatorio
- Porcentaje exacto del tipo.
- rates[].validFrom / validTostringobligatorio
- Vigencia, inclusiva. validTo es nulo si sigue vigente.
- rates[].sourceRefstringobligatorio
- Fuente oficial del tipo.
La prueba de la ubicación del consumidor
La norma exige que conserves dos elementos de prueba no contradictorios de dónde está el consumidor. Tu aplicación los conoce; UTILIA OS solo guarda de cada uno su tipo, el país que se deduce de él y, si es España, la región. Nunca la dirección IP, la dirección postal, el número de cuenta ni el teléfono.
- consumerResidence.evidenceItems[].typeenumobligatorio
- BILLING_ADDRESS (dirección de facturación), IP_GEOLOCATION (dirección IP o geolocalización), BANK_ACCOUNT (datos bancarios), MOBILE_COUNTRY_CODE (código de país de la tarjeta SIM), FIXED_LINE (línea fija) u OTHER_COMMERCIAL (otra información comercialmente relevante).
- consumerResidence.evidenceItems[].countryCodestringobligatorio
- País que se deduce del elemento, ISO 3166-1 alfa-2 (Grecia es GR). Solo el país.
- consumerResidence.evidenceItems[].regionenum
- Solo con countryCode ES: PENINSULA_BALEARES, CANARIAS, CEUTA o MELILLA.
- consumerResidence.evidenceItems[].thirdPartyboolean
- El elemento lo facilitó un tercero que interviene en el cobro (por ejemplo, tu pasarela de pago), distinto de ti y del consumidor.
Las reglas, que UTILIA OS comprueba en cada factura:
- Dos elementos de tipos distintos, todos con el país de consumo. Entre 1 y 10 elementos en total.
- Un solo elemento facilitado por un tercero (
thirdParty: true) basta únicamente en el régimen de la Unión y si las ventas de tu organización a consumidores de otros Estados no pasan de 100.000 € este año ni el anterior. En el régimen exterior siempre hacen falta dos. - Consumidor de España (régimen exterior). El código de país del móvil y el banco español no distinguen Canarias, Ceuta y Melilla de la península. Por eso, al menos un elemento (el código postal de facturación o la geolocalización) debe llevar
region: "PENINSULA_BALEARES"y ninguno otra región. Los que no distinguen la región van sin ella. - Si la prueba no basta o se contradice,
400 OSS_LOCATION_EVIDENCE_INSUFFICIENT.evidenceItemsfuera deEU_OSSda400 VALIDATION_ERROR.
La prueba se conserva con la factura para el registro de la ventanilla
única y no se devuelve nunca: ni en la respuesta, ni en metadata,
ni en los avisos.
Ejemplo: organización canaria que vende a un consumidor de Francia
Tu organización está establecida en Canarias y tiene vigente el régimen exterior. Un consumidor de París paga 47,99 € con tu pasarela.
curl -X POST https://os.utilia.ai/api/external/v1/invoices \
-H "X-Api-Key: utl_live_..." \
-H "Content-Type: application/json" \
-d '{
"type": "SIMPLIFIED",
"user": { "externalId": "user_01HXYZ", "email": "camille@example.fr" },
"taxSystem": "EU_OSS",
"pricesIncludeTax": true,
"lines": [
{ "name": "Plan Profesional", "quantity": 1, "unitPrice": 47.99, "taxType": "EU_VAT", "vatRateClass": "STANDARD" }
],
"consumerResidence": {
"region": "OTHER_EU",
"countryCode": "FR",
"evidenceItems": [
{ "type": "BILLING_ADDRESS", "countryCode": "FR" },
{ "type": "BANK_ACCOUNT", "countryCode": "FR", "thirdParty": true }
]
},
"payment": { "method": "CARD", "reference": "pi_3QossFR" },
"seriesCode": "APPT",
"idempotencyKey": "pedido-fr-1"
}'La respuesta trae la factura con el tipo de Francia resuelto y congelado (20 %: base 39,99 € y cuota 8,00 €):
{
"id": "ckoss1234567890",
"invoiceNumber": "APPT-202600001",
"type": "SIMPLIFIED",
"seriesCode": "APPT",
"taxSystem": "EU_OSS",
"consumerCountryCode": "FR",
"ossScheme": "OSS_NON_UNION_SCHEME",
"status": "PAID",
"legalMentions": [
"Factura simplificada (RD 1619/2012 art. 7)",
"IVA del país del consumidor (ventanilla única)",
"Estado miembro de consumo: Francia",
"Tipo aplicado: IVA Francia 20 % (IVA incluido)"
],
"pricesIncludeTax": true,
"paymentRegistered": true,
"totalAmount": 47.99,
"paidAmount": 47.99,
"currency": "eur",
"idempotent": false
}En el detalle (GET /external/v1/invoices/:id), cada línea trae
taxRate: 20, vatRateClass: "STANDARD" y ossSupplyType: "SERVICES",
y cada tramo de impuestos, su vatRateClass.
Si el consumidor estuviera en la península, la factura sería igual con
region: "PENINSULA_BALEARES" (sin countryCode) y una prueba con país
ES, uno de cuyos elementos lleve region: "PENINSULA_BALEARES": IVA
español al 21 % por la ventanilla única, con consumerCountryCode: "ES".
Rectificativas
Se emiten por la ruta de siempre,
POST /external/v1/invoices/:id/rectifications,
sin campos nuevos:
- La rectificativa de una factura
EU_OSShereda su sistema, su país de consumo, su régimen y los porcentajes congelados de cada línea, aunque el país haya cambiado su tipo después. - Va a la serie de rectificativas (
R-). - Si la ventanilla única no está disponible para tu organización, la rectificativa de una factura
EU_OSStambién responde403 FEATURE_COMING_SOON. - En el modelo 369, tu organización compensa las rectificativas del mismo trimestre y declara las de trimestres anteriores como correcciones, hasta tres años después.
Suscripciones
POST y PATCH /external/v1/subscriptions
admiten lo mismo: taxSystem: "EU_OSS", consumerResidence con
evidenceItems y líneas EU_VAT con vatRateClass y ossSupplyType.
- La residencia de una suscripción solo admite
OTHER_EUyPENINSULA_BALEARES, y no usaevidence(texto libre). - Cada cuota es una venta distinta: el generador vuelve a comprobar el periodo de alta vigente y resuelve el tipo de IVA en la fecha de esa cuota.
- Si el consumidor cambia de país, actualiza
consumerResidenceconPATCH. - El detalle trae
consumerCountryCode, y cada factura generada, sutaxSystem, suconsumerCountryCodey suossScheme.
Respuestas y avisos
- Respuestas. Cada factura,
EU_OSSo no, traetaxSystem,consumerCountryCode(nulo si no hay consumidor de otro país) yossScheme(nulo fuera deEU_OSS). Cada línea traevatRateClassyossSupplyType, nulos fuera deEU_VAT. - Avisos. El objeto
invoicede los avisosINVOICE_*llevataxSystem,consumerCountryCodeyossScheme. En la difusión de las facturas que emite tu equipo,consumerCountryCodellega nulo. Los avisos no llevan líneas ni la prueba de la ubicación. Ver Avisos.
Errores
| HTTP | errorCode | Cuándo |
|---|---|---|
| 403 | FEATURE_COMING_SOON | La ventanilla única no está disponible para tu organización. Trae featureKey: "finance.oss". |
| 400 | OSS_NOT_REGISTERED | Sin periodo de alta vigente en la fecha de la venta. |
| 400 | OSS_SCHEME_REGIME_MISMATCH | El régimen de la ventanilla única no corresponde al régimen fiscal de la organización. |
| 400 | OSS_COUNTRY_NOT_ALLOWED | Falta el país, no es un Estado miembro o el régimen no lo admite (España en el régimen de la Unión). |
| 400 | TAX_SYSTEM_RESIDENCE_MISMATCH | EU_OSS con un consumidor de Canarias, Ceuta, Melilla o fuera de la Unión. |
| 400 | OSS_B2B_NOT_ALLOWED | El destinatario o el usuario tienen NIF-IVA de la Unión. |
| 400 | OSS_CURRENCY_NOT_EUR | La factura no está en euros. |
| 400 | OSS_GOODS_NOT_ALLOWED | Línea de bienes en el régimen exterior. Trae lineNumber. |
| 400 | OSS_RATE_NOT_AVAILABLE | El país no tiene tipo para esa clase en esa fecha. Trae lineNumber. |
| 400 | OSS_LOCATION_EVIDENCE_INSUFFICIENT | La prueba de la ubicación no basta o se contradice. |
| 400 | OSS_DESTINATION_NOT_APPLICABLE | Régimen de la Unión sin umbral superado ni opción vigente: la venta va con IVA español. |
| 400 | OSS_THRESHOLD_EXCEEDED | Factura con IVA español a un consumidor de otro Estado, con el umbral de 10.000 € superado. |
| 400 | OSS_DESTINATION_VAT_REQUIRED | Factura con otro sistema cuando la venta ya tributa en destino (opción vigente o régimen exterior). |
| 422 | SIMPLIFIED_INVOICE_AMOUNT_EXCEEDED | Simplificada de más de 400 € con el IVA incluido. |
| 400 | VALIDATION_ERROR | Una línea que no es EU_VAT en EU_OSS, vatRateClass u ossSupplyType fuera de una línea EU_VAT, o evidenceItems fuera de EU_OSS. |
Todos llegan antes de numerar: un rechazo no consume número. Los códigos
están tipados en los SDK (INVOICE_ERROR_CODES e InvoiceErrorCode). El
catálogo completo está en
Errores, identificador de petición y reintentos.