Flashfact API

Emite facturas, boletas, notas de crédito y débito, y retenciones desde tu propio sistema, y consulta su estado ante la SUNAT. Tú envías los datos; Flashfact firma el comprobante con el certificado de tu empresa y lo envía.

URL basehttps://api.flashfact.pe

API Key y firma HMAC · JSON · v1

Sin conectar

Introducción

Con el plan API no operas desde el panel: emites y consultas comprobantes llamando a esta API. Cada empresa (RUC) tiene su propio par de claves y su propio certificado digital. Qué comprobantes incluye tu plan está en Plan, límites y términos.

La API tiene dos direcciones. api.flashfact.pe emite y consulta comprobantes y va firmada con tu Access Key y tu Secret. app-api.flashfact.pe sirve para dar de alta empresas y subir su certificado, y usa la sesión del panel.

Formato de las respuestas

  • JSON con codificación UTF-8. Un recurso viene en { "data": … }; un listado añade "meta": { total, page, perPage }.
  • Los comprobantes usan nombres en camelCase y en español (numDocumentoAdquirente). Clientes, sucursales y la parte de cuenta usan snake_case (id_type).
  • Los id son números enteros. Fechas en YYYY-MM-DD; marcas de tiempo en ISO 8601 UTC.
  • Los listados aceptan page y perPage; si no los envías, 1 y 20.

Primeros pasos

De cero a tu primer comprobante aceptado por SUNAT, en cuatro pasos.

  1. Agrega tu empresa y guarda las credenciales

    Desde el panel con el botón Agregar empresa, o con POST /v1/settings/companies. Recibes el Access Key ID y el Secret, que se muestra una sola vez. Cada RUC tiene su propio par.

  2. Sube el certificado digital y el usuario SOL

    Para emitir en producción necesitas el certificado .pfx o .p12 de la empresa y un usuario SOL secundario. Súbelos desde el panel o con POST /v1/settings/companies/{external_id}/certificate. Sin ellos el envío a SUNAT falla.

  3. Firma y emite una boleta

    Elige serie y correlativo: la API no los asigna, y tú llevas la numeración. Este ejemplo emite la boleta B001-00000123.

    bash
    API_KEY_ID="WISNA_..."
    API_SECRET="..."
    REQ_PATH="/v1/invoices"          # solo la ruta: sin dominio ni query string
    TIMESTAMP=$(date +%s)
    BODY='{"tipoDocumento":"03","tipoOperacion":"0101","serie":"B001","correlativo":"00000123","fechaEmision":"2026-10-11","moneda":"PEN","tipoDocumentoAdquirente":"1","numDocumentoAdquirente":"12345678","razonSocialAdquirente":"JUAN PEREZ","totalImpuestos":18.00,"totalValorVenta":100.00,"totalPrecioVenta":118.00,"importeTotal":118.00,"baseImponibleIGV":100.00,"totalIGV":18.00,"items":[{"numeroItem":1,"unidadMedida":"NIU","cantidad":2,"descripcion":"Polo de algodón","valorUnitario":50.00,"precioUnitario":59.00,"valorVenta":100.00,"afectacionIGV":"10","igv":18.00,"totalImpuestosItem":18.00}]}'
    
    BODY_HASH=$(printf '%s' "$BODY" | openssl dgst -sha256 | awk '{print $NF}')
    SIGNATURE=$(printf '%s\n%s\n%s\n%s' "$TIMESTAMP" "POST" "$REQ_PATH" "$BODY_HASH" \
      | openssl dgst -sha256 -hmac "$API_SECRET" | awk '{print $NF}')
    
    curl -X POST "https://api.flashfact.pe$REQ_PATH" \
      -H "X-Api-Key: $API_KEY_ID" \
      -H "X-Timestamp: $TIMESTAMP" \
      -H "X-Signature: $SIGNATURE" \
      -H "Content-Type: application/json" \
      -d "$BODY"
  4. Consulta el resultado

    La respuesta del paso anterior trae estado: "DRAFT": el comprobante quedó en cola. Pide GET /v1/invoices/{id} hasta que pase a ACCEPTED o REJECTED.

    json
    {
      "data": {
        "id": 1042,
        "serie": "B001",
        "correlativo": "00000123",
        "estado": "ACCEPTED",
        "codigoRespuesta": "0",
        "descripcionRespuesta": "La Boleta de Venta numero B001-00000123, ha sido aceptada",
        "pdfUrl": "https://…"
      }
    }

Autenticación

Cada request a api.flashfact.pe va firmado con el Access Key ID y el Secret de la empresa. No hay tokens que renovar: la firma se calcula en cada llamada.

HeaderValor
X-Api-KeyTu Access Key ID, con formato WISNA_<hex>.
X-TimestampHora actual en segundos Unix. Se acepta hasta 5 minutos de diferencia.
X-SignatureHMAC-SHA256 en hexadecimal del mensaje descrito abajo.

Cómo firmar

Arma este mensaje, con saltos de línea (\n) entre sus cuatro partes y sin salto al final, y fírmalo con tu Secret:

texto
{timestamp}
{MÉTODO_HTTP}
{ruta_sin_query_string}
{sha256_hex_del_body}
  • El método va en mayúsculas: POST, GET, DELETE.
  • La ruta es solo el path (/v1/invoices/1042): sin dominio y sin query string.
  • El hash es el SHA-256 en hexadecimal de los bytes exactos del body. Sin body (un GET), usa el hash de la cadena vacía: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.
  • El resultado es el HMAC-SHA256 de ese mensaje con tu Secret como clave, en hexadecimal.

Qué cubre la firma

La firma protege el método, la ruta y el body. Los parámetros de query (los filtros de un listado) no entran en ella, así que no los uses para nada sensible.

Rechazos de autenticación

  • 401 UNAUTHORIZED: faltan headers, el timestamp está fuera de la ventana, la key no existe o la firma no coincide.
  • 403 FORBIDDEN: la key tiene una lista de IPs permitidas y el request viene de otra. Pídela a soporte si la necesitas.

Conceptos clave

La emisión es asíncrona: estados

Crear un comprobante responde de inmediato con estado: "DRAFT". El envío a SUNAT ocurre después y el resultado se lee con un GET. Estos son los estados:

EstadoSignificado
DRAFTCreado y en cola. Todavía no se envía a SUNAT.
SENDINGEn proceso de envío.
SENTEnviado; SUNAT aún no entrega el resultado (resúmenes y guías, que usan ticket).
ACCEPTEDAceptado por SUNAT. Ya tiene CDR y PDF.
REJECTEDRechazado por SUNAT. Revisa codigoRespuesta y descripcionRespuesta.
FAILEDSe agotaron los reintentos de envío por una falla técnica. No es un rechazo de SUNAT.
VOID_PENDINGBaja solicitada, en proceso.
VOIDEDBaja confirmada por SUNAT.

Series y correlativos

Los eliges tú en cada emisión. La serie debe estar habilitada en SUNAT para tu empresa y el correlativo debe ser único dentro de ella. Facturas y boletas se numeran por serie (F001, B001); notas, retenciones, percepciones y guías tienen su propio prefijo.

Reintentos seguros

No existe un header de idempotencia: la clave es la serie y el correlativo. Si reenvías una factura, boleta o nota que ya existe, la API devuelve el documento original con 200 en lugar de duplicarlo. Retenciones, percepciones y guías no tienen esa protección.

Moneda extranjera y tipo de cambio

Si la moneda no es PEN puedes enviar tipoCambio. Si no lo envías, usamos el tipo de cambio SBS que corresponde por norma y lo guardamos con el comprobante. Un valor distinto al SBS se acepta y queda registrado como manual; si se aparta más de 10 %, debes confirmarlo con confirmarTipoCambio: true. La respuesta de creación trae tiposCambio con el valor usado.

Archivos del comprobante

El XML, el CDR y el PDF no tienen endpoint propio: llegan como enlaces firmados en xmlUrl, cdrUrl y pdfUrl, válidos por 15 minutos. Para un enlace más largo usa GET /v1/invoices/{id}/pdf-link (7 días).

Plan, límites y términos de uso

Este es un resumen para quien integra. Lo que vale es el texto completo de los Términos de uso, la Política de privacidad y la Política de cambios y devoluciones.

Qué incluye el plan API

ComprobantePlan API
FacturasIncluido
Boletas de ventaIncluido
Notas de crédito y de débitoIncluido
Comprobantes de retenciónIncluido
Guías de remisión (remitente y transportista)No incluido
Comprobantes de percepciónNo incluido

El plan API no incluye el panel web. Una misma cuenta puede manejar varias empresas (RUC) y todas comparten el mismo límite mensual. Términos, sección 3.

Tu límite mensual

  • Solo se descuentan las facturas, boletas y notas de crédito y débito que la SUNAT acepte. No se descuentan los rechazados, las guías, las retenciones ni las percepciones.
  • Anular un comprobante no devuelve el uso de tu límite del mes.
  • Al pasarte puedes seguir emitiendo hasta un 50 % más; esos comprobantes extra se cobran aparte, después de que termina el mes. Al llegar a ese tope no podrás emitir más hasta el mes siguiente o hasta cambiar de plan. Puedes desactivar el extra desde la configuración de tu plan: entonces el bloqueo es en tu límite exacto. Sección 7.

Lo que pones de tu parte

  • Un certificado digital vigente, emitido a nombre de tu empresa (.pfx o .p12). Si vence no podrás emitir hasta subir uno nuevo.
  • Un usuario SOL secundario. Nunca nos des tu clave SOL principal: no te la pediremos.
  • La exactitud de los datos, precios e impuestos de cada comprobante. Nosotros enviamos lo que tú envías. Sección 4.
  • Descargar y conservar tus comprobantes: la obligación de guardarlos por el plazo legal es tuya. Sección 12.

Tus claves de conexión

Son personales: todo lo que se haga con ellas se considera hecho por ti. Se muestran una sola vez; si las pierdes tendrás que crear unas nuevas. Si crees que alguien accedió sin permiso, revócalas de inmediato y avísanos. Sección 5.

Uso correcto del servicio

No está permitido emitir comprobantes falsos o de operaciones que no existieron, intentar entrar a cuentas ajenas, copiar, revender o ceder el acceso, ni sobrecargar el sistema con envíos masivos que afecten a otros clientes. Si se incumple, podemos limitar, pausar o cerrar la cuenta. Sección 14.

Pagos pendientes, cancelación y disponibilidad

  • Si un pago queda pendiente más de 7 días, la cuenta se pausa hasta que lo pagues. No se borran tus datos. Sección 10.
  • Tras cancelar conservamos tus datos 30 días; pasado ese plazo eliminamos tu certificado, tus credenciales SOL y tus llaves de acceso. Descarga tus comprobantes antes. Sección 11.
  • Trabajamos para que el servicio esté siempre disponible, pero no podemos garantizar que funcione sin interrupciones: pueden ocurrir mantenimientos o fallas de la SUNAT y de terceros. Sección 15.

Buenas prácticas

Límites técnicos

  • El body de un request puede pesar hasta 4 MB.
  • Los enlaces xmlUrl, cdrUrl y pdfUrl caducan a los 15 minutos; el de pdf-link, a los 7 días.
  • Una factura o boleta solo se puede anular dentro de los 7 días posteriores a su emisión.
  • El certificado digital que subes puede pesar hasta 512 KB y debe ser .pfx o .p12.

No hay webhooks: consulta el estado

La API no te avisa cuando SUNAT responde. Después de crear un documento consúltalo con un GET y espacia las consultas de forma creciente (por ejemplo 2, 4 y 8 segundos) en vez de repetirlas sin pausa. Deja de consultar cuando el estado sea ACCEPTED, REJECTED o FAILED.

Reintentos

  • Si un POST se corta sin respuesta, reenvíalo con la misma serie y correlativo: en facturas, boletas y notas recibirás el documento original en lugar de un duplicado.
  • Ante un 503 con Retry-After, espera ese tiempo antes de reintentar.
  • Un 422 no se arregla reintentando: corrige los campos que indica details.
  • Si el documento quedó en FAILED, no reenvíes uno nuevo con otro correlativo: contacta a soporte con el id.

Guarda lo que necesitas

Conserva el id, la serie y el correlativo de cada documento. Descarga el XML, el CDR y el PDF cuando el estado sea ACCEPTED y guárdalos en tu sistema; no guardes los enlaces firmados, porque caducan.

