Objetivo
API para interactuar con la plataforma de facturación electrónica FEU de Surtec.
Acciones posibles:
1. Crear un comprobante fical electrónico (CFE), de cualquier tipo.
2. Consultar el estado de los CFE creados, con respecto al envío a DGI.
3. Consultar las facturas o comprobantes de compras, recibidos por ser receptor electrónico.
Autenticación
La autenticación se realizará usando Bearer Token
Un usuario obtiene un token que podrá usar para todas las empresas que tenga privilegios.
La URL para generación de Tokens es (será):
- Test: https://auth-test.facturaelectronica.com.uy/token
Solicitar token de acceso
Dos modos: 1. Nombre de usuario y contraseña 2. Token de refresco
Los tokens obtenidos de los servicios de autentificación solo serán reconocidos y utilizables con su correspondiente ambiente. Un token obtenido del sitio de test no funcionará en el sitio de producción y viseversa.
Solicitud con nombre de usuario y contraseña
Se utiliza como punto de entrada inicial al sistema, luego de obtener el primer conjunto de tokens, se prefiere el uso del segundo modo para las subsecuentes solicitudes.
Parámetros de Entrada
Parámetro | ¿Requerido? | Default | Descripción | Tipo |
grant_type | Si | No | Tipo de llamada para obtener el token. Debe indicarse el valor ‘password’ | String |
username | Si | No | Nombre del usuario que identifica el acceso, será otorgado por FEU. | String |
password | Si | No | Contraseña del usuario. | String |
refresh_token_expire_time | No | 365 días | Indica la duración en minutos del token de refresco. | Double |
Solicitud con token de refresco
Modo principal para la obtención de token de acceso
Parámetros de Entrada
Parámetro | ¿Requerido? | Default | Descripción | Tipo |
grant_type | Si | No | Tipo de llamada para obtener el token. Debe indicarse el valor ‘refresh_token’ | String |
refresh_token | Si | No | Token de refresco obtenido de una solicitud previa. | String |
refresh_token_banned | No | False | Indica si se solicita invalidar el token de refresco actual y obtener uno nuevo. | Boolean |
refresh_token_expire_time | No | 365 días |
Indica la duración en minutos del token de refresco. Requiere: refresh_token_banned = true |
Double |
Parámetros de Salida
Parámetro | ¿Nulo? | Descripción | Tipo |
access_token | No | Token de corta duración para acceder a los recursos protegidos. | String |
token_type | No | Tipo de token de acceso | String |
refresh_token | No | Token de larga duración para la adquisición de nuevos tokens | String |
Estados y errores
La API utiliza HTTP Status Code pare indicar éxito o error en la llamada. Para ver el detalle del error, ver el cuerpo de la respuesta.
Respuesta
{
"tipo": string,
"tipo_codigo": number,
"detalle": string
}
O puede ser:
{
"tipo": string,
"tipo_codigo": number,
"detalle":{
"parametro": string,
"errores": string[]
}
}
Código | Descripción |
200 | Respuesta exitosa, ver el cuerpo para obtener el recurso solicitado |
400 | La solicitud tiene un error, ver el cuerpo con el detalle. |
500 | Error no controlado. |
Error | Mensaje | Causa |
invalid_grant | El campo ‘grant_type’ debe ser ‘password’ o ‘refresh_token’ | Valor incorrecto en grant_type. |
Invalid_request | El campo ‘refresh_token_expire_time’ debe ser igual o mayor a 10 (minutos). Valor por defecto: 365 días« | Valor de refresh_token_expire_time menor al esperado. |
invalid_request | Los campos ‘username’ y ‘password’ no pueden estar vacíos. | Campos username o password son vacíos. |
invalid_request | Nombre de usuario y contraseña no corresponden con ningún usuario registrado. | Usuario y contraseña no coinciden. |
invalid_request | ‘refresh_token’ no se encontró. | refersh_token no puede ser vacío. |
access_denied | ‘refresh_token’ no existe o fue bloqueado. | Se envió un ‘refresh_token’ inválido. |
server_error |
Ejemplos
POST: https://auth-test.facturaelectronica.com.uy/token
Petición con nombre de usuario y contraseña
{ "grant_type": "password", "username": "usuario", "password": "1234-abc" }
Petición con token de refresco
{ "grant_type": "refresh_token", "refresh_token": REFRESHTOKEN }
Respuesta
{ "access_token": ACCESSTOKEN, "token_type": "bearer", "refresh_token": REFRESHTOKEN }
1. Crear un comprobante fiscal electrónico (CFE)
La URL para crear comprobantes es:
- Test: https://api-test.facturaelectronica.com.uy/comprobantes/crear
Se solicita crear un comprobante fiscal electrónico, según los parámetros especificados. Devuelve un identificador del comprobante cuando tiene éxito.
Parámetros de Entrada
Parámetro | ¿Requerido? | Default | Descripción | Tipo |
sucursal | Si | No | Nro de sucursal de DGI del emisor. Mayor a 0. | Int |
tipo_comprobante | Si | No | Código que identifica el tipo de comprobante CFE según tabla de DGI. | Int |
forma_pago | Condicionado por tipo | No |
1 = Contado 2 = Crédito |
Int |
moneda | Si, excepto e-remito. | No |
UYU = Peso uruguayo, USD=Dólares americanos, EUR=Euro, etc. Ver tabla estándar internacional ISO 4217. |
String |
tipo_cambio | No | Cierre BCU | Si es nula, se asume el tipo de cambio de BCU, cierre del día anterior a la fecha_comprobante. | Float |
cod_montos_brutos | Condicionado por tipo | No |
1 = Indica que las líneas de detalles o ítems van con IVA incluido. 2 = Indica que las líneas de detalles o ítems van con IMEBA y adicionales incluidos. 3 = Indica que las líneas de detalle corresponden a ventas realizadas por contribuyentes con obligación IVA mínimo, Monotributo o Monotributo Otro caso, el IVA se calcula usando el indicador_facturación del ítem. |
Int |
fecha_comprobante | No | Hoy | Fecha del comprobante.
Fecha válida entre 01/10/2011 a 31/12/2050. Debe ser ≤ fecha de hoy + 60 días. |
Date |
fecha_vencimiento | No | No | Fecha de vencimiento del comprobante.
Formato AAAA-MM-DD. Fecha válida entre 01/10/2011 a 31/12/2050. |
Date |
Cliente | Obligatorio para tickets mayores a 5.000 UI, e-factura y e-boleta de entrada. | Obj | ||
cliente.tipo_doc | Si | No | Tipo de documento:
2=RUT, 3=CI. Otros ver tabla. |
Int |
cliente.cod_pais_doc | Si | No | Código de país del documento, estándar Internacional ISO 3166-1 alfa-2, códigos de países de 2 letras.
UY=Uruguay. |
String |
cliente.nro_doc | Si | No | Corresponde al número del documento NIE, RUC o CI. CI con dígito verificador, sin puntos ni guiones. | String |
cliente.denominacion | Si | No | Máximo 150 caracteres, sin validación. | String |
cliente.direccion | Obligatorio solo para e-fact Exportación. | ‘N/D’ | Domicilio del receptor. Máximo 70 caracteres. Sin validación. | String |
cliente.ciudad | Obligatorio solo para e-fact Exportación. | ‘N/D’ | Ciudad del domicilio del receptor. Máximo 70 caracteres. Sin validación. | String |
cliente.dep_prov_estado | Obligatorio solo para e-fact Exportación. | No | Máximo 30 caracteres. Sin validación. | String |
cliente.pais | Obligatorio solo para e-fact Exportación. | No | Máximo 30 caracteres. Sin validación. | String |
cliente.cp | No | No | Código Postal. Numérico de 5. | Int |
cliente.informacion_adicional | No | No | Máximo 150 caracteres. Sin validación. | String |
cliente.identificacion_compra | No | No | Número que identifica la compra: número de pedido, número orden de compra, etc. Sin validación. | Int |
cliente.destino | No | No | Texto que Indicación de donde se entrega la mercadería o se presta el servicio (Dirección, Sucursal, Puerto, etc,). Sin validación máximo 100. | String |
id_externo | No | No | Token de idempotencia que identifica al comprobante para el sistema que hace la llamada. Si vuelve a intentar una solicitud de API con el mismo id_externo y los mismos parámetros de solicitud después de que se haya completado correctamente, se devuelve el resultado de la solicitud original. | String |
items | Obligatorio | Array | Array | |
item | Obligatorio | Donde dice Si, es obligatorio excepto para e-resguardos. | Obj | |
item.cantidad | Obligatorio | Si | Mayor que 0. Valor numérico de 14 enteros y 3 decimales. | Float |
item.concepto | Obligatorio | Si | Nombre del producto o servicio. Máximo 80 caracteres. | String |
item.precio | Obligatorio | Si | Precio unitario para el ítem. Mayor que 0. Hasta 6 decimales. | Float |
item.unidad | Obligatorio | Si | Unidad de medida el ítem. En caso que no corresponda, poner N/A. |
String |
item.indicador_facturacion | Obligatorio | Si |
1 – Exento de IVA (0) 2 – Tasa mínima (10) 3 – Tasa básica (22) 4 – Otra tasa 5 – Entrega gratuita 6 – Producto o servicio no facturable 7 – Producto o servicio no facturable negativo 8 – Ítem a rebajar en e-remitos y en e-remitos de exportación (solo remitos) 9 – Ítem a anular en resguardos 10 – Exportación y asimiladas 11 – Impuesto percibido 12 – IVA en suspenso |
Int |
item.descuento | No | No | Descuento por ítem en % | Float |
item.recargo | No | No | Recargo por ítem en % | Float |
item.descuento_mnt | No | No | Descuento por ítem en monto o importe | Float |
item.recargo_mnt | No | No | Recargo por ítem en monto o importe | Float |
item.retenciones_percepciones | No | Array | Array | |
item.retencion_percepcion.codigo | Si | No | Código Retención/Percepción/Crédito Fiscal de acuerdo a codificación DGI: Nº de Formulario más Nº de línea. Mayor que 0 | Int |
item.retencion_percepcion.tasa | No | No | Tasa vigente a la fecha del comprobante en %. Valor numérico de 3 enteros y 3 decimales. | Float |
item.retencion_percepcion.monto | No | No | Monto sujeto a retención/percepción/crédito fiscal Monto. Sin validación. | Float |
item.retencion_percepcion.informacion_adicional | No | No | Información relativa a la retención/percepción/crédito. Máximo 150. | String |
item.retencion_percepcion.valor | No | No | Valor de la retención/percepción/crédito fiscal. | String |
Referencias | No | Comprobantes referenciados por el comprobante a crear. Obligatorio en comprobantes de corrección (NC, ND). Máximo 40 elementos. | Array | |
Referencia | Obj | |||
referencia.tipo_comprobante | Si | No | Tipo de comprobante a referenciar. | Int |
referencia.serie | Si | No | Serie del comprobante a referenciar. | String |
referencia.numero | Si | No | Serie del comprobante a referenciar. | Int |
tipo_traslado | Obligatorio solo para remitos. | No | 1 = Venta
2 = Traslados internos |
Int |
clausula_venta | Obligatorio solo para e-fact Exportación. | No | Incoterms: FOB, CIF, etc.
Máximo tres caracteres. En caso que no corresponda, poner N/A y no es obligatorio imprimir. |
String |
modalidad_venta | Obligatorio solo para e-fact Exportación. | No | 1 = Régimen General
2 = Consignación 3 = Precio Revisable 4 = Bienes propios a enclaves aduaneros. 90 = Régimen general exportación de servicios. 99 = Otras transacciones. |
Int |
via_transporte | Obligatorio solo para e-fact, Nc y ND de Exportación. | No | 1 = Marítimo
2 = Aéreo 3 = Terrestre 8 = N/A 9 = Otro |
Int |
informacion_adicional | No | No | Texto de información adicional sin validación. Máximo 150 caracteres. | String |
giro_emisor | No | No | Texto indicando giro del emisor que corresponde a la transacción. No se valida. Máximo 60 caracteres. | String |
secreto_profesional | No | No | 1 = Operación amparada por el secreto profesional.
2 = Operación de venta por cuenta ajena amparada por el secreto profesional. |
Int |
Indicador_pagos_cuenta_terceros | No | No | 1 = Pagos por cuenta de terceros.
Indica si los montos facturados corresponden a un pago por cuenta de terceros (reintegro de gastos). |
Int |
Medio de Pago | No | No | Array | |
medio_pago.codigo | No | No | Código interno, sin validación. | Int |
medio_pago.glosa | Si el array tiene datos, es obligtorio. | No |
Identificación del medio de pago, sin validación. |
String |
medio_pago.valor | Si el array tiene datos, es obligtorio. | No | Valor del pago | Float |
indicador_cobranza_propia | No | No | 1 = Cobranza propia. Indica si los montos informados corresponden a una cobranza propia. Corresponde utilizar el indicador de facturación 6 o 7. | Int |
Adenda | No | No | Obj | |
adenda.texto | No | No | Información de carácter comercial que el emisor requiere transmitir al receptor electrónico. No se envía a DGI | String |
adenda.otro | No | No | Envío al receptor de informacion binaria(un archivo) | base64 |
Parámetros de Salida
Parámetro | ¿Nulo? | Descripción | Tipo |
id | No | Identificador interno del comprobante. | Int |
serie | No | Serie del comprobante. Máx 2 caracteres. | String |
numero | No | Número del comprobante. Máximo … | Int |
hash | No | Clave hash del comprobante | String |
cae_numero | No | CAE del comprobante generado. Largo 11. | Long |
cae_rango_inicio | No | Rango del CAE | Long |
cae_rango_final | No | Rango del CAE | Long |
cae_vencimiento | No | Fecha de venciiento del CAE. | Date |
url | No | URL de acceso al comprobante, para generar código QR. | String |
Detalles del sello digital
En el ángulo inferior izquierdo del documento deberá tener impreso:
- el QR-Code:
- Tamaño: mínimo de 22 x 22 mm con un margen de 3mm en los lados del sello
- Tamaño máximo de 30 x 30 mm con un margen de 5mm en los lados del sello.
- Debajo del QR-Code:
- la leyenda “Código de seguridad” (opcionalmente puede imprimirse en forma abreviada)
- y los 6 primeros caracteres del hash.
- Datos que contiene el QR-Code:
- Link al Portal de e-factura con los siguientes parámetros:
- Nº de RUC emisor;
- Tipo de CFE; o Nº de comprobante (Serie y Nº);
- Monto: (Remito “0”, Resguardo “A-C125” , e-Remito de Exportación “A-C124” y resto “A-C130”);
- Fecha de firma del CFE (dd/mm/yyyy);
- Código de seguridad del CFE (hash SHA-2). El link tendrá la siguiente forma: https://www.efactura.dgi.gub.uy/consultaQR/cfe?ruc,tipoCFE,serie,nroCFE,monto,fecha,hash
- Link al Portal de e-factura con los siguientes parámetros:
Ejemplo
POST: https://api-test.facturaelectronica.com.uy/comprobantes/crear
Enviar en el encabezado:
Authorization: Bearer [access-token-otorgado]
Content-Type: application/json
X-Emisor: "nro de rut del emisor"
Emisión de un e-ticket sin receptor
{
"sucursal": 1,
"tipo_comprobante": 101,
"forma_pago": 1,
"moneda": "UYU",
"cod_montos_brutos": 1,
"fecha_comprobante": "2019-02-18",
"items": [
{
"cantidad": 1,
"concepto": "Joystick Ergonómico",
"precio": 1356.3,
"indicador_facturacion": 3,
"unidad": "Un"
}
]
}
Emisión de nota de crédito de e-ticket sin receptor
{ "sucursal": 1, "tipo_comprobante": 102, "forma_pago": 1, "moneda": "UYU", "cod_montos_brutos": 1, "items": [
{
"cantidad": 1,
"concepto": "Anula ticket A-1",
"precio": 1356.3,
"indicador_facturacion": 3,
"unidad": "Un"
} ]
"referencias": [
{
"tipo_comprobante": 101,
"serie": "A", "numero": 1
} ] }
Emisión de una e-factura con receptor
{
"sucursal": 1,
"tipo_comprobante": 111,
"forma_pago": 1,
"moneda": "UYU",
"cod_montos_brutos": 1,
"fecha_comprobante": "2019-02-18",
"cliente": {
"tipo_doc": 2,
"cod_pais_doc": "UY",
"nro_doc": "219999830019",
"nombre": "ACME S.A."
},
"items": [{
"cantidad": 1,
"concepto": "Joystick Ergonómico",
"precio": 1356.3,
"indicador_facturacion": 3,
"unidad": "Un"
}]
}
Respuestas
{ "id": 488751, "comprobante_tipo": 0, "serie": "A", "numero": 2209, "importe_total": 1356.3, "hash": "m9May0sG7BBzXWMPLdSrxOOGL6E=", "cae_numero": 90180421560, "cae_rango_inicio": 2001, "cae_rango_final": 90000, "cae_vencimiento": "2030-03-03T00:00:00", "url": "https://www.efactura.dgi.gub.uy/consultaQR/cfe?216868680019,101,A,2209,1358.30,26/04/2021,m9May0sG7BBzXWMPLdSrxOOGL6E%3D" }
Emisión de un e-ticket con receptor y retención
{
"sucursal": 1,
"tipo_comprobante": 101,
"forma_pago": 1,
"sucursal": 1,
"moneda": "UYU",
"cod_montos_brutos": 1,
"fecha_comprobante": "2019-07-08",
"cliente":
{ "tipo_doc": 3,
"cod_pais_doc": "UY",
"nro_doc": "36000157",
"denominacion": "PEPE CORVINA" },
"items": [ {
"cantidad": 1,
"concepto": "Alquileres Varios",
"precio": 12563,
"indicador_facturacion": 1,
"retencion_percepcion": [ {
"codigo":1146171,
"informacion_adicional": "RET. S/ARREND",
"valor": 1507.56
}],
"unidad": "N/A"
}]
}
Respuestas
{
"id": 99781,
"serie": "A",
"numero": 101,
"hash": "yn/cUop+p8SZC1LwG2+4ktyJlzY=",
"cae_numero": 90180421860,
"cae_rango_inicio": 101,
"cae_rango_final": 1000,
"cae_vencimiento": "2020-07-26T00:00:00",
"url": "https://www.efactura.dgi.gub.uy/consultaQR/cfe?170005160013,101,A,101,12563.00,08/07/2019,yn/cUop+p8SZC1LwG2+4ktyJlzY="
}
Emisión de un e-resguardo
{
"sucursal": 1,
"tipo_comprobante": 182,
"moneda": "UYU",
"cod_montos_brutos": 1,
"fecha_comprobante": "2019-08-08",
"cliente": {
"tipo_doc": 3,
"cod_pais_doc": "UY",
"nro_doc": "36000157",
"denominacion": "PEPE CORVINA"
},
"items": [{
"retenciones_percepciones": [{
"codigo": 1146171,
"tasa": 10.500,
"monto": 10000,
"valor": 1050.0,
"InformacionAdicional": "RET. S/ARREND Y OTRAS RENTAS DE CAPITAL INMOBILIARIO (Código: 1146171) - 10.50%"
}]
}]
}
Respuestas
{
"id": 95223,
"serie": "A",
"numero": 4,
"hash": "0wpSemFwlv5z29MR3dZ8vK3WeS0=",
"cae_numero": 90190441416,
"cae_rango_inicio": 1,
"cae_rango_final": 10000,
"cae_vencimiento": "2021-07-22T00:00:00",
"url": "https://www.efactura.dgi.gub.uy/consultaQR/cfe?170005160013,182,A,4,1050.00,23/08/2019,0wpSemFwlv5z29MR3dZ8vK3WeS0%3D"
}
Tablas Tabla de Tipos de comprobante (DGI)
Código |
Tipo de Comprobante |
101 |
eTicket |
102 |
Nota de crédito de eTicket |
103 |
Nota de débito de eTicket |
111 |
eFactura |
112 |
Nota de crédito de eFactura |
113 |
Nota de débito de eFactura |
121 |
eFactura de exportación |
122 |
Nota de crédito de eFactura de exportación |
123 |
Nota de débito de eFactura de exportación |
124 |
eRemito de exportación |
131 |
eTicket Venta por cuenta ajena |
132 |
NC eTicket Venta por cuenta ajena |
133 |
ND eTicket venta por cuenta ajena |
141 |
eFactura Venta por cuenta ajena |
142 |
NC eFactura Venta por cuenta ajena |
143 |
ND eFactura venta por cuenta ajena |
151 |
eBoleta de entrada |
152 |
NC eBoleta de entrada |
153 |
ND eBoleta de entrada |
181 |
eRemito |
182 |
eResguardo |
Tabla de Tipos de Documento
Código | Tipo de Documento |
1 | NIE |
2 | RUT (Uruguay) |
3 | CI (Uruguay) |
4 | Otros |
5 | Pasaporte (todos los países) |
6 | DNI (documento de identidad de Argentina, Brasil, Chile o Paraguay) |
7 | NIFE: número de identificación fiscal extranjero (todos los países |
Indicador de facturación
Código | Descripción |
1 | Exento de IVA |
2 | Gravado a Tasa Mínima |
3 | Gravado a Tasa Básica |
4 | Gravado a Otra |
5 | Tasa/IVA sobre fictos |
6 | Producto o servicio no facturable |
7 | Producto o servicio no facturable negativo |
8 | Sólo para remitos Ítem a rebajar en e-remitos y en e-remitos de exportación. |
9 | Sólo para resguardos: Ítem a anular en resguardos. |
10 | Exportación y asimiladas |
11 | Impuesto percibido |
12 | IVA en suspenso |
13 | Sólo para e-Boleta de entrada y sus notas de corrección Ítem vendido por un no contribuyente. |
14 | Sólo para e-Boleta de entrada y sus notas de corrección Ítem vendido por un contribuyente Monotributo |
15 | Sólo para e-Boleta de entrada y sus notas de corrección Ítem vendido por un contribuyente IMEBA. |
16 | Sólo para ítems vendidos por contribuyentes con obligación IVA mínimo, Monotributo o Monotributo MIDES, o si se trata de un CFE de venta por cuenta ajena que el mandante tenga la obligación IVA mínimo. |
17 | Sólo para e-Boleta de entrada y sus notas de corrección si se trata de compra de moneda extranjera para su reventa y la contrapartida es en moneda local. |