Descripción
Las Guías de Remisión Electrónicas (GRE tipo 09) son documentos obligatorios para el traslado de bienes. La empresa remitente (quien envía la mercadería) emite este tipo de guía cuando:- Realiza traslado de mercadería propia
- Vende productos y coordina el envío
- Transfiere stock entre almacenes
- Realiza devoluciones o consignaciones
Flujo de Trabajo (Asíncrono GRE API)
- Crear guía:
POST /api/guias-remision- Genera el registro y XML firmado - Enviar a SUNAT GRE:
POST /api/guias-remision/{id}/enviar- Envío asíncrono vía REST, devuelve ticket - Consultar ticket:
POST /api/guias-remision/{id}/ticket- Verifica estado y descarga CDR - Obtener CDR:
GET /api/guias-remision/{id}/cdr- Descarga la constancia cuando esté disponible
Diferencia con Facturas/Boletas
| Aspecto | Facturas/Boletas | Guías de Remisión |
|---|---|---|
| Protocolo | SOAP | REST (GRE API) |
| Flujo | Sincrónico | Asíncrono (ticket) |
| Autenticación | Credenciales SOL | OAuth 2.0 + SOL |
| Respuesta inmediata | CDR | Ticket |
| Consulta posterior | No necesaria | Obligatoria |
POST /api/guias-remision
Crea una nueva guía de remisión.Request Body
Destinatario
Tipo de documento del destinatario:
1 (DNI), 4 (Carnet Extranjería), 6 (RUC)Número de documento del destinatario (máx 15 caracteres)
Razón social o nombre completo del destinatario (máx 255 caracteres)
Dirección del destinatario (máx 500 caracteres)
Código ubigeo INEI (6 dígitos). Ejemplo:
150101 = Lima-Lima-LimaTraslado
Código de motivo de traslado (2 dígitos). Ver tabla de motivos abajo
Descripción adicional del motivo (máx 255 caracteres)
Fecha en que se realizará el traslado (formato: YYYY-MM-DD)
Peso total de la mercadería (mínimo 0.001)
Unidad de medida del peso:
KGM (kilogramos), TNE (toneladas)Ubigeo del punto de partida (usa dirección de empresa si se omite)
Dirección de partida (usa dirección de empresa si se omite)
Transporte
Modalidad de transporte:
01 (transporte público), 02 (transporte privado)Si mod_transporte = ‘01’ (Transporte Público)
Tipo de documento del transportista:
6 (RUC)RUC de la empresa de transporte (11 dígitos)
Razón social de la empresa de transporte (máx 255 caracteres)
Número de inscripción MTC (máx 20 caracteres)
Si mod_transporte = ‘02’ (Transporte Privado)
Indica si el vehículo es categoría M1 o L (exime requisitos de conductor y placa)
vehiculo_m1l = false (vehículo no M1/L), todos estos campos son obligatorios:
Tipo de documento del conductor:
1 (DNI), 4 (Carnet Extranjería)Número de documento del conductor (máx 15 caracteres)
Nombres del conductor (máx 255 caracteres)
Apellidos del conductor (máx 255 caracteres)
Número de licencia de conducir (máx 20 caracteres)
Placa del vehículo (máx 10 caracteres)
vehiculo_m1l = true, todos estos campos son opcionales.
Mercadería
Lista de ítems a trasladar (mínimo 1)
Descripción del ítem
Cantidad del ítem (mínimo 0.001)
Unidad de medida:
NIU (unidades), KGM (kilogramos), etc.Código interno del producto (máx 30 caracteres)
ID del producto en el sistema (opcional)
Otros
ID de la venta relacionada (opcional)
Observaciones adicionales
Motivos de Traslado (Catálogo SUNAT 20)
| Código | Descripción |
|---|---|
| 01 | Venta |
| 02 | Compra |
| 03 | Traslado entre establecimientos de la misma empresa |
| 04 | Traslado emisor itinerante CP |
| 05 | Traslado a zona primaria |
| 06 | Importación |
| 07 | Exportación |
| 08 | Venta con entrega a terceros |
| 09 | Traslado de bienes para transformación |
| 13 | Otros |
| 14 | Venta sujeta a confirmación del comprador |
| 18 | Traslado por emisor itinerante de bienes |
| 19 | Traslado por devolución |
Lógica del Servidor
- Valida todos los campos según la modalidad de transporte y categoría de vehículo
- Asigna serie fija T001 y genera número correlativo
- Sincroniza con
documentos_empresaspara numeración base configurable - Usa dirección de empresa como punto de partida si no se especifica
- Usa ubigeo de Lima (150101) como fallback para llegada
- Crea registros en
guia_remisionyguia_remision_detalle - Genera XML UBL 2.1 versión 2022 para GRE
- Firma digitalmente el XML con certificado PEM
- Calcula hash CPE
- Almacena XML en
storage/app/sunat/xml/{ruc}/
Response
Indica si la operación fue exitosa
Objeto de la guía de remisión creada
Información sobre el XML generado
Ejemplo de Request (Transporte Privado)
Ejemplo de Request (Transporte Público)
Ejemplo de Response (201 Created)
POST /api/guias-remision//enviar
Envía la guía de remisión a SUNAT GRE. Devuelve un ticket para consulta posterior.Path Parameters
ID de la guía de remisión a enviar
Flujo SUNAT GRE (Asíncrono)
-
Autenticación OAuth 2.0:
- Endpoint:
https://api-seguridad.sunat.gob.pe/v1/clientessol/{client_id}/oauth2/token/ - Credenciales:
gre_client_id+gre_client_secret(configuradas por empresa) - Scope:
https://api-cpe.sunat.gob.pe - Grant type:
password(usa RUC + SOL) - Respuesta: Access token JWT
- Endpoint:
-
Preparación del archivo:
- Lee el XML firmado
- Crea un archivo ZIP con el XML
- Calcula hash SHA-256 del ZIP
- Codifica el ZIP en base64
-
Envío a GRE API:
- Endpoint:
https://api-cpe.sunat.gob.pe/v1/contribuyente/gem/comprobantes/{nombre} - Método: POST
- Authorization:
Bearer {access_token} - Body JSON:
- Respuesta:
{ "numTicket": "16827364" }
- Endpoint:
-
Actualización local:
- Cambia estado a
enviado - Almacena el
ticket_sunat
- Cambia estado a
SunatService::enviarGuiaRemision() (línea 766).
Response (Éxito)
true si se obtuvo el ticket correctamente
Número de ticket para consulta posterior
Mensaje informativo
Response (Error)
false si hubo error
Descripción del error
Ejemplo de Response (Éxito)
Ejemplo de Response (Error)
POST /api/guias-remision//ticket
Consulta el estado de procesamiento en SUNAT usando el ticket obtenido al enviar.Path Parameters
ID de la guía de remisión
Flujo de Consulta
- Valida que la guía tenga un
ticket_sunat - Se autentica nuevamente con OAuth 2.0
- Consulta el ticket en GRE API:
- Endpoint:
https://api-cpe.sunat.gob.pe/v1/contribuyente/gem/comprobantes/envios/{ticket} - Método: GET
- Authorization:
Bearer {access_token}
- Endpoint:
- Procesa la respuesta según
codRespuesta:- “0”: Aceptado → Descarga CDR, actualiza estado a
aceptado - “98”: En proceso → Usuario debe reintentar después
- Otro código: Rechazado → Actualiza estado a
rechazado
- “0”: Aceptado → Descarga CDR, actualiza estado a
SunatService::consultarTicketGuia() (línea 844).
Response (Aceptado)
true
“0” (aceptado)
“Guía aceptada por SUNAT.”
Response (En Proceso)
true (no es error, pero no está listo)
“98”
“En proceso. Intente nuevamente en unos segundos.”
true (indica que debe seguir consultando)
Response (Rechazado)
false
Código de error de SUNAT
Descripción del error
Ejemplo de Uso (Polling)
GET /api/guias-remision
Obtiene lista paginada de guías de remisión.Query Parameters
Número de página
Response
Objeto de paginación Laravel con 15 items por página.GET /api/guias-remision/
Obtiene detalle completo de una guía específica.GET /api/guias-remision//cdr
Descarga el archivo CDR (Constancia de Recepción) en formato ZIP.GET /api/guias-remision/xml/
Descarga el archivo XML de la guía.GET /api/guias-remision/proximo-numero
Obtiene el próximo número correlativo para serie T001.Response
GET /api/guias-remision/motivos
Obtiene la lista de motivos de traslado disponibles.Response
GET /api/guias-remision/empresa-activa
Obtiene datos de la empresa actual (útil para prellenar dirección de partida).GET /api/guias-remision/ubigeos
Busca ubigeos INEI.Query Parameters
Texto de búsqueda (nombre o código)
Response
Notas Técnicas
GRE API vs SOAP
La API GRE de SUNAT (guías electrónicas 2022) usa:- REST en lugar de SOAP
- OAuth 2.0 para autenticación
- Flujo asíncrono con tickets
- Endpoints separados de facturas/boletas
Credenciales OAuth
Las empresas deben registrar su aplicación en SUNAT para obtener:gre_client_id: ID de cliente OAuthgre_client_secret: Secreto de cliente OAuth
config/sunat.php.
Indicador M1/L
Vehículos categoría M1 (automóviles) o L (motocicletas) están exentos de algunos requisitos. Sivehiculo_m1l = true, el XML incluye el indicador especial:
SunatService::generarGuiaRemisionXml() línea 594.
Dirección de Partida
Si no se proporciona, usa automáticamente la dirección de la empresa emisora:Tiempo de Procesamiento
SUNAT puede tardar entre 5 segundos y 2 minutos en procesar una guía. El frontend debe implementar polling con intervalos de 3-5 segundos.Errores Comunes
| Código | Descripción | Solución |
|---|---|---|
| 2800 | RUC no autorizado para GRE | Activar GRE en SUNAT Operaciones en Línea |
| 4000 | Error en OAuth | Verificar client_id y client_secret |
| 2324 | Datos de transporte incompletos | Verificar conductor/vehículo según modalidad |
| 98 | En proceso | Normal, seguir consultando el ticket |
| 422 | XML no generado | Llamar primero a POST /api/guias-remision |