Errores

Todos los errores de la API siguen el mismo formato:

json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "se encontraron errores de validación",
    "details": [
      { "field": "serie", "code": "1001", "message": "la serie es obligatoria" }
    ]
  }
}

details solo aparece en errores de validación.

CódigoHTTPSignificado
VALIDATION_ERROR422Datos inválidos. details trae un elemento por campo; code es el código de error de SUNAT.
BAD_REQUEST400 / 409Request mal formado, id inválido o acción no permitida en el estado actual (409).
UNAUTHORIZED401Headers de firma faltantes, firma inválida, key desconocida o timestamp fuera de ventana.
FORBIDDEN403IP no permitida para la key, o cuenta sin permiso para la acción.
NOT_FOUND404El recurso no existe o no pertenece a tu empresa.
CONFLICT409El recurso ya existe (por ejemplo un cliente repetido).
RATE_SERVICE_UNAVAILABLE / RATE_DATA_PENDING503No hay tipo de cambio disponible. Reintenta tras Retry-After o envía tu tipoCambio.
INTERNAL_ERROR500 / 503Falla de nuestro lado. Un 503 al crear un comprobante significa que quedó guardado pero sin encolar.

Un 409 con BAD_REQUEST también aparece al reenviar un comprobante que no está en DRAFT o cuando una serie y correlativo ya existen y no se puede devolver el original.

Modelos de respuesta

Los ejemplos de cada endpoint muestran solo algunos campos. Aquí está la estructura completa. Tu cliente debe ignorar los campos que no conozca: podemos añadir campos nuevos dentro de v1 sin avisar.

Comprobante (factura o boleta)

Lo devuelven POST /v1/invoices, GET /v1/invoices y GET /v1/invoices/{id}. Los campos opcionales sin valor se omiten de la respuesta; no vienen como null.

Identificación

9 campos
CampoTipoDescripción
idnumberIdentificador numérico. Úsalo en las rutas /{id}.
seriestringSerie del comprobante.
correlativostringCorrelativo como texto, con los ceros a la izquierda que enviaste.
fechaEmisionstringYYYY-MM-DD.
fechaCreacionstringMarca de tiempo ISO 8601 UTC de cuando se guardó.
tipoDocumentostring01 factura o 03 boleta.
tipoOperacionstringCatálogo 51.
monedastringISO 4217.
formaPagostringContado o Credito.

Receptor

4 campos
CampoTipoDescripción
tipoDocumentoAdquirentestringCatálogo 6.
numDocumentoAdquirentestringDocumento del receptor.
razonSocialAdquirentestringNombre o razón social.
direccionAdquirentestringOpcional.

Totales

5 campos
CampoTipoDescripción
totalImpuestosnumberTotal de impuestos.
totalValorVentanumberValor de venta sin IGV.
totalPrecioVentanumberValor de venta con impuestos.
importeTotalnumberImporte a pagar.
baseImponibleIGV / totalIGV / recargoConsumonumberSolo si son distintos de cero.

Resultado de SUNAT

3 campos
CampoTipoDescripción
estadostringEstado actual. Ver la tabla de estados en Conceptos clave.
codigoRespuestastringCódigo de SUNAT. Solo aparece cuando SUNAT ya respondió.
descripcionRespuestastringMensaje de SUNAT. Solo aparece cuando SUNAT ya respondió.

Archivos

3 campos
CampoTipoDescripción
xmlUrlstringXML firmado. Enlace de 15 minutos; solo aparece cuando el archivo existe.
cdrUrlstringConstancia de recepción de SUNAT. Enlace de 15 minutos. En las guías es un .zip.
pdfUrlstringRepresentación impresa. Enlace de 15 minutos.

Detalle (items[] y cuotas[])

2 campos
CampoTipoDescripción
items[]arreglonumeroItem, descripcion, codigoProducto, unidadMedida, cantidad, valorUnitario, precioUnitario, valorVenta, totalImpuestosItem, igv, afectacionIGV.
cuotas[]arregloSolo en crédito: numero, monto, fechaVence.

Correos (solo en el detalle)

1 campo
CampoTipoDescripción
emailLogs[]arregloPor destinatario: toEmail, status (SENT, DELIVERED, BOUNCED, FAILED o COMPLAINED), error, sentAt, deliveredAt.

Baja (solo si se anuló)

4 campos
CampoTipoDescripción
motivoBajastringMotivo enviado a SUNAT.
ticketBajastringTicket de la comunicación de baja.
estadoBajastringPENDING, SENDING, SENT, COMPLETED, ERROR o FAILED.
fechaEnvioBaja / fechaResolucionstringCuándo se envió la baja y cuándo SUNAT la confirmó.

Otros

3 campos
CampoTipoDescripción
tiposCambio[]arregloSolo al crear, en moneda extranjera. Ver el modelo Tipo de cambio usado.
emittedByEmailstringUsuario que emitió, si se emitió desde el panel.
emittedByApiClientNamestringNombre de la API key que emitió (el RUC de la empresa).

Nota de crédito o débito

Lo devuelven POST /v1/notes, GET /v1/notes y GET /v1/notes/{id}. Comparte la estructura del comprobante (receptor, totales, items[], cuotas[], resultado de SUNAT, archivos y atribución) y añade estos campos.

Campos

11 campos
CampoTipoDescripción
idnumberIdentificador numérico. Úsalo en las rutas /{id}.
seriestringSerie del comprobante.
correlativostringCorrelativo como texto, con los ceros a la izquierda que enviaste.
fechaEmisionstringYYYY-MM-DD.
fechaCreacionstringMarca de tiempo ISO 8601 UTC de cuando se guardó.
tipoDocumentostring07 o 08.
tipoNotastringCatálogo 9 o 10.
motivoNotastringDescripción del motivo.
docModificadostringComprobante afectado, serie-correlativo.
tipoDocModificadostring01 o 03.
estadostringEstado actual.

Retención y percepción

Lo devuelven /v1/retenciones y /v1/percepciones. Incluyen estado, archivos y atribución como el comprobante.

Retención

9 campos
CampoTipoDescripción
idnumberIdentificador numérico. Úsalo en las rutas /{id}.
seriestringSerie del comprobante.
correlativostringCorrelativo como texto, con los ceros a la izquierda que enviaste.
fechaEmisionstringYYYY-MM-DD.
fechaCreacionstringMarca de tiempo ISO 8601 UTC de cuando se guardó.
codigoRegimen / tasaRetencionstring / numberRégimen del catálogo 23 y su tasa.
tipoDocumentoProveedor / rucProveedor / razonSocialProveedorstringProveedor.
totalRetenidonumberSuma de importes retenidos.
totalPagadonumberSuma de importes netos pagados, en soles.

Percepción

4 campos
CampoTipoDescripción
codigoRegimen / tasaPercepcionstring / numberRégimen del catálogo 22 y su tasa.
tipoDocumentoCliente / rucCliente / razonSocialClientestringCliente.
totalPercibidonumberSuma de importes percibidos.
totalCobradonumberSuma de importes netos cobrados, en soles.

Guía de remisión

Lo devuelven /v1/guias/remitente y /v1/guias/transportista. Incluyen estado, archivos y atribución.

Campos

10 campos
CampoTipoDescripción
idnumberIdentificador numérico. Úsalo en las rutas /{id}.
seriestringSerie del comprobante.
correlativostringCorrelativo como texto, con los ceros a la izquierda que enviaste.
fechaEmisionstringYYYY-MM-DD.
fechaCreacionstringMarca de tiempo ISO 8601 UTC de cuando se guardó.
tipoDocDestinatario / numDocDestinatario / nombreDestinatariostringDestinatario.
motivoTrasladostringCatálogo 20.
modalidadTransportestringCatálogo 18.
fechaInicioTrasladostringYYYY-MM-DD.
pesoBruto / unidadPesonumber / stringPeso y su unidad (KGM o TNE).

Tipo de cambio usado

Elemento de tiposCambio[] al crear un documento en moneda extranjera. En facturas, boletas y notas la posición 0 es la conversión para IGV, PLE y reportes, y la 1 es la de la detracción. En retenciones y percepciones hay uno por documento relacionado (campo item).

Campos

10 campos
CampoTipoDescripción
itemnumberPosición del documento relacionado (retenciones y percepciones).
monedastringMoneda convertida a PEN.
valorstring | nullTipo de cambio aplicado. null si aún no se pudo resolver.
origenstringsbs si coincide con el SBS aplicable; manual si lo enviaste distinto.
tasaSbsstringTipo de cambio SBS aplicable, para comparar.
desviacionPctnumberDesviación porcentual de tu valor frente al SBS.
fechaHecho / fechaCotizacionstringFecha del hecho generador y fecha de la cotización usada.
regla / reglaVersion / confianzastring / numberRegla normativa aplicada y su versión.
verificacionstringok, pendiente o no_disponible.
motivo / advertencias[]string / arregloTu motivo y avisos, por ejemplo un valor que se aparta del SBS.

Catálogos

Varios campos reciben códigos de los catálogos oficiales de la SUNAT (Anexo 8 de las reglas de validación, actualizadas al 24/04/2026). Cuando la API acepta solo una parte de un catálogo, la tabla lo indica en una columna aparte.

22 catálogos, 454 códigos

Cat. 1Tipo de comprobante41 códigos

Se usa en tipoDocumento, tipoDocModificado y los tipos de documentos relacionados

CódigoDescripciónLa API lo emite
01Factura Sí
03Boleta de venta Sí
04Liquidación de compra No
05Boletos de Transporte Aéreo que emiten las Compañías de Aviación Comercial por el servicio de transporte aéreo regular de pasajeros, emitido de manera manual, mecanizada o por medios electrónicos (BME) No
06Carta de porte aéreo No
07Nota de crédito Sí
08Nota de débito Sí
09Guía de remisión remitente Sí
11Póliza emitida por las Bolsas de Valores No
12Ticket de máquina registradora No
13Documento emitido por bancos, instituciones financieras, crediticias y de seguros que se encuentren bajo el control de la Superintendencia de Banca y Seguros No
14Recibo servicios públicos No
15Boletos emitidos por el servicio de transporte terrestre regular urbano de pasajeros y el ferroviario público de pasajeros prestado en vía férrea local No
16Boleto de viaje emitido por las empresas de transporte público interprovincial de pasajeros No
18Documentos emitidos por las AFP No
19Boleto por atracciones y espectáculos públicos No
20Comprobante de retención Sí
21Conocimiento de embarque por el servicio de transporte de carga marítima No
23Pólizas de Adjudicación por remate o adjudicación de bienes No
24Certificado de pago de regalías emitidas por PERUPETRO S.A. No
25Documento de atribución No
28Etiquetas por el pago de la Tarifa Unificada de Uso de Aeropuerto – TUUA No
29Documentos emitidos por la COFOPRI No
30Documentos emitidos por las empresas que desempeñan el rol adquirente en los sistemas de pago mediante tarjetas de crédito y débito, emitidas por bancos e instituciones financieras o crediticias, domiciliados o no en el país. No
31Guía de remisión transportista Sí
32Documentos emitidos por recaudadoras de la Garantía de Red Principal No
34Documento del Operador No
35Documento del Partícipe No
36Recibo de Distribución de Gas Natural No
37Documentos que emitan los concesionarios del servicio de revisiones técnicas No
40Comprobante de Percepción Sí
41Comprobante de Percepción – Venta interna ( físico - formato impreso) No
42Documentos emitidos por los adq. en los sistemas de pago por tarj. de crédito emitidas por ellas mismas No
43Boleto de compañías de aviación transporte aéreo no regular No
45Documentos emitidos por centros educativos y culturales, universidades, asociaciones y fundaciones No
55BVME para transporte ferroviario de pasajeros No
56Comprobante de pago SEAE / DAE-SEAE No
71Guía de remisión remitente complementaria No
72Guía de remisión transportista complementaria No
87Nota de crédito especial No
88Nota de débito especial No

La API emite facturas, boletas, notas, guías, retenciones y percepciones. Los demás tipos solo aparecen como documento relacionado en algunos campos.

Cat. 2Monedas30 códigos

Se usa en moneda

