GSG es un courier de última milla en Lima (Perú) que se integra con plataformas de e-commerce, CRMs y ERPs. Aquí vive la documentación técnica vigente para integradores. Guarda el enlace: cada documento se versiona en el mismo lugar, con su historial de cambios.
La API es la misma para todos; lo único que cambia es cómo obtienes las credenciales. Ubícate en una de estas tres situaciones:
store_token.
store_token. Integras una vez, sirve para todos.
Con tus credenciales en mano (ver cómo obtenerlas) esto es todo lo que
necesitas para registrar un envío y saber cuánto cuesta. Sustituye {BASE_URL} por la URL que te indique GSG.
Si eres plataforma, agrega -H "X-Store-Token: st_…" con el token de la tienda en cada llamada;
en integración directa puedes omitirlo.
curl "{BASE_URL}/api/v1/integration/me" -H "X-API-Key: gsg_PREFIJO_SECRETO"90200 con tu cliente de integración y la tienda resuelta. Si ves 90401, revisa la key o el store_token.
curl -X POST "{BASE_URL}/api/v1/integration/quote" \
-H "X-API-Key: gsg_PREFIJO_SECRETO" -H "Content-Type: application/json" \
-d '{ "route_type": 1, "district": "MIRAFLORES", "size": "M" }'total_service_cost con la tarifa real de tu negocio (descuentos y convenios incluidos). Úsalo para
mostrar el costo del envío antes de confirmar la venta. Los nombres de distrito salen de
GET /api/v1/integration/catalogs.
curl -X POST "{BASE_URL}/api/v1/integration/orders" \
-H "X-API-Key: gsg_PREFIJO_SECRETO" -H "Content-Type: application/json" \
-d '{
"order_external_id": "PED-1001",
"route_type": 1,
"full_name": "Ana Torres",
"telephone": "987654321",
"address": "Av. Larco 345, Dpto. 502",
"district": "MIRAFLORES",
"date_route": "16-09-2026 10:00",
"product": "Zapatillas talla 38",
"size": "M",
"code_pay_method": "PAGADO"
}'order_external_id es el id del pedido en tu sistema: repetir la llamada con el mismo id no duplica el envío.
La respuesta trae code_tracking (p. ej. GSG-E-231472), el estado inicial y service_cost.
Si el destinatario paga contra entrega, usa "code_pay_method": "EFECTIVO" y "pay_amount_simple": "150".
Todos los campos y tipos de envío (agencia, cambio, recojo en sede, Flex, XL) en API de pedidos.
curl "{BASE_URL}/api/v1/integration/orders/PED-1001" -H "X-API-Key: gsg_PREFIJO_SECRETO"base_url, api_key y (si aplica) store_token, y ejecuta las mismas cuatro llamadas.
Con la API de integración tu sistema registra pedidos en GSG sin digitarlos en el panel, cotiza antes de confirmar, consulta el estado de cada envío y recibe notificaciones cuando el estado logístico cambia.
XL con peso y medidas para que GSG clasifique).route.status_changed firmado con HMAC-SHA256, con reintentos y reenvío de eventos retenidos.Detalle de cada escenario de la sección 1. En ambos casos la API es la misma; cambia únicamente cómo se obtienen las credenciales.
store_token. Si la plataforma exige aprobación manual, GSG aprueba el vínculo antes de habilitar el token.store_token de cada tienda: el negocio lo pega en tu panel, o tu backend lo recupera con POST /api/integration/bindings/lookup a partir del external_store_id que el negocio declaró al vincularse.store_token de la tienda correspondiente en cada petición.X-API-Key (o Authorization: Bearer) + X-Store-Token por tienda.
Webhook: una URL por plataforma, configurada por GSG.
store_token también se muestra, pero no es obligatorio: la API key ya identifica al negocio.X-API-Key (o Authorization: Bearer). X-Store-Token opcional.
Webhook: lo gestiona el propio negocio desde su panel.
POST /api/v1/orders/integration
y el resto de operaciones viven bajo /api/v1/integration/*. La única diferencia es que
una integración directa puede omitir X-Store-Token.
Content-Type: application/json. La API key nunca debe viajar en un frontend público (web o app).order_external_id, máx. 120 caracteres) que usarás como llave de idempotencia y de consulta.id_route, code_tracking y el estado.event_id.GET /api/v1/integration/me, rate limit y seguridad.
POST /api/v1/orders/integration: campos, matriz por tipo de ruta
(1, 2, 3, 4, 7), tamaños courier y XL, modo de cobro, apertura del paquete, hora límite del día, idempotencia, respuesta, errores y ejemplos.
GET /api/v1/integration/catalogs sección por sección, cómo leer la tarifa courier vs XL
y el descuento del negocio, y POST /api/v1/integration/quote para cotizar antes de registrar.
order_external_id o por código de tracking, listado paginado, cancelación,
significado de los 18 estados y de los estados logísticos.
route.status_changed: verificación de firma
HMAC, payload, orden de eventos offline, reintentos y buenas prácticas.
message.code, mensaje típico, causa y qué hacer.
base_url, api_key, store_token y
todos los requests (me, catálogos, cotización, registro por tipo, consulta, listado, cancelación, lookup).
| Versión | Fecha | Cambios |
|---|---|---|
| 1.4 | 2026-09-29 |
API de integrador 1.4, cambios aditivos, sin acción obligatoria. Hora límite de registro del día:
GSG publica en GET /catalogs el bloque order_cutoff (cutoff_time HH:mm y timezone
America/Lima). Un pedido con date_route de hoy registrado después de esa hora se acepta igual (no hay error
nuevo), pero queda fuera de hora y GSG puede despacharlo el siguiente día hábil; la respuesta 200 del registro, el detalle y el
listado agregan after_cutoff (booleano). Recomendado: pasada la hora, registrar con la fecha del día siguiente.
Páginas: API de pedidos 1.4, catálogos 1.3, seguimiento 1.2, guía de inicio 1.2 (ejemplo de /me con api_version 1.4).
El webhook, los errores y la colección Postman no cambian.
|
| 1.3 | 2026-09-25 |
API de integrador 1.3, cambios aditivos. El registro de pedidos acepta tres campos opcionales
que antes se descartaban sin error: open_policy (apertura del paquete: SEALED no se puede abrir,
INSPECT puede abrir y revisar, TRY_ON puede abrir y probar; sin enviar se aplica el predeterminado del negocio y,
si no hay, SEALED; null en Agencia), pos_fee_included (0/1, solo con TARJETA: si el monto ya
incluye el 5% del POS; no cambia montos) y url_maps (enlace http(s) de la ubicación del destinatario). Con
latitude/longitude, address puede ir vacío. La respuesta 200 devuelve open_policy;
GET /catalogs publica el bloque open_policy y business.default_open_policy; el detalle del pedido agrega
open_policy, recipient.url_maps, recipient.location y payment.pos_fee_included. Tres 400
nuevos para valores inválidos. Páginas: API de pedidos 1.3, catálogos 1.2, seguimiento 1.1, errores 1.2; colección Postman 1.3.
El webhook no cambia.
|
| 1.2 | 2026-09-15 |
Portada con guía de decisión (tienda con sistema propio / SaaS-CRM / venta por WhatsApp sin sistema)
y quickstart en 4 llamadas. Nueva ruta POST /api/v1/integration/orders (alias idéntico de
POST /api/v1/orders/integration, que se mantiene). GSG XL sobre el modelo de zonas: la tarifa XL
sale de la zona del distrito (districts[].zone) y la categoría (XL_GRANDE, XL_PLUS,
XL_MAX) por bulto; XL_STD deja de ofrecerse; size: "XL" + weight_kg,
width_cm, height_cm, depth_cm deja que GSG elija la categoría; L queda marcado
legacy_only. Regla XL_ZONE_TARIFF_V1 reemplaza a XL_DISTRICT_TARIFF_V1. Convenios por
empresa (BUSINESS_AGREEMENT_V1) se reflejan en /quote y en service_cost.
|
| 1.1 | 2026-09-03 |
Portal completo. Nuevo escenario de integración directa (el negocio solicita, GSG aprueba,
el negocio genera su API key; store_token opcional). Nuevos documentos: guía de inicio,
catálogos y tarifas, seguimiento, errores y colección Postman. API de pedidos ampliada de forma aditiva:
tamaños GSG XL (XL_STD, XL_PLUS, XL_GRANDE, XL_MAX),
agencias por agency_code / agency_id con sucursales, flags package_registered /
package_labeled, validación completa antes de reservar el order_external_id, campos nuevos en la
respuesta (route_type_code, size_code, service, date_route,
status, service_cost, tracking_url). Nuevos endpoints
/api/v1/integration/me, /catalogs, /quote, /orders,
/orders/:id, /orders/tracking/:code, /orders/:id/cancel.
Manual de webhooks v1.2 con campos aditivos state_id, route_type_code,
size_code, service. Rate limit de 300 peticiones/min por cliente de integración
(más 900/min por IP).
|
| 1.1 | 2026-09-03 |
Revisión del mismo día (sin cambio de versión de páginas): 401 de vínculo no activo con el prefijo histórico
Vínculo de tienda inactivo o bloqueado (…) en cuatro variantes; 401 API key expirada; genere una nueva;
rate limit en dos niveles (300/min por cliente de integración + 900/min por IP) con cabeceras RateLimit;
400 El cuerpo JSON no es válido para JSON malformado; 500 con textos fijos; 409 de cancelación
documentados con sus textos vigentes; Idempotency-Key de intentos fallidos liberada;
order_external_id/store_token sin distinción de mayúsculas (regla "misma caja");
alias PEQUENIO; /quote no exige number_packages_in; GET /me → webhook
null para plataformas; webhooks: 3xx retenido de inmediato, eventos de vínculos no activos recuperables,
DRIVER_ASIGNADO/DRIVER_DESASIGNADO notificados, previous_status null;
integración directa: el webhook_secret se muestra al solicitar y la solicitud pendiente puede retirarse.
Colección Postman: X-Store-Token deshabilitado por defecto en /me y /catalogs.
|
| 1.0 | 2026-08-05 | Portada inicial con el manual de webhooks v1.1. |
Las credenciales (API key, store_token, webhook_secret) se generan desde el panel
de negocios GSG o se entregan por canal seguro; nunca por esta página.