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.

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

Formato AAAA-MM-DD.

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.

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:

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.
Tabla Indicador de facturación