CódigoDescripción
PENSol peruano
USDDólar estadounidense
EUREuro
GBPLibra esterlina
JPYYen japonés
CHFFranco suizo
CADDólar canadiense
AUDDólar australiano
NZDDólar neozelandés
HKDDólar de Hong Kong
SGDDólar de Singapur
CNYYuan renminbi chino
KRWWon surcoreano
INRRupia india
THBBaht tailandés
MYRRinggit malayo
PHPPeso filipino
BRLReal brasileño
MXNPeso mexicano
CLPPeso chileno
COPPeso colombiano
ARSPeso argentino
BOBBoliviano
PYGGuaraní paraguayo
UYUPeso uruguayo
VESBolívar venezolano
SEKCorona sueca
NOKCorona noruega
DKKCorona danesa
ZARRand sudafricano

El catálogo de SUNAT remite a la norma ISO 4217, que tiene más monedas. Estas 30 son las que la API acepta hoy; cualquier otra responde 422 con el código 3088.

ISO 4217
Cat. 3Unidades de medida27 códigos

Se usa en items[].unidadMedida

CódigoDescripción
NIUUnidad (bienes)
ZZUnidad (servicios)
KGMKilogramo
GRMGramo
TNETonelada métrica
LBRLibra
LTRLitro
MLTMililitro
GLLGalón (US)
MTRMetro
CMTCentímetro
MMTMilímetro
MTKMetro cuadrado
MTQMetro cúbico
BXCaja
DZNDocena
PKPaquete
BGBolsa
BOBotella
SETJuego
PRPar
ROLRollo
HURHora
DAYDía
MONMes
ANNAño
KWHKilovatio hora

Son las más habituales. El catálogo de SUNAT usa la Recomendación 20 de UN/ECE, con cientos de unidades; la API solo exige que el código no esté vacío y la SUNAT valida el resto.

UN/ECE Recomendación 20
Cat. 4País

Se usa en codigoPaisEmisionPasaporte, codigoPaisResidenciaHuesped (hospedaje)

Código de país de 2 letras, por ejemplo PE, US o CL.

ISO 3166-1
Cat. 6Documento de identidad14 códigos

Se usa en tipoDocumentoAdquirente, id_type, tipoDocDestinatario, tipoDocRemitente y similares

CódigoDescripción
-Sin documento (consumidor final en boleta). Es un valor de la API; no figura en el catálogo oficial.
0Documento tributario no domiciliado sin RUC
1Documento Nacional de Identidad
4Carnet de extranjería
6Registro Único de Contribuyentes
7Pasaporte
ACédula Diplomática de identidad
BDocumento de identidad del país de residencia (no domiciliado)
CTax Identification Number - TIN – Doc Trib PP.NN
DIdentification Number - IN – Doc Trib PP. JJ
ETAM- Tarjeta Andina de Migración
FPermiso Temporal de Permanencia - PTP
GSalvoconducto
HCarné Permiso Temp.Perman. - CPP

Una factura de venta interna exige RUC. RUC y DNI se validan por formato (11 y 8 dígitos); los demás tipos aceptan hasta 15 caracteres sin espacios.

Cat. 7Afectación del IGV19 códigos

Se usa en items[].afectacionIGV

CódigoDescripciónCódigo de tributo
10Gravado - Operación Onerosa1000
11Gravado – Retiro por premio9996
12Gravado – Retiro por donación9996
13Gravado – Retiro9996
14Gravado – Retiro por publicidad9996
15Gravado – Bonificaciones9996
16Gravado – Retiro por entrega a trabajadores9996
17Gravado - IVAP1016 o 9996
20Exonerado - Operación Onerosa9997
21Exonerado - Transferencia gratuita9996
30Inafecto - Operación Onerosa9998
31Inafecto – Retiro por Bonificación9996
32Inafecto – Retiro9996
33Inafecto – Retiro por Muestras Médicas9996
34Inafecto - Retiro por Convenio Colectivo9996
35Inafecto – Retiro por premio9996
36Inafecto - Retiro por publicidad9996
37Inafecto - Transferencia gratuita9996
40Exportación de Bienes o Servicios9995 o 9996

En operaciones gratuitas, valorVenta es un valor referencial y no suma a totalValorVenta ni a totalImpuestos.

Cat. 8Sistema de cálculo del ISC3 códigos

Se usa en items[].sistemaISC

CódigoDescripción
01Sistema al valor (Apéndice IV, lit. A – T.U.O IGV e ISC)
02Aplicación del Monto Fijo ( Sistema específico, bienes en el apéndice III, Apéndice IV, lit. B – T.U.O IGV e ISC)
03Sistema de Precios de Venta al Público (Apéndice IV, lit. C – T.U.O IGV e ISC)
Cat. 9Tipo de nota de crédito13 códigos

Se usa en tipoNota con tipoDocumento 07

CódigoDescripción
01Anulación de la operación
02Anulación por error en el RUC
03Corrección por error en la descripción o atención de reclamo respecto de bienes adquiridos o servicios prestados Corrección por error en la descripción y/o código de producto SUNAT
04Descuento global
05Descuento por ítem
06Devolución total
07Devolución por ítem
08Bonificación
09Disminución en el valor
10Otros Conceptos
11Ajustes de operaciones de exportación
12Ajustes afectos al IVAP
13Corrección o modificación del monto neto pendiente de pago y/o la(s) fechas(s) de vencimiento del pago único o de las cuotas y/o los montos correspondientes a cada cuota, de ser el caso

Una nota con ítems de afectación 17 debe ser de tipo 12.

Cat. 10Tipo de nota de débito6 códigos

Se usa en tipoNota con tipoDocumento 08

CódigoDescripción
01Intereses por mora
02Aumento en el valor
03Penalidades/ otros conceptos
11Ajustes de operaciones de exportación
12Ajustes afectos al IVAP
13Penalidades

Una nota con ítems de afectación 17 debe ser de tipo 12.

Cat. 12Documentos relacionados tributarios11 códigos

Se usa en documentosRelacionados[].tipoDocumento

CódigoDescripciónSe acepta en facturas
01Factura – emitida para corregir error en el RUC No
02Factura – emitida por anticipos Sí
03Boleta de Venta – emitida por anticipos Sí
04Ticket de Salida - ENAPU Sí
05Código SCOP Sí
06Factura electrónica remitente Sí
07Guia de remisión remitente Sí
08Declaración de salida del depósito franco Sí
09Declaración simplificada de importación Sí
10Liquidación de compra - emitida por anticipos No
99Otros Sí

En boletas se aceptan 02, 03, 04, 05, 08, 09 y 99. Los tipos 02 y 03 son comprobantes de anticipo.

Cat. 13Ubigeo

Se usa en ubigeoOrigen, ubigeoDestino, ubigeoLugarOrigen y ubigeoLugarDestino

Código de 6 dígitos: 2 de departamento, 2 de provincia y 2 de distrito. Por ejemplo, 150101 es Lima, Lima, Lima.

Catálogo de ubigeos del INEI
Cat. 18Modalidad de transporte2 códigos

Se usa en modalidadTransporte

CódigoDescripción
01Transporte público
02Transporte privado
Cat. 20Motivo de traslado13 códigos

Se usa en motivoTraslado

CódigoDescripción
01Venta
02Compra
03Venta con entrega a terceros
04Traslado entre establecimientos de la misma empresa
05Consignación
06Devolución
07Recojo de bienes transformados
08Importación
09Exportación
13Otros
14Venta sujeta a confirmación del comprador
17Traslado de bienes para transformación
18Traslado emisor itinerante CP

Proveedor: solo motivos 02, 07 y 13. Comprador: solo motivos 03 y 13.

Cat. 22Régimen de percepción3 códigos

Se usa en codigoRegimen en percepciones

CódigoDescripciónTasa %
01Percepción Venta Interna2
02Percepción a la adquisición de combustible1
03Percepción realizada al agente de percepción con tasa especial0,5

tasaPercepcion debe coincidir con la tasa del régimen.

Cat. 23Régimen de retención2 códigos

Se usa en codigoRegimen en retenciones

CódigoDescripción
01Tasa 3%
02Tasa 6%

tasaRetencion debe coincidir con la tasa del régimen. El régimen 02 solo rige hasta el 28/02/2014.

Cat. 51Tipo de operación31 códigos

Se usa en tipoOperacion

CódigoDescripciónComprobante
0101Venta interna no sujeta a Detracción, Retención o PercepciónFactura, Boletas
0112Venta Interna - Sustenta Gastos Deducibles Persona NaturalFactura
0113Venta Interna-NRUSBoleta
0200Exportación de BienesFactura, Boletas
0201Exportación de Servicios – Prestación servicios realizados íntegramente en el paísFactura, Boletas
0202Exportación de Servicios – Prestación de servicios de hospedaje No DomiciliadoFactura
0203Exportación de Servicios – Transporte de navierasFactura, Boletas
0204Exportación de Servicios – Servicios a naves y aeronaves de bandera extranjeraFactura, Boletas
0205Exportación de Servicios - Servicios que conformen un Paquete TurísticoFactura
0206Exportación de Servicios – Servicios complementarios al transporte de cargaFactura, Boletas
0207Exportación de Servicios – Suministro de energía eléctrica a favor de sujetos domiciliados en ZEDFactura, Boletas
0208Exportación de Servicios – Prestación servicios realizados parcialmente en el extranjeroFactura, Boletas
0301Operaciones con Carta de porte aéreo (emitidas en el ámbito nacional)Factura, Boletas
0302Operaciones de Transporte ferroviario de pasajerosFactura, Boletas
0401Ventas no domiciliados que no califican como exportaciónFactura, Boletas
0501Compra internaLiquidación de compra
0502AnticiposLiquidación de compra
0503Compra de oroLiquidación de compra
1001Operación Sujeta a DetracciónFactura, Boletas
1002Operación Sujeta a Detracción- Recursos HidrobiológicosFactura, Boletas
1003Operación Sujeta a Detracción- Servicios de Transporte PasajerosFactura, Boletas
1004Operación Sujeta a Detracción- Servicios de Transporte CargaFactura, Boletas
2001Operación Sujeta a PercepciónFactura, Boletas
2002Operación sujeta a Retención de Renta de segunda categoríaFactura
2100Créditos a empresasFactura, Boletas
2101Créditos de consumo revolventeFactura, Boletas
2102Créditos de consumo no revolventeFactura, Boletas
2103Otras operaciones no gravadas - Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del públicoFactura, Boletas
2104Otras operaciones no gravadas - Empresas del sistema de segurosFactura, Boletas
2105Comprobante emitido por AFPBoleta
2106Venta Nacional a Turistas - Tax FreeFactura

Las operaciones 1001 a 1004 agregan automáticamente la leyenda 2006. Los códigos 05xx son de liquidación de compra, que esta API no emite.

Cat. 52Leyendas15 códigos

Se usa en leyendas[]

CódigoDescripción
1000Monto en Letras
1002Leyenda "TRANSFERENCIA GRATUITA DE UN BIEN Y/O SERVICIO PRESTADO GRATUITAMENTE"
2000Leyenda “COMPROBANTE DE PERCEPCIÓN”
2001Leyenda “BIENES TRANSFERIDOS EN LA AMAZONÍA REGIÓN SELVA PARA SER CONSUMIDOS EN LA MISMA"
2002Leyenda “SERVICIOS PRESTADOS EN LA AMAZONÍA REGIÓN SELVA PARA SER CONSUMIDOS EN LA MISMA”
2003Leyenda “CONTRATOS DE CONSTRUCCIÓN EJECUTADOS EN LA AMAZONÍA REGIÓN SELVA”
2004Leyenda “Agencia de Viaje - Paquete turístico”
2005Leyenda “Venta realizada por emisor itinerante”
2006Leyenda "Operación sujeta a detracción"
2007Leyenda "Operación sujeta al IVAP"
2008Leyenda: “VENTA EXONERADA DEL IGV-ISC-IPM. PROHIBIDA LA VENTA FUERA DE LA ZONA COMERCIAL DE TACNA”
2009Leyenda: “PRIMERA VENTA DE MERCANCÍA IDENTIFICABLE ENTRE USUARIOS DE LA ZONA COMERCIAL”
2010Restitucion Simplificado de Derechos Arancelarios
2011Leyenda “EXPORTACION DE SERVICIOS - DECRETO LEGISLATIVO Nº 919”
2012Observaciones relacionadas con el traslado de mercaderías

No repitas un código en el mismo comprobante.

Cat. 53Cargos, descuentos y deducciones22 códigos

Se usa en items[].descuentoTipo, items[].cargoTipo

CódigoDescripciónNivelSe acepta en un ítem
00Descuentos que afectan la base imponible del IGV/IVAPItem Sí
01Descuentos que no afectan la base imponible del IGV/IVAPItem Sí
02Descuentos globales que afectan la base imponible del IGV/IVAPGlobal No
03Descuentos globales que no afectan la base imponible del IGV/IVAPGlobal No
04Descuentos globales por anticipos gravados que afectan la base imponible del IGV/IVAPGlobal No
05Descuentos globales por anticipos exoneradosGlobal No
06Descuentos globales por anticipos inafectosGlobal No
07Factor de compensación - Decreto de urgencia N. 010-2004Item Sí
20Anticipo de ISCGlobal No
45FISEGlobal No
46Recargo al consumo y/o propinasGlobal No
47Cargos que afectan la base imponible del IGV/IVAPItem Sí
48Cargos que no afectan la base imponible del IGV/IVAPItem Sí
49Cargos globales que afectan la base imponible del IGV/IVAPGlobal No
50Cargos globales que no afectan la base imponible del IGV/IVAPGlobal No
51Percepción venta internaGlobal No
52Percepción a la adquisición de combustibleGlobal No
53Percepción realizada al agente de percepción con tasa especialGlobal No
54Factor de aportación - Decreto de urgencia N. 010-2004Item Sí
61Retención de renta por anticiposGlobal No
62Retención del IGVGlobal No
63Retención de renta de segunda categoríaGlobal No

Los de nivel global se envían con los totales (totalDescuentos, totalCargos, recargoConsumo), no por ítem. Un ítem no puede tener descuento y cargo a la vez; el cargo solo admite 47 o 48.

Cat. 54Bienes y servicios sujetos a detracción39 códigos

Se usa en adicional.detraccion.codigoSujeto

CódigoDescripción
001Azúcar y melaza de caña
002Arroz
003Alcohol etílico
004Recursos hidrobiológicos
005Maíz amarillo duro
007Caña de azúcar
008Madera
009Arena y piedra.
010Residuos, subproductos, desechos, recortes y desperdicios
011Bienes gravados con el IGV, o renuncia a la exoneración
012Intermediación laboral y tercerización
013Animales vivos
014Carnes y despojos comestibles
015Abonos, cueros y pieles de origen animal
016Aceite de pescado
017Harina, polvo y “pellets” de pescado, crustáceos, moluscos y demás invertebrados acuáticos
019Arrendamiento de bienes muebles
020Mantenimiento y reparación de bienes muebles
021Movimiento de carga
022Otros servicios empresariales
023Leche
024Comisión mercantil
025Fabricación de bienes por encargo
026Servicio de transporte de personas
027Servicio de transporte de carga
028Transporte de pasajeros
030Contratos de construcción
031Oro gravado con el IGV
032Paprika y otros frutos de los generos capsicum o pimienta
034Minerales metálicos no auríferos
035Bienes exonerados del IGV
036Oro y demás minerales metálicos exonerados del IGV
037Demás servicios gravados con el IGV
039Minerales no metálicos
040Bien inmueble gravado con IGV
041Plomo
044Servicio de beneficio de minerales metálicos gravado con el IGV
045Minerales de oro y sus concentrados gravados con el IGV
099Ley 30737
Cat. 55Concepto tributario o propiedad del ítem115 códigos

Se usa en items[].adicional

CódigoDescripciónLa API lo envía
3001Detracciones: Recursos Hidrobiológicos-Matrícula de la embarcación No
3002Detracciones: Recursos Hidrobiológicos-Nombre de la embarcación No
3003Detracciones: Recursos Hidrobiológicos-Tipo de especie vendida No
3004Detracciones: Recursos Hidrobiológicos-Lugar de descarga No
3005Detracciones: Recursos Hidrobiológicos-Fecha de descarga No
3006Detracciones: Recursos Hidrobiológicos-Cantidad de especie vendida No
3050Transportre Terreste - Número de asiento Sí
3051Transporte Terrestre - Información de manifiesto de pasajeros Sí
3052Transporte Terrestre - Número de documento de identidad del pasajero Sí
3053Transporte Terrestre - Tipo de documento de identidad del pasajero Sí
3054Transporte Terrestre - Nombres y apellidos del pasajero Sí
3055Transporte Terrestre - Ciudad o lugar de destino - Ubigeo Sí
3056Transporte Terrestre - Ciudad o lugar de destino - Dirección detallada No
3057Transporte Terrestre - Ciudad o lugar de origen - Ubigeo Sí
3058Transporte Terrestre - Ciudad o lugar de origen - Dirección detallada No
3059Transporte Terrestre - Fecha de inicio programado Sí
3060Transporte Terrestre - Hora de inicio programado Sí
4000Beneficio Hospedajes-Paquete turístico: Código de país de emisión del pasaporte Sí
4001Beneficio Hospedajes: Código de país de residencia del sujeto no domiciliado Sí
4002Beneficio Hospedajes: Fecha de ingreso al país Sí
4003Beneficio Hospedajes: Fecha de Ingreso al Establecimiento Sí
4004Beneficio Hospedajes: Fecha de Salida del Establecimiento Sí
4005Beneficio Hospedajes: Número de Días de Permanencia Sí
4006Beneficio Hospedajes: Fecha de Consumo Sí
4007Beneficio Hospedajes-Paquete turístico: Nombres y apellidos del huesped Sí
4008Beneficio Hospedajes-Paquete turístico: Tipo de documento de identidad del huesped Sí
4009Beneficio Hospedajes-Paquete turístico: Número de documento de identidad del huesped Sí
4030Carta Porte Aéreo: Lugar de origen - Código de ubigeo No
4031Carta Porte Aéreo: Lugar de origen - Dirección detallada No
4032Carta Porte Aéreo: Lugar de destino - Código de ubigeo No
4033Carta Porte Aéreo: Lugar de destino - Dirección detallada No
4040BVME transporte ferroviario: Pasajero - Apellidos y Nombres No
4041BVME transporte ferroviario: Pasajero - Tipo de documento de identidad No
4042BVME transporte ferroviario: Servicio transporte: Ciudad o lugar de origen - Código de ubigeo No
4043BVME transporte ferroviario: Servicio transporte: Ciudad o lugar de origen - Dirección detallada No
4044BVME transporte ferroviario: Servicio transporte: Ciudad o lugar de destino - Código de ubigeo No
4045BVME transporte ferroviario: Servicio transporte: Ciudad o lugar de destino - Dirección detallada No
4046BVME transporte ferroviario: Servicio transporte:Número de asiento No
4047BVME transporte ferroviario: Servicio transporte: Hora programada de inicio de viaje No
4048BVME transporte ferroviario: Servicio transporte: Fecha programada de inicio de viaje No
4049BVME transporte ferroviario: Pasajero - Número de documento de identidad No
4060Regalía Petrolera: Decreto Supremo de aprobación del contrato No
4061Regalía Petrolera: Area de contrato (Lote) No
4062Regalía Petrolera: Periodo de pago - Fecha de inicio No
4063Regalía Petrolera: Periodo de pago - Fecha de fin No
4064Regalía Petrolera: Fecha de Pago No
5000Proveedores Estado: Número de Expediente No
5001Proveedores Estado: Código de Unidad Ejecutora No
5002Proveedores Estado: N° de Proceso de Selección No
5003Proveedores Estado: N° de Contrato No
5010Numero de Placa Sí
5011Categoria No
5012Marca No
5013Modelo No
5014Color No
5015Motor No
5016Combustible No
5017Form. Rodante No
5018VIN No
5019Serie/Chasis No
5020Año fabricacion No
5021Año modelo No
5022Version No
5023Ejes No
5024Asientos No
5025Pasajeros No
5026Ruedas No
5027Carroceria No
5028Potencia No
5029Cilindros No
5030Ciliindrada No
5031Peso Bruto No
5032Peso Neto No
5033Carga Util No
5034Longitud No
5035Altura No
5036Ancho No
5060Gas Natural - Lectura Anterior No
5061Gas Natural - Lectura Actual No
5062Gas Natural - Volumen consumido a Condiciones de lectura No
5063Gas Natural - Factor de correccion del volumen No
5064Gas Natural - Volumen a condiciones Estandares No
5065Gas Natural - Volumen facturado No
5066Gas Natural - Poder Calorifico Superior Promedio del Gas No
6000Comercialización de Oro: Código Unico Concesión Minera No
6001Comercialización de Oro: N° declaración compromiso No
6002Comercialización de Oro: N° Reg. Especial .Comerci. Oro No
6003Comercialización de Oro: N° Resolución que autoriza Planta de Beneficio No
6004Comercialización de Oro: Ley Mineral (% concent. oro) No
6005Comercialización de Oro : Naturaleza del mineral No
6006Comercialización de Oro : Nombre del derecho minero No
7000Gastos Art. 37 Renta: Número de Placa Sí
7001Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Tipo de préstamo No
7002Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Indicador de Primera Vivienda No
7003Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Partida Registral No
7004Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Número de contrato No
7005Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Fecha de otorgamiento del crédito No
7006Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Código de ubigeo No
7007Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Dirección completa No
7008Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Urbanización No
7009Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Provincia No
7010Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Distrito No
7011Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Dirección del predio - Departamento No
7012Empresas del sistema financiero y cooperativas de ahorro y crédito no autorizadas a captar recursos del público: Monto del crédito otorgado (capital) No
7013Empresas del sistema de seguro: Número de póliza No
7014Empresas del sistema de seguro: Fecha de inicio/término de vigencia de cobertura No
7015Empresas del sistema de seguro: Tipo de seguro No
7016Empresas del sistema de seguro: Suma asegurada / alcance de cobertura o monto No
7017AFP: CUSPP No
7018AFP: Periodo No
7019AFP: Monto del interes moratorio No
7020Partida arancelaria No
7021Numero de declaracion aduanera (DAM) No
7022Indicador de bien normalizado No
7023Numero de serie en la DAM o DS No

Son los datos adicionales de un ítem: transporte terrestre de pasajeros (3050 a 3060), hospedaje y paquete turístico (4000 a 4009), placas (5010 y 7000). El transporte de carga se envía por el bloque servicioTransporteCarga.

Cat. 59Medios de pago22 códigos

Se usa en adicional.detraccion.medioPago

CódigoDescripciónSe acepta en detracción
001Depósito en cuenta Sí
002Giro Sí
003Transferencia de fondos Sí
004Orden de pago Sí
005Tarjeta de débito Sí
006Tarjeta de crédito emitida en el país por una empresa del sistema financiero Sí
007Cheques con la cláusula de "NO NEGOCIABLE", "INTRANSFERIBLES", "NO A LA ORDEN" u otra equivalente, a que se refiere el inciso g) del artículo 5° de la ley Sí
008Efectivo, por operaciones en las que no existe obligación de utilizar medio de pago Sí
009Efectivo, en los demás casos Sí
010Medios de pago usados en comercio exterior Sí
011Documentos emitidos por las EDPYMES y las cooperativas de ahorro y crédito no autorizadas a captar depósitos del público Sí
012Tarjeta de crédito emitida en el país o en el exterior por una empresa no perteneciente al sistema financiero, cuyo objeto principal sea la emisión y administración de tarjetas de crédito Sí
013Tarjetas de crédito emitidas en el exterior por empresas bancarias o financieras no domiciliadas No
101Transferencias – Comercio exterior No
102Cheques bancarios - Comercio exterior No
103Orden de pago simple - Comercio exterior No
104Orden de pago documentario - Comercio exterior No
105Remesa simple - Comercio exterior No
106Remesa documentaria - Comercio exterior No
107Carta de crédito simple - Comercio exterior No
108Carta de crédito documentario - Comercio exterior No
999Otros medios de pago No
Cat. 61Documentos relacionados al transporte26 códigos

Se usa en documentosRelacionados[].tipoDoc en guías

CódigoDescripciónGuía aplicable
01Facturaremitente, transportista
03Boleta de Ventaremitente, transportista
04Liquidación de Compraremitente, transportista
09Guía de Remisión Remitenteremitente, transportista
12Ticket o cinta emitido por máquina registradoraremitente, transportista
31Guía de Remisión Transportistasolo transportista
48Comprobante de Operaciones – Ley N° 29972remitente, transportista
49Constancia de Depósito - IVAP (Ley 28211)solo remitente
50Declaración Aduanera de Mercancíasremitente, transportista
52Declaración Simplificada (DS)remitente, transportista
65Autorización de Circulación para transportar MATPEL – Callaosolo transportista
66Autorización de Circulación para transporte de carga y mercancías en Lima Metropolitanasolo transportista
67Permiso de Operación Especial para el servicio de transporte de MATPEL - MTCsolo transportista
68Habilitación Sanitaria de Transporte Terrestre de Productos Pesqueros y Acuícolassolo transportista
69Permiso / Autorización de operación de transporte de mercancíassolo transportista
71Resolución de Adjudicación de bienes – SUNATsolo remitente
72Resolución de Comiso de bienes – SUNATsolo remitente
73Guía de Transporte Forestal o de Fauna - SERFORsolo remitente
74Guía de Tránsito – SUCAMECsolo remitente
75Autorización para operar como empresa de Saneamiento Ambiental – MINSA -solo remitente
76Autorización para manejo y recojo de residuos sólidos peligrosos y no peligrosossolo remitente
77Certificado fitosanitario la movilización de plantas, productos vegetales, y otros artículos reglamentadossolo remitente
78Registro Único de Usuarios y Transportistas de Alcohol Etílicosolo remitente
80Constancia de Depósito – Detracciónremitente, transportista
81Código de autorización emitida por el SCOPsolo remitente
82Declaración jurada de mudanzasolo transportista

La guía transportista debe incluir al menos una guía remitente (09) o transportista (31).

Referencia de endpoints

Cada endpoint indica sus campos, un ejemplo de request y todas las respuestas posibles. Todos se pueden probar en Demo.

Facturas y boletas

api.flashfact.pe · API Key + firma HMAC

Una factura (01) o boleta (03) se crea en estado DRAFT y se envía a SUNAT en segundo plano. Consulta el detalle hasta ver ACCEPTED o REJECTED.

Emitir una factura o boleta

POST/v1/invoices

Valida el comprobante con las reglas de SUNAT, lo guarda y lo encola. La respuesta solo confirma que quedó en cola: el resultado de SUNAT llega después. Es idempotente por serie y correlativo.

Identificación

10 campos · 6 obligatorios
CampoTipoDescripción
tipoDocumentoobligatoriostring01 factura o 03 boleta.
tipoOperacionobligatoriostringCatálogo 51. 0101 = venta interna; 02xx exportación; 1001-1004 detracción.
serieobligatoriostringF + 3 alfanuméricos para facturas (F001); B + 3 para boletas (B001). Debe estar habilitada en SUNAT.
correlativoobligatoriostringNumérico, de 1 a 8 dígitos. Lo asignas tú: la API no autogenera correlativos.
fechaEmisionobligatoriostringYYYY-MM-DD.
horaEmisionstringHH:MM:SS.
fechaVencimientostringYYYY-MM-DD.
monedaobligatoriostringISO 4217: PEN, USD...
codigoEstablecimientostringCódigo de establecimiento anexo SUNAT. Por defecto 0000.
incotermstringCódigo Incoterm de la operación (por ejemplo FOB o CIF). Solo exportación.

Receptor

5 campos · 3 obligatorios
CampoTipoDescripción
tipoDocumentoAdquirenteobligatoriostringCatálogo 6: 6 RUC, 1 DNI, 4 carnet de extranjería, 7 pasaporte, - sin documento (boleta). Una factura de venta interna exige 6.
numDocumentoAdquirenteobligatoriostringRUC de 11 dígitos o DNI de 8. Otros tipos: alfanumérico de hasta 15 sin espacios.
razonSocialAdquirenteobligatoriostringEntre 3 y 1500 caracteres.
direccionAdquirentestringDirección del receptor.
correosNotificacion[]arregloCorreos a los que se envía el comprobante al quedar listo.

Totales

11 campos · 4 obligatorios
CampoTipoDescripción
totalImpuestosobligatorionumberSuma de totalImpuestosItem, con el descuento o cargo global prorrateado.
totalValorVentaobligatorionumberValor de venta sin IGV.
totalPrecioVentaobligatorionumberValor de venta con impuestos.
importeTotalobligatorionumberImporte a pagar. Incluye recargoConsumo si lo hay.
baseImponibleIGV / totalIGVnumberBase gravada e IGV. Se pueden calcular desde los ítems.
totalExonerado / totalInafecto / totalExportacion / totalGratuitonumberBases por tipo de afectación.
totalISC / totalICBPER / totalOtrosTributosnumberOtros tributos.
totalVentaIvap / sumatoriaIvapnumberOperaciones afectas al IVAP (afectación 17).
totalDescuentos / totalCargosnumberDescuentos y cargos globales.
recargoConsumonumberRecargo al consumo (cargo con código 46); no afecta la base del IGV.
redondeo / totalAnticiposnumberAjuste por redondeo y anticipos descontados.

Ítems (items[])

21 campos · 9 obligatorios
CampoTipoDescripción
numeroItemobligatorionumberPosición del ítem, desde 1.
unidadMedidaobligatoriostringCatálogo 3: NIU (unidad), ZZ (servicio), KGM...
cantidadobligatorionumberMayor que 0.
descripcionobligatoriostringDescripción del bien o servicio.
codigoProductostringCódigo interno de tu catálogo.
valorUnitarioobligatorionumberPrecio unitario sin IGV.
precioUnitarioobligatorionumberPrecio unitario con IGV.
valorVentaobligatorionumbercantidad × valorUnitario, menos descuento del ítem.
afectacionIGVobligatoriostringCatálogo 7: 10 gravado, 20 exonerado, 30 inafecto, 40 exportación, 11-16 / 21 / 31-36 gratuitos, 17 IVAP.
igvnumberIGV del ítem.
totalImpuestosItemobligatorionumberSuma de impuestos del ítem (IGV + ISC + ICBPER + otros).
iscnumberISC del ítem. Requiere sistemaISC.
sistemaISCstringCatálogo 8.
icbpernumberImpuesto a la bolsa de plástico.
otrosTributosnumberOtros tributos del ítem.
descuentoTipostringCatálogo 53. Obligatorio si envías descuentoMonto.
descuentoMontonumberDescuento del ítem. Excluyente con cargo.
cargoTipostringCatálogo 53: 47 afecta la base del IGV, 48 no.
cargoMontonumberCargo del ítem. Excluyente con descuento.
valorReferencialnumberValor referencial unitario, para operaciones gratuitas.
adicionalobjetoDatos de catálogo 55 (transporte de carga, pasajeros, hospedaje, paquete turístico).

Forma de pago

3 campos
CampoTipoDescripción
formaPago.tipostringContado o Credito.
formaPago.montonumberMonto pendiente de pago (crédito).
formaPago.cuotas[]arregloSolo crédito. Cada cuota: numero, monto, fechaVence (YYYY-MM-DD).

Tipo de cambio (moneda distinta de PEN)

5 campos
CampoTipoDescripción
tipoCambionumber | stringTipo de cambio a PEN si la moneda no es PEN (hasta 4 enteros y 6 decimales). Si lo omites se usa el SBS aplicable.
fechaCambiostringYYYY-MM-DD. Fecha a la que corresponde el tipo de cambio enviado (informativa).
motivoTipoCambiostringPor qué difiere del SBS (TC pactado, banco, contrato).
confirmarTipoCambiobooleanObligatorio en true si tu valor se aparta más de 10 % del SBS.
fechaHechoGeneradorstringYYYY-MM-DD. Fecha que fija el tipo de cambio del IGV. Por defecto, fechaEmision.

Otros

6 campos
CampoTipoDescripción
leyendas[]arregloCódigos del catálogo 52. Sin repetidos.
ordenComprastringNúmero de orden de compra.
guiasRelacionadas[]arreglo{ tipoGuia: 09 | 31, numeroGuia }.
documentosRelacionados[]arreglo{ tipoDocumento (cat. 12), numeroDocumento }.
adicional.detraccionobjetocodigoSujeto (cat. 54), numeroCuenta, medioPago (cat. 59), monto, porcentaje, fechaDeposito.
adicional.anticipos[]arregloidentificadorPago, serieNumero, tipoComprobante (02 | 03), montoAnticipado, fechaPago.

Ejemplo de request

json
{
  "tipoDocumento": "03",
  "tipoOperacion": "0101",
  "serie": "B001",
  "correlativo": "00000123",
  "fechaEmision": "2026-10-11",
  "moneda": "PEN",
  "tipoDocumentoAdquirente": "1",
  "numDocumentoAdquirente": "12345678",
  "razonSocialAdquirente": "JUAN PEREZ",
  "totalImpuestos": 18.00,
  "totalValorVenta": 100.00,
  "totalPrecioVenta": 118.00,
  "importeTotal": 118.00,
  "baseImponibleIGV": 100.00,
  "totalIGV": 18.00,
  "formaPago": { "tipo": "Contado" },
  "correosNotificacion": ["juan@correo.com"],
  "items": [
    {
      "numeroItem": 1,
      "unidadMedida": "NIU",
      "cantidad": 2,
      "descripcion": "Polo de algodón",
      "valorUnitario": 50.00,
      "precioUnitario": 59.00,
      "valorVenta": 100.00,
      "afectacionIGV": "10",
      "igv": 18.00,
      "totalImpuestosItem": 18.00
    }
  ]
}

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 1042,
    "tipoDocumento": "03",
    "tipoOperacion": "0101",
    "serie": "B001",
    "correlativo": "00000123",
    "fechaEmision": "2026-10-11",
    "moneda": "PEN",
    "tipoDocumentoAdquirente": "1",
    "numDocumentoAdquirente": "12345678",
    "razonSocialAdquirente": "JUAN PEREZ",
    "totalImpuestos": 18,
    "totalValorVenta": 100,
    "totalPrecioVenta": 118,
    "importeTotal": 118,
    "baseImponibleIGV": 100,
    "totalIGV": 18,
    "formaPago": "Contado",
    "estado": "DRAFT",
    "items": [ { "numeroItem": 1, "descripcion": "Polo de algodón", "cantidad": 2, "valorVenta": 100, "afectacionIGV": "10" } ],
    "fechaCreacion": "2026-10-11T15:04:05Z"
  }
}

Notas

  • Los totales se validan contra los ítems con tolerancia de ±1 sol. Un descuento o cargo global se prorratea entre las bases por tipo de afectación.
  • En producción la empresa necesita certificado digital y usuario SOL secundario configurados; sin ellos el envío falla.

Listar comprobantes

GET/v1/invoices

Parámetros de query

11 campos
CampoTipoDescripción
tipoDocumentostring01 o 03.
estadostringUno o varios separados por coma (REJECTED,FAILED): DRAFT, SENDING, SENT, ACCEPTED, REJECTED, FAILED, VOID_PENDING o VOIDED.
fechaDesde / fechaHastastringYYYY-MM-DD, ambos inclusive.
seriestringUna o varias series separadas por coma: F001,B001.
numDocAdquirentestringRUC o DNI del receptor.
monedastringPEN, USD...
formaPagostringContado o Credito, sin distinguir mayúsculas.
importeMin / importeMaxnumberRango de importe total.
qstringBúsqueda libre por receptor, serie y correlativo.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": [ { "id": 1042, "serie": "B001", "correlativo": "00000123", "estado": "ACCEPTED", "importeTotal": 118, "pdfUrl": "https://…" } ],
  "meta": { "total": 1, "page": 1, "perPage": 20 }
}

Notas

  • Cada elemento trae los mismos campos que el detalle, con enlaces firmados de 15 minutos.

Detalle de un comprobante

GET/v1/invoices/{id}

Incluye el resultado de SUNAT, la información de baja si existe, el historial de correos y los enlaces de descarga.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 1042,
    "tipoDocumento": "03",
    "serie": "B001",
    "correlativo": "00000123",
    "importeTotal": 118,
    "estado": "ACCEPTED",
    "codigoRespuesta": "0",
    "descripcionRespuesta": "La Boleta de Venta numero B001-00000123, ha sido aceptada",
    "xmlUrl": "https://…/B001-00000123.xml?X-Amz-Expires=900…",
    "cdrUrl": "https://…/R-B001-00000123.xml?…",
    "pdfUrl": "https://…/B001-00000123.pdf?…",
    "emailLogs": [
      { "toEmail": "juan@correo.com", "status": "DELIVERED", "sentAt": "2026-10-11T15:04:20Z" }
    ],
    "fechaCreacion": "2026-10-11T15:04:05Z"
  }
}

Notas

  • xmlUrl, cdrUrl y pdfUrl son enlaces firmados que duran 15 minutos y solo aparecen cuando el archivo ya existe. Pide el detalle otra vez para renovarlos.
  • Si el comprobante fue dado de baja verás motivoBaja, ticketBaja, estadoBaja (PENDING, SENDING, SENT, COMPLETED, ERROR, FAILED), fechaEnvioBaja y fechaResolucion.

Totales de un filtro

GET/v1/invoices/summary

Acepta los mismos filtros que el listado (sin paginación) y devuelve cantidades y montos vigentes.

Parámetros de query

9 campos
CampoTipoDescripción
tipoDocumentostring01 o 03.
estadostringUno o varios separados por coma (REJECTED,FAILED): DRAFT, SENDING, SENT, ACCEPTED, REJECTED, FAILED, VOID_PENDING o VOIDED.
fechaDesde / fechaHastastringYYYY-MM-DD, ambos inclusive.
seriestringUna o varias series separadas por coma: F001,B001.
numDocAdquirentestringRUC o DNI del receptor.
monedastringPEN, USD...
formaPagostringContado o Credito, sin distinguir mayúsculas.
importeMin / importeMaxnumberRango de importe total.
qstringBúsqueda libre por receptor, serie y correlativo.

Respuestas

json
{
  "data": {
    "count": 42,
    "totalPEN": 15230.5,
    "totalUSD": 800,
    "byStatus": { "ACCEPTED": 40, "REJECTED": 1, "DRAFT": 1 }
  }
}

Reenviar un comprobante a SUNAT

POST/v1/invoices/{id}/emit

Vuelve a encolar un comprobante que quedó en DRAFT (por ejemplo, si falló la cola al crearlo) o reenvía uno en FAILED, con el mismo número, después de corregir la causa del error (certificado, credenciales SOL…). El motivo del último intento fallido viene en descripcionRespuesta.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

json
{ "data": { "id": 1042, "estado": "DRAFT", "mensaje": "comprobante enviado a la cola de emisión" } }

Anular un comprobante

POST/v1/invoices/{id}/void

Factura: comunicación de baja. Boleta: se incluye en el resumen diario. Solo si está ACCEPTED y dentro de 7 días desde la emisión.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Cuerpo (JSON)

1 campo · 1 obligatorio
CampoTipoDescripción
motivoobligatoriostringMínimo 3 caracteres. Obligatorio para facturas; las boletas no lo usan.

Ejemplo de request

json
{ "motivo": "Error en el importe" }

Respuestas

json
{ "data": { "estado": "VOID_PENDING" } }

Notas

  • El avance se consulta en el detalle (estado y estadoBaja) o en GET /v1/invoices/bajas.

Listar comunicaciones de baja

GET/v1/invoices/bajas

Parámetros de query

3 campos
CampoTipoDescripción
invoiceIdnumberSolo las bajas que incluyen ese comprobante.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

json
{
  "data": [
    {
      "id": 7, "fechaReferencia": "2026-10-11", "ticket": "202610110001", "estado": "COMPLETED",
      "cdrUrl": "https://…",
      "documentos": [ { "invoiceId": 1042, "serie": "F001", "correlativo": "00000010", "motivoBaja": "Error en el importe" } ]
    }
  ],
  "meta": { "total": 1, "page": 1, "perPage": 20 }
}

Enviar el comprobante por correo

POST/v1/invoices/{id}/send-email

Envía el PDF, XML y CDR de un comprobante ya emitido a las direcciones indicadas.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Cuerpo (JSON)

1 campo · 1 obligatorio
CampoTipoDescripción
emails[]obligatorioarregloAl menos un correo.

Ejemplo de request

json
{ "emails": ["contabilidad@cliente.com"] }

Respuestas

json
{ "data": { "status": "sent" } }

Regenerar el PDF

POST/v1/invoices/{id}/regenerate-pdf

Vuelve a generar el PDF con la plantilla vigente de la empresa. El XML y el CDR no se tocan. Aplica igual a /v1/notes, /v1/retenciones, /v1/percepciones y /v1/guias/*.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

json
{ "data": { "status": "queued" } }

Notas de crédito y débito

api.flashfact.pe · API Key + firma HMAC

Corrigen o ajustan una factura o boleta ya emitida. Se envían a SUNAT igual que un comprobante: nacen en DRAFT y se resuelven en segundo plano.

Emitir una nota de crédito o débito

POST/v1/notes

Si la moneda no es PEN y no envías tipoCambio, se hereda el del comprobante afectado cuando existe. Es idempotente por serie y correlativo.

Nota

14 campos · 13 obligatorios
CampoTipoDescripción
tipoDocumentoobligatoriostring07 nota de crédito u 08 nota de débito.
serieobligatoriostringF + 3 alfanuméricos si modifica una factura (FC01); B + 3 si modifica una boleta (BC01).
correlativoobligatoriostringNumérico, de 1 a 8 dígitos.
fechaEmisionobligatoriostringYYYY-MM-DD.
monedaobligatoriostringISO 4217.
tipoNotaobligatoriostringCatálogo 9 para NC (01-13) o catálogo 10 para ND (01, 02, 03, 11, 12, 13). La nota 12 es para operaciones IVAP.
motivoNotaobligatoriostringDescripción del motivo, hasta 500 caracteres.
docModificadoobligatoriostringComprobante afectado como serie-correlativo, por ejemplo F001-00000010.
tipoDocModificadoobligatoriostring01 factura o 03 boleta.
tipoDocumentoAdquirenteobligatoriostringCatálogo 6.
numDocumentoAdquirenteobligatoriostringDocumento del receptor.
razonSocialAdquirenteobligatoriostringNombre o razón social.
totalImpuestos / totalValorVenta / totalPrecioVenta / importeTotalobligatorionumberTotales de la nota, con las mismas reglas que una factura.
baseImponibleIGV, totalIGV, totalExonerado, totalInafecto...numberTributos desagregados, igual que en POST /v1/invoices.

Ítems (items[])

21 campos · 9 obligatorios
CampoTipoDescripción
numeroItemobligatorionumberPosición del ítem, desde 1.
unidadMedidaobligatoriostringCatálogo 3: NIU (unidad), ZZ (servicio), KGM...
cantidadobligatorionumberMayor que 0.
descripcionobligatoriostringDescripción del bien o servicio.
codigoProductostringCódigo interno de tu catálogo.
valorUnitarioobligatorionumberPrecio unitario sin IGV.
precioUnitarioobligatorionumberPrecio unitario con IGV.
valorVentaobligatorionumbercantidad × valorUnitario, menos descuento del ítem.
afectacionIGVobligatoriostringCatálogo 7: 10 gravado, 20 exonerado, 30 inafecto, 40 exportación, 11-16 / 21 / 31-36 gratuitos, 17 IVAP.
igvnumberIGV del ítem.
totalImpuestosItemobligatorionumberSuma de impuestos del ítem (IGV + ISC + ICBPER + otros).
iscnumberISC del ítem. Requiere sistemaISC.
sistemaISCstringCatálogo 8.
icbpernumberImpuesto a la bolsa de plástico.
otrosTributosnumberOtros tributos del ítem.
descuentoTipostringCatálogo 53. Obligatorio si envías descuentoMonto.
descuentoMontonumberDescuento del ítem. Excluyente con cargo.
cargoTipostringCatálogo 53: 47 afecta la base del IGV, 48 no.
cargoMontonumberCargo del ítem. Excluyente con descuento.
valorReferencialnumberValor referencial unitario, para operaciones gratuitas.
adicionalobjetoDatos de catálogo 55 (transporte de carga, pasajeros, hospedaje, paquete turístico).

Forma de pago (opcional)

3 campos
CampoTipoDescripción
formaPago.tipostringContado o Credito.
formaPago.montonumberMonto pendiente de pago (crédito).
formaPago.cuotas[]arregloSolo crédito. Cada cuota: numero, monto, fechaVence (YYYY-MM-DD).

Tipo de cambio

5 campos
CampoTipoDescripción
tipoCambionumber | stringTipo de cambio a PEN si la moneda no es PEN (hasta 4 enteros y 6 decimales). Si lo omites se usa el SBS aplicable.
fechaCambiostringYYYY-MM-DD. Fecha a la que corresponde el tipo de cambio enviado (informativa).
motivoTipoCambiostringPor qué difiere del SBS (TC pactado, banco, contrato).
confirmarTipoCambiobooleanObligatorio en true si tu valor se aparta más de 10 % del SBS.
fechaHechoGeneradorstringYYYY-MM-DD. Fecha que fija el tipo de cambio del IGV. Por defecto, fechaEmision.

Ejemplo de request

json
{
  "tipoDocumento": "07",
  "serie": "FC01",
  "correlativo": "00000001",
  "fechaEmision": "2026-10-11",
  "moneda": "PEN",
  "tipoNota": "01",
  "motivoNota": "Anulación de la operación",
  "docModificado": "F001-00000010",
  "tipoDocModificado": "01",
  "tipoDocumentoAdquirente": "6",
  "numDocumentoAdquirente": "20123456789",
  "razonSocialAdquirente": "EMPRESA SAC",
  "totalImpuestos": 18.00,
  "totalValorVenta": 100.00,
  "totalPrecioVenta": 118.00,
  "importeTotal": 118.00,
  "baseImponibleIGV": 100.00,
  "totalIGV": 18.00,
  "items": [
    {
      "numeroItem": 1, "unidadMedida": "NIU", "cantidad": 2, "descripcion": "Polo de algodón",
      "valorUnitario": 50.00, "precioUnitario": 59.00, "valorVenta": 100.00,
      "afectacionIGV": "10", "igv": 18.00, "totalImpuestosItem": 18.00
    }
  ]
}

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 310,
    "tipoDocumento": "07",
    "serie": "FC01",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "moneda": "PEN",
    "tipoNota": "01",
    "motivoNota": "Anulación de la operación",
    "docModificado": "F001-00000010",
    "tipoDocModificado": "01",
    "importeTotal": 118,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:10:00Z"
  }
}

Listar notas

GET/v1/notes

Parámetros de query

5 campos
CampoTipoDescripción
tipoDocumentostring07 u 08.
estadostringDRAFT, SENDING, SENT, ACCEPTED, REJECTED o FAILED.
docModificadostringSolo las notas que afectan a ese comprobante, por ejemplo F001-00000010.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{ "data": [ { "id": 310, "serie": "FC01", "correlativo": "00000001", "estado": "ACCEPTED", "pdfUrl": "https://…" } ], "meta": { "total": 1, "page": 1, "perPage": 20 } }

Detalle de una nota

GET/v1/notes/{id}

Incluye xmlUrl, cdrUrl y pdfUrl como enlaces firmados de 15 minutos.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 310,
    "tipoDocumento": "07",
    "serie": "FC01",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "moneda": "PEN",
    "tipoNota": "01",
    "motivoNota": "Anulación de la operación",
    "docModificado": "F001-00000010",
    "tipoDocModificado": "01",
    "importeTotal": 118,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:10:00Z"
  }
}

Retenciones y percepciones

api.flashfact.pe · API Key + firma HMAC

Comprobantes de retención (20) y percepción (40). Cada uno referencia documentos relacionados y, si están en moneda extranjera, un tipo de cambio por documento.

Emitir un comprobante de retención

POST/v1/retenciones

Comprobante

9 campos · 8 obligatorios
CampoTipoDescripción
serieobligatoriostringR + 3 alfanuméricos (R001).
correlativoobligatoriostringNumérico, de 1 a 8 dígitos.
fechaEmisionobligatoriostringYYYY-MM-DD.
codigoRegimenobligatoriostringCatálogo 23: 01 régimen general (3 %), 02 régimen especial (6 %, solo hasta 28/02/2014).
tasaRetencionobligatorionumberDebe coincidir con la tasa del régimen.
tipoDocumentoProveedorobligatoriostringSiempre 6 (RUC).
rucProveedorobligatoriostring11 dígitos.
razonSocialProveedorobligatoriostringRazón social.
direccionProveedor / observaciones / redondeovariosOpcionales.

Documentos relacionados (documentos[])

10 campos · 6 obligatorios
CampoTipoDescripción
tipoDocumentoobligatoriostring01, 12, 07, 08 o 20.
numeroDocumentoobligatoriostringserie-correlativo del documento relacionado.
fechaEmision / importeTotal / monedaobligatoriovariosDatos del documento.
numeroPago / fechaPago / importePago / monedaPagovariosDatos del pago. El par documento más numeroPago no puede repetirse.
importeRetenidoobligatorionumberMayor que 0.
fechaRetencionobligatoriostringYYYY-MM-DD.
importeNetoPagadoobligatorionumberMayor que 0.
monedaOrigenstringSi la envías debe coincidir con la moneda del documento.
tipoCambionumber | stringObligatorio para SUNAT si el documento no está en PEN (salvo nota de crédito). Si falta se usa el SBS de la fecha de pago o cobro.
fechaCambio / motivoTipoCambio / confirmarTipoCambiovariosMismas reglas que en facturas.

Ejemplo de request

json
{
  "serie": "R001",
  "correlativo": "00000001",
  "fechaEmision": "2026-10-11",
  "codigoRegimen": "01",
  "tasaRetencion": 3,
  "tipoDocumentoProveedor": "6",
  "rucProveedor": "20123456789",
  "razonSocialProveedor": "PROVEEDOR SAC",
  "documentos": [
    {
      "tipoDocumento": "01",
      "numeroDocumento": "F001-00000050",
      "fechaEmision": "2026-10-01",
      "importeTotal": 1000,
      "moneda": "PEN",
      "numeroPago": 1,
      "fechaPago": "2026-10-11",
      "importePago": 1000,
      "monedaPago": "PEN",
      "importeRetenido": 30,
      "fechaRetencion": "2026-10-11",
      "importeNetoPagado": 970
    }
  ]
}

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 55,
    "serie": "R001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "codigoRegimen": "01",
    "tasaRetencion": 3,
    "rucProveedor": "20123456789",
    "razonSocialProveedor": "PROVEEDOR SAC",
    "totalRetenido": 30,
    "totalPagado": 970,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:20:00Z"
  }
}

Notas

  • totalPagado suma los importes netos pagados en soles, como exige SUNAT.
  • A diferencia de facturas y notas, repetir serie y correlativo no devuelve el original: usa correlativos que no hayas emitido.

Listar retenciones

GET/v1/retenciones

Parámetros de query

3 campos
CampoTipoDescripción
estadostringDRAFT, SENDING, SENT, ACCEPTED, REJECTED o FAILED.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{ "data": [ { "id": 55, "serie": "R001", "correlativo": "00000001", "estado": "ACCEPTED", "pdfUrl": "https://…" } ], "meta": { "total": 1, "page": 1, "perPage": 20 } }

Detalle de una retención

GET/v1/retenciones/{id}

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 55,
    "serie": "R001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "codigoRegimen": "01",
    "tasaRetencion": 3,
    "rucProveedor": "20123456789",
    "razonSocialProveedor": "PROVEEDOR SAC",
    "totalRetenido": 30,
    "totalPagado": 970,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:20:00Z"
  }
}

Emitir un comprobante de percepción

POST/v1/percepciones

Comprobante

10 campos · 8 obligatorios
CampoTipoDescripción
serieobligatoriostringP + 3 alfanuméricos (P001).
correlativoobligatoriostringNumérico, de 1 a 8 dígitos.
fechaEmisionobligatoriostringYYYY-MM-DD.
codigoRegimenobligatoriostringCatálogo 22: 01 venta interna (2 %), 02 combustible (1 %), 03 agentes de combustible (0.5 %).
tasaPercepcionobligatorionumberDebe coincidir con la tasa del régimen.
tipoDocumentoClienteobligatoriostringCatálogo 6.
rucClienteobligatoriostringDocumento del cliente.
razonSocialClienteobligatoriostringRazón social.
indicadorExcepcionalstringSolo 01. Con él se admite un único documento relacionado.
direccionCliente / observaciones / redondeovariosOpcionales.

Documentos relacionados (documentos[])

10 campos · 6 obligatorios
CampoTipoDescripción
tipoDocumentoobligatoriostring01, 03, 12, 07, 08 o 40.
numeroDocumentoobligatoriostringserie-correlativo.
fechaEmision / importeTotal / monedaobligatoriovariosDatos del documento.
numeroCobro / fechaCobro / importeCobro / monedaCobrovariosDatos del cobro.
importePercibidoobligatorionumberMonto percibido.
fechaPercepcionobligatoriostringYYYY-MM-DD.
importeNetoCobradoobligatorionumberMonto neto cobrado.
monedaOrigenstringSi la envías debe coincidir con la moneda del documento.
tipoCambionumber | stringObligatorio para SUNAT si el documento no está en PEN (salvo nota de crédito). Si falta se usa el SBS de la fecha de pago o cobro.
fechaCambio / motivoTipoCambio / confirmarTipoCambiovariosMismas reglas que en facturas.

Ejemplo de request

json
{
  "serie": "P001",
  "correlativo": "00000001",
  "fechaEmision": "2026-10-11",
  "codigoRegimen": "01",
  "tasaPercepcion": 2,
  "tipoDocumentoCliente": "6",
  "rucCliente": "20123456789",
  "razonSocialCliente": "CLIENTE SAC",
  "documentos": [
    {
      "tipoDocumento": "01",
      "numeroDocumento": "F001-00000051",
      "fechaEmision": "2026-10-01",
      "importeTotal": 1000,
      "moneda": "PEN",
      "numeroCobro": 1,
      "fechaCobro": "2026-10-11",
      "importeCobro": 1000,
      "monedaCobro": "PEN",
      "importePercibido": 20,
      "fechaPercepcion": "2026-10-11",
      "importeNetoCobrado": 1020
    }
  ]
}

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 21,
    "serie": "P001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "codigoRegimen": "01",
    "tasaPercepcion": 2,
    "rucCliente": "20123456789",
    "razonSocialCliente": "CLIENTE SAC",
    "totalPercibido": 20,
    "totalCobrado": 1020,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:25:00Z"
  }
}

Listar percepciones

GET/v1/percepciones

Parámetros de query

3 campos
CampoTipoDescripción
estadostringDRAFT, SENDING, SENT, ACCEPTED, REJECTED o FAILED.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{ "data": [ { "id": 21, "serie": "P001", "correlativo": "00000001", "estado": "ACCEPTED", "pdfUrl": "https://…" } ], "meta": { "total": 1, "page": 1, "perPage": 20 } }

Detalle de una percepción

GET/v1/percepciones/{id}

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 21,
    "serie": "P001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "codigoRegimen": "01",
    "tasaPercepcion": 2,
    "rucCliente": "20123456789",
    "razonSocialCliente": "CLIENTE SAC",
    "totalPercibido": 20,
    "totalCobrado": 1020,
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:25:00Z"
  }
}

Guías de remisión

api.flashfact.pe · API Key + firma HMAC

Guía de remisión remitente (09) y transportista (31). SUNAT las procesa con un ticket asíncrono, así que pueden tardar en pasar de SENT a ACCEPTED.

Emitir una guía de remisión remitente

POST/v1/guias/remitente

Guía

20 campos · 12 obligatorios
CampoTipoDescripción
serieobligatoriostringT + 3 alfanuméricos en la guía remitente (T001); V + 3 en la transportista (V001).
correlativoobligatoriostringNumérico, de 1 a 8 dígitos.
fechaEmisionobligatoriostringYYYY-MM-DD.
horaEmisionobligatoriostringHH:MM:SS. A diferencia de las facturas, es obligatoria.
motivoTrasladoobligatoriostringCatálogo 20: 01 venta, 02 compra, 04 traslado entre establecimientos...
fechaInicioTrasladoobligatoriostringYYYY-MM-DD.
pesoBrutoobligatorionumberMayor que 0.
unidadPesoobligatoriostringKGM o TNE.
observacionesstringTexto libre.
indicadores[]arregloTextos que activan reglas: SUNAT_Envio_IndicadorTrasladoVehiculoM1L (traslado en vehículo M1 o L, sin transportista) y SUNAT_Envio_IndicadorVehiculoConductoresTransp (vehículo y conductores en transporte público).
ubigeoOrigen / ubigeoDestinoobligatoriostring6 dígitos, del catálogo 13 (INEI).
direccionOrigen / direccionDestinoobligatoriostringDirecciones de partida y llegada.
documentosRelacionados[]arreglo{ tipoDoc (cat. 61), numDoc, emisorRUC, emisorNombre }.
tipoDocDestinatario / numDocDestinatario / nombreDestinatarioobligatoriostringDestinatario. Catálogo 6.
tipoDocProveedor / numDocProveedor / nombreProveedorstringSolo para los motivos 02, 07 y 13.
tipoDocComprador / numDocComprador / nombreCompradorstringSolo para los motivos 03 y 13.
modalidadTransporteobligatoriostringCatálogo 18: 01 transporte público, 02 transporte privado.
tipoDocTransportista / numDocTransportista / nombreTransportistastringObligatorios en transporte público (RUC de 11 dígitos), salvo con el indicador M1L.
placastringObligatoria en transporte privado, o en público con el indicador de vehículo y conductores. De 6 a 8 caracteres alfanuméricos en mayúsculas.
tipoDocConductor / numDocConductor / nombresConductor / apellidosConductorstringConductor principal. Mismas condiciones que la placa.

Líneas (lineas[])

4 campos · 3 obligatorios
CampoTipoDescripción
cantidadobligatorionumberMayor que 0.
unidadobligatoriostringCódigo de unidad UN/ECE.
descripcionobligatoriostringDescripción de la mercancía.
codProducto / codSUNAT / partidastringCódigo interno, código SUNAT de producto y partida arancelaria.

Ejemplo de request

json
{
  "serie": "T001",
  "correlativo": "00000001",
  "fechaEmision": "2026-10-11",
  "horaEmision": "10:30:00",
  "tipoDocDestinatario": "6",
  "numDocDestinatario": "20123456789",
  "nombreDestinatario": "CLIENTE SAC",
  "motivoTraslado": "01",
  "modalidadTransporte": "02",
  "fechaInicioTraslado": "2026-10-12",
  "pesoBruto": 120.5,
  "unidadPeso": "KGM",
  "placa": "ABC123",
  "tipoDocConductor": "1",
  "numDocConductor": "12345678",
  "nombresConductor": "PEDRO",
  "apellidosConductor": "RAMOS",
  "ubigeoOrigen": "150101",
  "direccionOrigen": "Av. Lima 123",
  "ubigeoDestino": "040101",
  "direccionDestino": "Calle Mercado 456",
  "lineas": [ { "cantidad": 10, "unidad": "NIU", "descripcion": "Caja de polos" } ]
}

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 88,
    "serie": "T001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "tipoDocDestinatario": "6",
    "numDocDestinatario": "20123456789",
    "nombreDestinatario": "CLIENTE SAC",
    "motivoTraslado": "01",
    "modalidadTransporte": "01",
    "fechaInicioTraslado": "2026-10-12",
    "pesoBruto": 120.5,
    "unidadPeso": "KGM",
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:30:00Z"
  }
}

Notas

  • Si la cola está caída la guía se guarda igual y la API responde 201: no hay error que reintentar. Revisa que su estado pase de DRAFT.

Listar guías remitente

GET/v1/guias/remitente

Parámetros de query

3 campos
CampoTipoDescripción
estadostringDRAFT, SENDING, SENT, ACCEPTED, REJECTED o FAILED.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{ "data": [ { "id": 88, "serie": "T001", "correlativo": "00000001", "estado": "ACCEPTED", "pdfUrl": "https://…" } ], "meta": { "total": 1, "page": 1, "perPage": 20 } }

Detalle de una guía remitente

GET/v1/guias/remitente/{id}

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 88,
    "serie": "T001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "tipoDocDestinatario": "6",
    "numDocDestinatario": "20123456789",
    "nombreDestinatario": "CLIENTE SAC",
    "motivoTraslado": "01",
    "modalidadTransporte": "01",
    "fechaInicioTraslado": "2026-10-12",
    "pesoBruto": 120.5,
    "unidadPeso": "KGM",
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:30:00Z"
  }
}

Notas

  • El CDR de las guías llega como archivo .zip.

Emitir una guía de remisión transportista

POST/v1/guias/transportista

Guía

20 campos · 16 obligatorios
CampoTipoDescripción
serieobligatoriostringT + 3 alfanuméricos en la guía remitente (T001); V + 3 en la transportista (V001).
correlativoobligatoriostringNumérico, de 1 a 8 dígitos.
fechaEmisionobligatoriostringYYYY-MM-DD.
horaEmisionobligatoriostringHH:MM:SS. A diferencia de las facturas, es obligatoria.
motivoTrasladoobligatoriostringCatálogo 20: 01 venta, 02 compra, 04 traslado entre establecimientos...
fechaInicioTrasladoobligatoriostringYYYY-MM-DD.
pesoBrutoobligatorionumberMayor que 0.
unidadPesoobligatoriostringKGM o TNE.
observacionesstringTexto libre.
indicadores[]arregloTextos que activan reglas: SUNAT_Envio_IndicadorTrasladoVehiculoM1L (traslado en vehículo M1 o L, sin transportista) y SUNAT_Envio_IndicadorVehiculoConductoresTransp (vehículo y conductores en transporte público).
ubigeoOrigen / ubigeoDestinoobligatoriostring6 dígitos, del catálogo 13 (INEI).
direccionOrigen / direccionDestinoobligatoriostringDirecciones de partida y llegada.
registroMTCstringRegistro MTC del transportista.
tipoDocRemitente / numDocRemitente / nombreRemitenteobligatoriostringRemitente.
tipoDocDestinatario / numDocDestinatario / nombreDestinatarioobligatoriostringDestinatario.
modalidadTransporteobligatoriostringSiempre 01 (transporte público).
placaobligatoriostringDe 6 a 8 caracteres alfanuméricos en mayúsculas.
tipoDocConductorPrincipal / numDocConductorPrincipal / nombresConductorPrincipal / apellidosConductorPrincipalobligatoriostringConductor principal.
tipoDocConductorSecundario / numDocConductorSecundario / nombresConductorSecundario / apellidosConductorSecundariostringConductor secundario.
documentosRelacionados[]obligatorioarregloDebe incluir al menos una guía de remitente (09) o de transportista (31).

Líneas (lineas[])

4 campos · 3 obligatorios
CampoTipoDescripción
cantidadobligatorionumberMayor que 0.
unidadobligatoriostringCódigo de unidad UN/ECE.
descripcionobligatoriostringDescripción de la mercancía.
codProducto / codSUNAT / partidastringCódigo interno, código SUNAT de producto y partida arancelaria.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 88,
    "serie": "V001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "tipoDocDestinatario": "6",
    "numDocDestinatario": "20123456789",
    "nombreDestinatario": "CLIENTE SAC",
    "motivoTraslado": "01",
    "modalidadTransporte": "01",
    "fechaInicioTraslado": "2026-10-12",
    "pesoBruto": 120.5,
    "unidadPeso": "KGM",
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:30:00Z"
  }
}

Notas

  • Si la cola está caída la guía se guarda igual y la API responde 201: no hay error que reintentar. Revisa que su estado pase de DRAFT.

Listar guías transportista

GET/v1/guias/transportista

Parámetros de query

3 campos
CampoTipoDescripción
estadostringDRAFT, SENDING, SENT, ACCEPTED, REJECTED o FAILED.
pagenumberPágina, desde 1. Por defecto 1.
perPagenumberResultados por página. Por defecto 20.

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{ "data": [ { "id": 88, "serie": "V001", "correlativo": "00000001", "estado": "ACCEPTED", "pdfUrl": "https://…" } ], "meta": { "total": 1, "page": 1, "perPage": 20 } }

Detalle de una guía transportista

GET/v1/guias/transportista/{id}

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID numérico del documento (campo id de la respuesta).

Respuestas

Estructura completa de la respuesta: ver modelo.

json
{
  "data": {
    "id": 88,
    "serie": "V001",
    "correlativo": "00000001",
    "fechaEmision": "2026-10-11",
    "tipoDocDestinatario": "6",
    "numDocDestinatario": "20123456789",
    "nombreDestinatario": "CLIENTE SAC",
    "motivoTraslado": "01",
    "modalidadTransporte": "01",
    "fechaInicioTraslado": "2026-10-12",
    "pesoBruto": 120.5,
    "unidadPeso": "KGM",
    "estado": "DRAFT",
    "fechaCreacion": "2026-10-11T15:30:00Z"
  }
}

Clientes y sucursales

api.flashfact.pe · API Key + firma HMAC

Consulta de DNI y RUC, registro de clientes y locales anexos. Estos recursos usan nombres de campo en snake_case, a diferencia de los comprobantes.

Consultar un DNI o RUC

GET/v1/customers/lookup

Consulta RENIEC o SUNAT y guarda el cliente en tu empresa en segundo plano. Para un RUC devuelve también el estado y la condición de domicilio.

Parámetros de query

2 campos · 2 obligatorios
CampoTipoDescripción
tipoobligatoriostringCatálogo 6: 1 para DNI, 6 para RUC. Otros valores, incluido DNI o RUC en texto, responden 404.
numeroobligatoriostringNúmero de documento.

Respuestas

json
{
  "data": {
    "id_type": "6",
    "id_number": "20123456789",
    "name": "EMPRESA SAC",
    "address": "AV. LIMA 123 - LIMA",
    "estado": "ACTIVO",
    "condicion": "HABIDO"
  }
}

Notas

  • Los datos vienen de registros públicos y fuentes externas: pueden estar incompletos, desactualizados o no estar disponibles. Revísalos antes de emitir (Términos de uso, sección 4).

Registrar un cliente

POST/v1/customers

Crea un cliente. Si ya existe uno con ese tipo y número de documento responde 409; no actualiza el existente.

Cuerpo (JSON)

6 campos · 3 obligatorios
CampoTipoDescripción
id_typeobligatoriostringCatálogo 6.
id_numberobligatoriostringNúmero de documento. Único por empresa.
nameobligatoriostringNombre o razón social.
addressstringDirección.
emailstringCorreo.
phonestringTeléfono.

Ejemplo de request

json
{
  "id_type": "6",
  "id_number": "20123456789",
  "name": "EMPRESA SAC",
  "email": "facturacion@empresa.com"
}

Respuestas

json
{
  "data": {
    "id": 301,
    "company_id": 12,
    "id_type": "6",
    "id_number": "20123456789",
    "name": "EMPRESA SAC",
    "email": "facturacion@empresa.com"
  }
}

Notas

  • Este endpoint no valida el formato del documento; la validación llega al emitir el comprobante.

Listar sucursales

GET/v1/branches

Locales anexos de la empresa. Devuelve un arreglo simple, sin paginación.

Respuestas

json
{
  "data": [
    { "id": 4, "code": "0001", "name": "Tienda Miraflores", "address": "Av. Larco 100", "is_active": true }
  ]
}

Crear una sucursal

POST/v1/branches

Cuerpo (JSON)

3 campos · 2 obligatorios
CampoTipoDescripción
codeobligatoriostringCódigo de establecimiento anexo SUNAT.
namestringNombre del local.
addressobligatoriostringDirección.

Ejemplo de request

json
{ "code": "0001", "name": "Tienda Miraflores", "address": "Av. Larco 100" }

Respuestas

json
{ "data": { "id": 4, "code": "0001", "name": "Tienda Miraflores", "address": "Av. Larco 100", "is_active": true } }

Desactivar una sucursal

DELETE/v1/branches/{id}

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatorionumberID de la sucursal.

Respuestas

Sin cuerpo: la respuesta solo trae el código HTTP.

Reportes

api.flashfact.pe · API Key + firma HMAC

Datos listos para tu contabilidad.

Registro de ventas (PLE 14.1)

GET/v1/registro-ventas

Facturas, boletas y notas ACCEPTED de un rango de fechas, con el desglose de tributos y la referencia de las notas. Sin paginación.

Parámetros de query

2 campos · 2 obligatorios
CampoTipoDescripción
fechaDesdeobligatoriostringYYYY-MM-DD.
fechaHastaobligatoriostringYYYY-MM-DD.

Respuestas

json
{
  "data": [
    {
      "docType": "01", "serie": "F001", "numero": "00000010", "fechaEmision": "2026-10-01",
      "clienteTipoDoc": "6", "clienteNumDoc": "20123456789", "clienteRazon": "EMPRESA SAC",
      "baseGravada": 100, "igv": 18, "exonerado": 0, "inafecto": 0, "exportacion": 0,
      "importeTotal": 118, "moneda": "PEN",
      "tipoCambio": null
    }
  ]
}

Notas

  • En comprobantes en moneda extranjera, tipoCambio, tipoCambioOrigen y tipoCambioVerificacion indican el valor usado y su origen.

Cuenta y empresas

app-api.flashfact.pe · Bearer JWT de tu sesión

Estos endpoints los usa el panel con tu sesión (Bearer JWT, rol propietario o administrador). Te sirven para dar de alta empresas y subir su certificado sin salir de tu sistema. Los errores aquí usan los códigos INVALID_REQUEST, CONFLICT y FORBIDDEN en lugar de BAD_REQUEST.

Agregar una empresa

POST/v1/settings/companies

Registra un RUC y genera su par Access Key ID y Secret. El Secret se devuelve una sola vez en esta respuesta: guárdalo.

Cuerpo (JSON)

4 campos · 2 obligatorios
CampoTipoDescripción
rucobligatoriostringRUC de 11 dígitos. No puedes registrar el mismo RUC dos veces.
business_nameobligatoriostringRazón social.
sol_usernamestringUsuario SOL secundario, hasta 8 letras o números. Sin el RUC: lo anteponemos nosotros.
sol_passwordstringClave SOL, hasta 64 caracteres. Va junto con sol_username.

Ejemplo de request

json
{
  "ruc": "20123456789",
  "business_name": "EMPRESA SAC",
  "sol_username": "FLASHFA1",
  "sol_password": "********"
}

Respuestas

json
{
  "data": {
    "external_id": "b6f1c0de-5c1e-4c58-9a57-5b8f1d2a9e11",
    "access_key_id": "WISNA_9f2c4a7e1b3d5c6a8e0f1a2b3c4d5e6f",
    "secret": "…se muestra una sola vez…",
    "ruc": "20123456789",
    "business_name": "EMPRESA SAC"
  }
}

Listar tus empresas

GET/v1/settings/companies

Respuestas

json
{ "data": [ { "external_id": "b6f1c0de-…", "ruc": "20123456789", "business_name": "EMPRESA SAC" } ] }

Subir el certificado digital de una empresa

POST/v1/settings/companies/{external_id}/certificate

Guarda el certificado .pfx o .p12 con el que se firmarán los comprobantes de esa empresa. Sin él, en producción no se puede emitir.

multipart/form-data

2 campos · 2 obligatorios
CampoTipoDescripción
certificateobligatorioarchivo.pfx o .p12, hasta 512 KB.
passwordobligatoriostringContraseña del certificado.

Respuestas

json
{ "data": { "status": "ok" } }

Estado del certificado de una empresa

GET/v1/settings/companies/{external_id}/certificate

Respuestas

json
{ "data": { "has_certificate": true, "valid_to": "2027-03-01T00:00:00Z", "is_expired": false, "fingerprint": "AB:CD:…" } }

Listar tus API keys

GET/v1/settings/api-keys

El Secret nunca se devuelve en este listado.

Respuestas

json
{
  "data": [
    {
      "id": "7c1e…", "access_key_id": "WISNA_9f2c…", "name": "20123456789",
      "scopes": ["invoices:read", "invoices:write"], "active": true,
      "last_used_at": "2026-10-11T14:00:00Z", "total_requests": 1280, "created_at": "2026-09-01T10:00:00Z"
    }
  ]
}

Revocar una API key

DELETE/v1/settings/api-keys/{id}

Las llamadas que usen esa key dejan de funcionar de inmediato.

Parámetros de ruta

1 campo · 1 obligatorio
CampoTipoDescripción
idobligatoriostringCampo id de la key, no el access_key_id.

Respuestas

Sin cuerpo: la respuesta solo trae el código HTTP.

¿Falta algo o algo no coincide con lo que ves? Escríbenos desde la página de contacto y lo corregimos.