Documentación para el equipo técnico del integrador (plataforma de e-commerce, CRM, ERP o
sistema propio del negocio) que enviará pedidos a GSG. No utiliza sesión web (JWT): la autenticación es
API key y, para plataformas multi-tienda, token de tienda (store_token).
after_cutoff, que avisa si el pedido entró después de la hora límite del día).
Ver Novedades.
GET /catalogs → order_cutoff.cutoff_time). Un pedido con date_route de hoy registrado después de esa hora se acepta igual (no hay error nuevo), pero queda marcado fuera de hora: GSG puede despacharlo el siguiente día hábil. Ver § 5.4.1.after_cutoff (true si entró fuera de hora). También aparece en el detalle y el listado del pedido.open_policy, opcional): indica si el destinatario puede abrir el paquete antes de recibirlo o pagarlo: SEALED (no se puede abrir), INSPECT (puede abrir y revisar) o TRY_ON (puede abrir y probar). Si lo omites se aplica el predeterminado de tu negocio. Ver § 5.5.pos_fee_included, opcional, solo con TARJETA): indica si el monto a cobrar ya incluye el 5% de comisión del POS. Es informativo para el motorizado: no cambia montos.url_maps, opcional): enlace http(s) de Google Maps, Apple Maps o WhatsApp con la ubicación del destinatario. GSG lo muestra al motorizado.open_policy (valor efectivo guardado). El catálogo 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.POST /api/v1/integration/orders. Es un alias idéntico de POST /api/v1/orders/integration (mismas cabeceras, body, respuestas e idempotencia); la ruta histórica se mantiene.districts[].zone en el catálogo) y la categoría, por bulto. Categorías vigentes: XL_GRANDE, XL_PLUS, XL_MAX (XL_STD ya no se ofrece). Ver § 6."size": "XL" con weight_kg, width_cm, height_cm y depth_cm por bulto y GSG elige la categoría (gana el criterio más exigente). Si envías una categoría explícita y medidas, se queda la mayor de las dos.L (GRANDE) queda como tamaño de compatibilidad (legacy_only en el catálogo): no lo ofrezcas en tu UI; usa S/M o una categoría XL./quote y service_cost lo aplican (pricing_rule = BUSINESS_AGREEMENT_V1).size, válidos en los tipos 1, 2, 3, 4 y 7. Ver § 6.agency_code (recomendado) o agency_id; agency_name se mantiene. Agencias partner (Shalom, Olva, Marvisur) no exigen district, destination_address ni telephone. Sucursal opcional con agency_branch_id; flags package_registered / package_labeled.order_external_id: cualquier 400 (incluida la pre-cotización con base de datos: cobertura, agencia, tarifa XL) sale sin consumir el id. Además, un intento fallido nunca bloquea el reintento corregido.route_type_code, size_code, service, date_route, status, service_cost, tracking_url. Ver § 11.number_packages, number_packages_in, montos y coordenadas opcionales latitude/longitude.code 90429): 300 peticiones/min por cliente de integración (tras autenticar; el valor vigente se consulta en /me → rate_limit.per_minute) y 900/min por IP (antes de autenticar). Ver Errores.store_token. Si la plataforma está configurada con aprobación manual, GSG aprueba el vínculo antes de habilitar el token.store_token de cada tienda: o el negocio lo pega en el panel de la plataforma, o la plataforma lo recupera automáticamente con POST /api/integration/bindings/lookup (ver Guía de inicio § 6).store_token de cada tienda conectada.POST /api/v1/orders/integration usando esas credenciales y el identificador del pedido en el e-commerce (order_external_id).X-GSG-Event-Id: GSG puede reenviar eventos. Ver Manual de webhooks.store_token se muestra también pero es opcional: la API key ya identifica al negocio.POST /api/v1/orders/integration solo con la API key. El webhook lo configura el propio negocio en su panel.
Sustituye {BASE_URL} por la URL base que te indique GSG (la de producción se muestra en el panel de negocios GSG).
La ruta histórica POST {BASE_URL}/api/v1/orders/integration sigue vigente y es idéntica
(mismo handler): los ejemplos de este documento valen para ambas.
application/json.POST /api/v1/orders/integration y /api/v1/integration/*, evaluado tras autenticar) y 900 peticiones/min por IP (antes de autenticar). Mensajes exactos en Errores.POST /api/integration/orders ya no existe. Apunta a
/api/v1/orders/integration: el contrato (cabeceras, body, respuestas, idempotencia) es el mismo.
| Cabecera | Obligatoria | Descripción |
|---|---|---|
Content-Type | Sí | application/json |
Authorization | Sí* | Bearer <API_KEY> |
X-API-Key | Sí* | Alternativa a Authorization: valor = API key completa. Si llegan ambas, prevalece X-API-Key. |
X-Store-Token | Plataformas: sí** | Token de tienda (st_…) generado desde el panel GSG al vincular la tienda. Opcional en integraciones directas (la API key ya identifica al negocio). |
Idempotency-Key | No | Recomendada en producción: identificador único por intento de envío (máx. 100 caracteres; si excede, se trunca a 100). Alias: X-Idempotency-Key. Evita duplicar pedidos ante reintentos de red. Si no se envía, el sistema deriva una clave interna a partir del vínculo y de order_external_id. Una clave usada por un intento que falló (de otro pedido) queda liberada: no produce 409. |
* Debe enviarse una de las dos formas de API key (no hace falta ambas).
** Si no usas X-Store-Token, puedes enviar el mismo valor en el cuerpo JSON como store_token.
La clave tiene el formato gsg_<prefijo_hexadecimal>_<secreto> y debe enviarse completa, tal como se generó.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
order_external_id | string | Sí | ID del pedido en tu plataforma. Único por tienda vinculada. Máximo 120 caracteres. Es la llave de idempotencia y de consulta posterior. La comparación no distingue mayúsculas (ORD-1, ord-1 y ORD-1 con espacio final son el mismo pedido): envíalo siempre con la misma caja y sin espacios. |
store_token | string | No* | Mismo valor que X-Store-Token si prefieres mandarlo en el body en lugar de la cabecera. |
* Plataformas: al menos uno entre X-Store-Token y store_token en body.
Todo lo demás es el mismo modelo que el registro de pedidos del panel GSG. El servidor valida
campos extra según route_type.
Campos ignorados: id_client, products, business_id,
headquarter_id, provider_user_id, id_package_size y
flk_manage_products se descartan (tampoco participan en el hash de idempotencia). Un integrador no puede adjuntar el pedido a un cliente ya existente
en GSG ni descontar stock: el destinatario se crea siempre con los datos del body.
route_type) — cuándo usar cada uno| Valor | Código | Nombre | Prefijo tracking | Uso típico |
|---|---|---|---|---|
| 1 | DELIVERY | Entrega a domicilio | GSG-E- | Envío a domicilio del cliente final. Courier (moto) o GSG XL (van) según el tamaño. |
| 2 | AGENCY | Envío por agencia | GSG-A- | Envío a provincia vía empresa de transporte. Partner (Shalom, Olva, Marvisur): GSG lleva el paquete a la sucursal. Otra agencia: GSG lo lleva a la dirección de la agencia. |
| 3 | EXCHANGE | Cambio | GSG-C- | Entrega el paquete nuevo y recoge number_packages_in bultos del destinatario (cambio de talla, etc.). |
| 4 | GSG_OFFICE | Recojo en sede GSG | GSG-L- | El destinatario retira en una sede GSG; no exige dirección ni distrito. |
| 7 | FLEX_DELIVERY | Entrega Flex | GSG-F- | Última milla estilo Mercado Libre Flex. Mismo cuerpo que el tipo 1; el servidor no añade validaciones extra. |
Otros valores devuelven 400: route_type debe ser 1 (Entrega), 2 (Agencia), 3 (Cambio), 4 (Recojo en GSG) o 7 (Entrega Flex). Puede enviarse como número (1) o string ("1").
cost + advance)| Campo | Tipo | Descripción |
|---|---|---|
cost | number o string numérico | Monto total del pedido que el destinatario debe pagar (según tu regla de negocio). No negativo. |
advance | number o string numérico | Adelanto ya cobrado (si no hay adelanto, envía 0). No negativo. |
El backend calcula el monto a cobrar en ruta como máximo(cost − advance, 0) (salvo PAGADO).
code_pay_method: "PAGADO": si el pedido ya está pagado, el sistema fuerza costo, adelanto y monto a cobrar a 0. Aun así debes enviar code_pay_method; cost/advance pueden ser 0.pay_amount_simple si trabajas en modo detallado: si llega con valor y no es PAGADO, el servidor prioriza pay_amount_simple e ignora el cálculo desde cost/advance.pay_amount_detailed: no existe en la API; algunos ejemplos antiguos lo muestran, pero el backend no lo lee.service_cost; puedes anticiparla con POST /quote.code_pay_method (obligatorio, texto): PAGADO, EFECTIVO, TARJETA, TRANSFERENCIA, YAPE, PLIN, OTRO. La lista vigente la devuelve GET /catalogs (payment_methods). El servidor normaliza a MAYÚSCULAS ("pagado" se procesa como PAGADO); aun así envía el código en mayúsculas.
size (o size_code): tamaño del bulto. Courier (moto): S, M (alias PEQUEÑO, MEDIANO; L/GRANDE solo compatibilidad). GSG XL (van): XL_GRANDE, XL_PLUS, XL_MAX, o XL + weight_kg, width_cm, height_cm, depth_cm por bulto para que GSG clasifique. Si lo omites se usa S. Detalle en § 6.
district (obligatorio en tipos 1, 3 y 7; en tipo 2 solo cuando la agencia se identifica por agency_name o no es partner): distrito de entrega, validado contra el catálogo de distritos GSG — el distrito determina la tarifa del servicio. Se normaliza a mayúsculas y la comparación no distingue tildes ("Miraflores", "MIRAFLORES" y "JESÚS MARÍA"/"JESUS MARIA" son equivalentes). Un distrito fuera de catálogo devuelve 400 con mensaje claro. En tipo 4 se ignora: el servidor lo fija según la sede. Lista vigente: GET /catalogs (districts).
client_pays_delivery: 0 = no paga delivery adicional; 1 = el cliente paga el delivery (informativo para el motorizado). Acepta número o string numérico (0, 1, "0", "1"); cualquier otro valor devuelve 400. En tipo 2 el servidor lo fuerza siempre a 0.
pay_at_destination (obligatorio en tipo 2): 0 o 1 — si el cobro del saldo es en destino (agencia). Acepta número o string numérico; cualquier otro valor devuelve 400.
package_registered, package_labeled (opcionales, tipo 2 partner): 0 o 1. Indican si el negocio ya registró el envío en la agencia y si ya rotuló el paquete. Si envías 0, GSG hace ese trabajo y lo cobra como recargo (registro S/ 2.00, rotulado S/ 0.50). Si los omites se asume trabajo hecho (no hay recargo). Solo tienen efecto con agencias partner. Se aceptan como número o string numérico; el valor entra al hash de idempotencia tal como lo envías (0 y "0" no son el mismo cuerpo), así que reintenta siempre con el mismo tipo JSON.
date_route (obligatorio): fecha y hora (con minutos) en que debe salir el pedido. Formatos aceptados (parsing estricto):
| Formato | Ejemplo |
|---|---|
DD-MM-YYYY HH:mm (24 h, recomendado) | 16-01-2026 14:30 |
DD-MM-YYYY H:mm (24 h, hora sin cero inicial) | 16-01-2026 9:05 |
DD-MM-YYYY HH:mm:ss (24 h con segundos) | 16-01-2026 14:30:00 |
DD-MM-YYYY hh:mm:ss AM/PM | 16-01-2026 02:30:00 PM |
Cualquier otro formato (p. ej. ISO 2026-01-16T14:30) u omitirlo devuelve 400 con mensaje descriptivo — el pedido no se registra con la fecha actual. La respuesta devuelve la fecha normalizada como YYYY-MM-DD HH:mm:ss.
GSG recibe pedidos para despachar el mismo día hasta una hora límite (hora de Lima, America/Lima). La hora vigente está en GET /api/v1/integration/catalogs → order_cutoff ({"cutoff_time": "15:00", "timezone": "America/Lima"}; cutoff_time es null si no hay hora límite). GSG la puede cambiar: léela del catálogo, no la fijes en tu código.
15:00: hasta las 15:00) el pedido para hoy entra normal. Desde el minuto siguiente (15:01) un pedido con date_route de hoy se registra igual, con after_cutoff: true: queda fuera de hora y GSG puede despacharlo el siguiente día hábil.date_route con el día siguiente (los domingos no hay reparto: usa el lunes).order_number: opcional; máximo 120 caracteres. Si no lo envías, GSG copia order_external_id (truncado a 120). Se muestra en el panel y en el detalle del pedido.
sede (obligatorio en tipo 4): nombre de la sede GSG: ATE, LOS OLIVOS o LA VICTORIA (no distingue mayúsculas). Un valor fuera de esa lista devuelve 400. Direcciones en GET /catalogs (sedes).
Agencia (tipo 2): identifica la agencia con una de estas opciones:
| Campo | Descripción |
|---|---|
agency_code | Recomendado. Código del catálogo (GET /catalogs → agencies[].code, p. ej. SHALOM, OLVA, MARVISUR, OTHER). La comparación con el catálogo no distingue mayúsculas, pero el valor entra al hash de idempotencia tal como lo envías: usa siempre la misma caja (recomendado: mayúsculas). Si envías OTHER debes enviar también agency_name con el nombre real de la agencia. |
agency_id | Entero ≥ 1 del catálogo (agencies[].id). Si envías agency_id y agency_code, deben corresponder a la misma agencia. |
agency_name | Nombre libre (máx. 100). Se compara sin tildes ni mayúsculas contra los aliases del catálogo: si coincide con un alias (p. ej. "Shalom", "Olva Courier") se resuelve esa agencia; si no coincide con ninguno se registra como "Otra agencia" con ese nombre. Un alias ambiguo devuelve 400. Con esta opción district es siempre obligatorio. |
agency_branch_id | Opcional. Sucursal del catálogo (agencies[].branches[].id) a la que GSG debe llevar el paquete. |
destination_address | Máx. 250. Obligatorio solo si la agencia resuelta no es partner ("Otra agencia"): dirección de la agencia en Lima a la que GSG entrega. Para partners puede omitirse (GSG la lleva a la sucursal). Para provincia, útil como referencia de destino final (p. ej. Arequipa / Arequipa / Arequipa). |
agencies[].partner es true en el catálogo
(Shalom, Olva, Marvisur). Con partner identificada por agency_code/agency_id, GSG no exige
district, destination_address ni telephone (el contacto ocurre en la agencia
destino); la dirección y el distrito se completan con la sede GSG que centraliza los envíos a agencias. Con
"otra agencia", district y destination_address son obligatorios: definen a dónde va GSG.
Tres campos opcionales. Si no los envías, el pedido se registra igual que en la versión 1.2.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
open_policyv1.3 | string | No |
¿El destinatario puede abrir el paquete antes de recibirlo o pagarlo?
SEALED = no se puede abrir (recibe el paquete cerrado).
INSPECT = puede abrir y revisar el producto, sin usarlo ni probárselo (el motorizado espera hasta N minutos; hoy 3).
TRY_ON = puede abrir y probarse el producto, pensado para ropa y calzado (hoy 5 minutos).
La espera máxima la configura GSG y se publica en el catálogo (open_policy.options[].max_wait_minutes).
Se acepta en minúsculas. Si lo omites, o envías null o "", se aplica el predeterminado que el negocio configuró en su perfil GSG
(GET /catalogs → business.default_open_policy) y, si no configuró ninguno, SEALED.
Aplica en los tipos 1, 3, 4 y 7; en tipo 2 (Agencia) GSG guarda null aunque lo envíes.
Si el destinatario rechaza el producto después de abrirlo o probarlo, el motorizado lo registra como RECHAZADO con foto del producto.
|
pos_fee_includedv1.3 | 0/1 (número o string numérico) | No |
Solo tiene efecto con code_pay_method = "TARJETA". 1 = el monto a cobrar ya incluye el 5% de comisión del POS (lo asume el destinatario);
0 = el negocio asume el 5%. Con cualquier otro método se guarda null.
No cambia montos: GSG sigue descontando el 5% del cobro con tarjeta al entregar. Solo le indica al motorizado si el monto ya incluye la comisión.
|
url_mapsv1.3 | string (máx. 2000) | No |
Enlace http(s) con la ubicación del destinatario (Google Maps, Apple Maps, ubicación de WhatsApp…). Se guarda y se muestra al motorizado;
GSG puede convertirlo en un punto del mapa. Se ignora en tipo 4 (Recojo en sede GSG).
|
latitude/longitude (ya aceptados), address puede ir como cadena vacía (""). El district sigue siendo obligatorio porque define la tarifa.GET /catalogs → open_policy. Muestra esos textos en tu sistema en lugar de copiarlos.
El campo size (alias size_code) define el vehículo y la tarifa: S y M viajan en moto y pagan la
tarifa courier del distrito; las categorías XL viajan en van (GSG XL) y pagan la tarifa de la
zona del distrito por categoría y por bulto. El tamaño no cambia el tipo de ruta: un XL puede ser entrega,
agencia, cambio, recojo en sede o flex.
| Código | Alias aceptados | Vehículo | Límites por bulto | Precio |
|---|---|---|---|---|
S | PEQUEÑO, PEQUENO, PEQUENIO, CHICO | Moto | ≤ 3 kg · hasta 30 × 20 × 12 cm (ver package_sizes) | Tarifa courier del distrito (− descuento del negocio). Default si omites size. |
M | MEDIANO | Moto | ≤ 3 kg · hasta 35 × 25 × 20 cm | Tarifa courier del distrito + recargo del tamaño (package_sizes[].extra_cost). |
L | GRANDE | Moto | Solo compatibilidad (legacy_only) | Ídem M. No lo ofrezcas en tu UI. |
XL_GRANDE | XL GRANDE | Van | ≤ 10 kg · lado mayor ≤ 60 cm · ≤ 0.216 m³ | districts[].xl.XL_GRANDE × bultos |
XL_PLUS | XL PLUS | Van | ≤ 15 kg · lado mayor ≤ 80 cm · ≤ 0.512 m³ | districts[].xl.XL_PLUS × bultos |
XL_MAX | XL MAX | Van | ≤ 25 kg · lado mayor ≤ 100 cm · ≤ 1.000 m³ | districts[].xl.XL_MAX × bultos |
XLv1.2 | — | Van | Exige weight_kg, width_cm, height_cm, depth_cm (> 0) | GSG calcula la categoría y cobra como ella. |
Los límites son los vigentes al publicar esta página; los actuales siempre están en package_sizes[] del catálogo (max_weight_kg, max_side_cm, max_volume_m3).
"size": "XL" + peso y medidas por bulto): GSG toma la primera categoría, de menor a mayor, cuyos tres límites se cumplen. 5 kg pero 85 cm de lado ⇒ XL_MAX; supera XL Max ⇒ 400 (Especial / Cargo, cotización manual con GSG). Si envías una categoría explícita y medidas, se aplica la mayor entre la pedida y la calculada.S o M puedes enviar weight_kg opcionalmente: si supera el máximo de moto ⇒ 400 El tamaño M viaja en moto y admite hasta 3 kg por bulto….number_packages.BUSINESS_AGREEMENT_V1) sí lo sustituye.districts[].xl es null o no incluye la categoría) → 400 con el motivo.size: el servicio GSG XL no está disponible por integración en este momento; use S o M. El catálogo lo anuncia en features.xl_enabled.Si falta cualquiera de estos campos (cuando aplican), la API responde 400 con un mensaje que indica exactamente qué corregir (varios errores se concatenan con ". "). Toda la validación, incluida la que necesita base de datos (cobertura, agencia, tarifa XL), ocurre antes de reservar el order_external_id.
| Campo | Nota |
|---|---|
route_type | 1, 2, 3, 4 o 7 |
full_name | Nombre completo del destinatario (máx. 150) |
telephone | Teléfono del destinatario (máx. 15). No se exige en tipo 2 (el contacto ocurre en la agencia destino). |
product | Descripción del producto (máx. 500) |
code_pay_method | Método de pago (§ 5.4) |
date_route | Fecha y hora, formato estricto (§ 5.4) |
| Campo | Tipo 1 | Tipo 2 partner (por agency_code/agency_id) | Tipo 2 otra agencia (por agency_name u OTHER) | Tipo 3 | Tipo 4 | Tipo 7 |
|---|---|---|---|---|---|---|
telephone | Sí | — | — | Sí | Sí | Sí |
district | Sí | — (lo fija GSG) | Sí | Sí | — (lo fija la sede) | Sí |
address | Operativo* | — | Operativo* | Operativo* | — (lo fija la sede) | Operativo* |
agency_code | agency_id | agency_name | — | Sí (código o id) | Sí (agency_name) | — | — | — |
destination_address | — | — | Sí | — | — | — |
pay_at_destination | — | Sí (0/1) | Sí (0/1) | — | — | — |
number_document | Opc. | Sí | Sí | Opc. | Opc. | Opc. |
package_registered, package_labeled | — | Opc. (0/1) | — | — | — | — |
agency_branch_id | — | Opc. | — | — | — | — |
number_packages_in | — | — | — | Sí (entero ≥ 1) | — | — |
sede | — | — | — | — | Sí (ATE | LOS OLIVOS | LA VICTORIA) | — |
size | Opc. (S/M/L/XL_*) | Opc. | Opc. | Opc. | Opc. | Opc. |
* El validador no lo exige, pero sin address el motorizado no puede entregar: envíalo siempre en los tipos 1, 3 y 7 (y en "otra agencia" como dirección del destinatario final si aplica). Si envías latitude/longitude, address puede ir vacío (""); aun así ayuda al motorizado (número, Mz/Lt, dpto.).
address, address_reference, number_packages, size, más cost y advance.client_pays_delivery = 0. Si envías partner por agency_name (p. ej. "Shalom"), district sigue siendo obligatorio por validador aunque GSG lo reemplace por su sede; por eso recomendamos agency_code.address ni district; el servidor los fija según la sede.Un valor más largo devuelve 400 <campo> supera el máximo de N caracteres (no se trunca). Estos límites también se publican en GET /catalogs → limits.
| Campo | Máx. | Campo | Máx. |
|---|---|---|---|
order_external_id | 120 | product | 500 |
Idempotency-Key | 100 (se trunca) | product_detail | 1000 |
full_name | 150 | observation | 250 |
telephone, other_telephone | 15 | pay_comments | 250 |
number_document | 30 | order_number | 120 |
address | 200 | destination_address | 250 |
address_reference | 350 | agency_name | 100 |
district | 50 | sede | 20 |
| Campo | Formato |
|---|---|
number_packages | Entero ≥ 1 (default 1). |
number_packages_in | Entero ≥ 1 (tipo 3). |
agency_id, agency_branch_id | Entero ≥ 1. |
cost, advance, pay_amount_simple | Número o string numérico ≥ 0. |
pay_at_destination, client_pays_delivery, package_registered, package_labeled, pos_fee_included | 0/1 (número o string numérico). |
latitude, longitude | Opcionales, numéricos. Coordenadas del destinatario; si están fuera de Perú se ignoran. |
open_policyv1.3 | SEALED, INSPECT o TRY_ON (se aceptan minúsculas). Opcional. |
url_mapsv1.3 | Enlace http:// o https:// sin espacios, máx. 2000 caracteres. Opcional. |
other_telephone, address_reference, observation, product_detail, pay_comments | Texto opcional. |
Cabeceras típicas en todos: X-API-Key (o Authorization), X-Store-Token (plataformas), Idempotency-Key. Si el token va en cabecera, omite store_token del body.
Incluye los campos opcionales de la versión 1.3 (§ 5.5): el destinatario puede abrir y revisar el producto antes de pagar
(open_policy: "INSPECT"), el saldo con tarjeta ya incluye el 5% del POS (pos_fee_included: 1) y la ubicación llega como enlace
(url_maps). Si no los necesitas, omítelos.
{
"order_external_id": "ORD-2026-778291",
"route_type": 1,
"full_name": "María López Sánchez",
"telephone": "987654322",
"other_telephone": "987654323",
"address": "Jr. Los Olivos 456",
"address_reference": "Cerca al parque central",
"district": "MIRAFLORES",
"number_document": "40123456",
"observation": "Producto frágil, manejar con cuidado",
"date_route": "16-01-2026 14:30",
"code_pay_method": "TARJETA",
"cost": "500.00",
"advance": "200.00",
"product": "Laptop HP",
"product_detail": "Modelo HP Pavilion 15, color plateado",
"number_packages": 1,
"size": "M",
"pay_comments": "Cliente pagó adelanto con tarjeta, saldo pendiente",
"client_pays_delivery": 1,
"open_policy": "INSPECT",
"pos_fee_included": 1,
"url_maps": "https://maps.app.goo.gl/Xk4bQ2mNcP8vRt7w9"
}
Solo cambia size. El precio sale de la zona del distrito (districts[].xl.XL_PLUS en el catálogo) × bultos.
Si prefieres que GSG elija la categoría, reemplaza la última línea por
"size": "XL", "weight_kg": 12, "width_cm": 58, "height_cm": 55, "depth_cm": 40 (medidas por bulto): la respuesta trae en size_code la categoría asignada.
{
"order_external_id": "ORD-2026-778295",
"route_type": 1,
"full_name": "Carla Ruiz Paredes",
"telephone": "987111222",
"address": "Av. Benavides 1890, Dpto. 402",
"address_reference": "Edificio con fachada blanca, frente a farmacia",
"district": "MIRAFLORES",
"date_route": "04-09-2026 10:30",
"code_pay_method": "PAGADO",
"cost": "0",
"advance": "0",
"product": "Silla de oficina ergonómica",
"product_detail": "Caja 58 x 55 x 40 cm, 12 kg",
"number_packages": 1,
"size": "XL_PLUS"
}
agency_code (recomendado)Sin district, destination_address ni telephone: GSG traslada el paquete a la sucursal de Shalom. agency_branch_id es opcional (ver agencies[].branches en el catálogo). Con package_registered: 0 GSG registra el envío en la agencia y lo cobra como recargo.
{
"order_external_id": "ORD-2026-778292",
"route_type": 2,
"agency_code": "SHALOM",
"agency_branch_id": 3,
"full_name": "Ana Martínez Quispe",
"number_document": "87654321",
"pay_at_destination": 1,
"package_registered": 0,
"package_labeled": 1,
"destination_address": "Arequipa / Arequipa / Arequipa",
"date_route": "18-01-2026 09:00",
"code_pay_method": "TRANSFERENCIA",
"cost": "300.00",
"advance": "100.00",
"product": "Ropa y accesorios",
"product_detail": "3 polos, 2 pantalones, 1 par de zapatos",
"number_packages": 2,
"size": "L",
"pay_comments": "Adelanto transferido, saldo se cobrará en destino",
"observation": "Verificar estado de los productos antes de enviar"
}
agency_nameEl nombre no coincide con ningún alias del catálogo, así que se registra como "Otra agencia". GSG lleva el paquete a la dirección de la agencia en Lima (destination_address + district, ambos obligatorios). El mismo resultado se obtiene con "agency_code": "OTHER" más agency_name.
{
"order_external_id": "ORD-2026-778296",
"route_type": 2,
"agency_name": "Transportes Cruz del Sur Cargo",
"destination_address": "Av. Javier Prado Este 1155 (agencia Cruz del Sur Cargo)",
"district": "LA VICTORIA",
"full_name": "Luis Fernández Rojas",
"number_document": "45678912",
"pay_at_destination": 0,
"date_route": "18-01-2026 09:00",
"code_pay_method": "PAGADO",
"cost": "0",
"advance": "0",
"product": "Repuestos automotrices",
"number_packages": 1,
"size": "M",
"observation": "Entregar en ventanilla de encomiendas a nombre del destinatario"
}
Debe incluir number_packages_in ≥ 1 (bultos que se recogen para el cambio).
{
"order_external_id": "ORD-2026-778293",
"route_type": 3,
"full_name": "Pedro Gómez",
"telephone": "987654328",
"other_telephone": "987654329",
"address": "Jr. Lima 147",
"address_reference": "Segundo piso, departamento 201",
"district": "BREÑA",
"date_route": "20-01-2026 15:30",
"code_pay_method": "YAPE",
"cost": "180.00",
"advance": "50.00",
"product": "Camisa para cambio",
"product_detail": "Camisa manga larga, color azul, talla M",
"number_packages": 1,
"number_packages_in": 2,
"size": "S",
"pay_comments": "Adelanto pagado por YAPE",
"observation": "Recoger 2 camisas y entregar 1 camisa nueva"
}
sede es el nombre de la sede: ATE, LOS OLIVOS o LA VICTORIA. Sin address/district: el servidor los completa con la dirección de la sede. Para PAGADO usa cost y advance en 0.
{
"order_external_id": "ORD-2026-778294",
"route_type": 4,
"full_name": "Roberto Silva",
"telephone": "987654331",
"other_telephone": "987654332",
"sede": "LOS OLIVOS",
"date_route": "22-01-2026 14:00",
"code_pay_method": "EFECTIVO",
"cost": "450.00",
"advance": "0.00",
"product": "Paquete con productos electrónicos",
"product_detail": "1 tablet, 2 auriculares, 1 cargador",
"number_packages": 1,
"size": "M",
"pay_comments": "Cliente pagará al recoger",
"observation": "Verificar identidad del cliente al recoger"
}
Mismo cuerpo que el tipo 1 (dirección, distrito, contacto, cost/advance). No hay campos extra por validador; mantén coherencia con tu operación de última milla.
{
"order_external_id": "ML-2000012345678",
"route_type": 7,
"full_name": "Diana Torres Vega",
"telephone": "987222333",
"address": "Calle Los Cedros 250",
"address_reference": "Casa de dos pisos, portón negro",
"district": "SAN BORJA",
"latitude": -12.0985,
"longitude": -77.0012,
"date_route": "05-09-2026 08:00",
"code_pay_method": "PAGADO",
"cost": "0",
"advance": "0",
"product": "Zapatillas running talla 40",
"number_packages": 1,
"size": "S",
"order_number": "2000012345678"
}
Alternativa al detallado: un solo campo pay_amount_simple (string o número) con el monto a cobrar, cuando code_pay_method no es PAGADO. No mezcles con cost/advance si quieres que prevalezca el detallado: vacía pay_amount_simple o no lo envíes.
| Campo | Notas |
|---|---|
order_external_id, store_token | Integración (§ 5.1). |
route_type | 1, 2, 3, 4, 7 (§ 5.2). Obligatorio. |
cost, advance | Modo detallado (§ 5.3). |
full_name, product, code_pay_method, date_route | Obligatorios en todos los tipos (§ 7). |
telephone | Obligatorio salvo en tipo 2. |
district | Obligatorio en 1, 3, 7 y en agencia no partner / por nombre; validado contra catálogo y define la tarifa (§ 5.4). |
address | Recomendado en tipos con dirección; en tipo 4 y partner lo fija GSG. |
size / size_code | S, M (L compat), XL_GRANDE, XL_PLUS, XL_MAX o XL + peso/medidas (§ 6). Default S. |
weight_kg, width_cm, height_cm, depth_cmv1.2 | Peso y medidas por bulto (números ≥ 0). Obligatorios con size: "XL"; opcionales en el resto. |
number_document | Obligatorio tipo 2; opcional en otros. |
agency_code / agency_id / agency_name, agency_branch_id, destination_address, pay_at_destination, package_registered, package_labeled | Solo tipo 2 (§ 5.4). |
number_packages_in | Solo tipo 3 (obligatorio). |
sede | Solo tipo 4 (obligatorio). |
latitude, longitude | Opcionales (§ 8). |
open_policyv1.3 | Opcional: SEALED, INSPECT, TRY_ON. Tipos 1, 3, 4 y 7; en tipo 2 se guarda null. Sin enviar: predeterminado del negocio (§ 5.5). |
pos_fee_includedv1.3 | Opcional, 0/1. Solo con TARJETA; informativo (§ 5.5). |
url_mapsv1.3 | Opcional, enlace http(s) ≤ 2000. Se ignora en tipo 4 (§ 5.5). |
order_external_idorder_external_id corresponde a un solo pedido en GSG. Si repites el mismo order_external_id con el mismo contenido (mismo hash interno), obtienes de nuevo la misma respuesta exitosa almacenada (replay, HTTP 200), incluidos los campos nuevos de la respuesta.code_pay_method/size/district/sede, trim de los obligatorios), pero es sensible al tipo JSON y a la caja de los campos no normalizados (agency_code, agency_name, package_registered, package_labeled, open_policy, pos_fee_included y url_maps entran tal como llegan): "cost": "500.00" y "cost": 500.00 producen hashes distintos → 409. Para reintentar, reenvía el mismo JSON byte a byte.order_external_id se compara sin distinguir mayúsculas: ORD-1 y ord-1 apuntan al mismo pedido (si el contenido difiere, 409). Usa siempre la misma caja.order_external_id con un pedido ya procesado pero cambias campos → 409 order_external_id ya fue usado con otro contenido; use otro id o reenvíe el mismo cuerpo.Idempotency-Key para otro order_external_id ya procesado o en proceso → 409. Si el intento anterior con esa clave falló, la clave se libera automáticamente y el nuevo pedido se registra.Este pedido se está procesando; espere y reintente con el mismo payload. Si el proceso quedó interrumpido (reinicio del servidor), el estado "en proceso" expira a los 5 minutos y el reintento lo retoma.order_external_id queda libre. Reenvía con el contenido corregido (misma o nueva Idempotency-Key) y el registro se ejecuta; nada quedó a medias (la creación es transaccional).order_external_id: corrige y reenvía con el mismo id.| Estado del intento previo | Mismo cuerpo | Cuerpo distinto |
|---|---|---|
| Procesado (200) | 200 replay de la respuesta guardada | 409 "usado con otro contenido" |
| En proceso (< 5 min) | 409 "se está procesando" | 409 "se está procesando" |
| En proceso huérfano (> 5 min) | Se retoma y reejecuta | Se retoma y reejecuta |
| Fallido (400 tardío o 5xx) | Se reejecuta | Se reejecuta con el nuevo contenido |
Recomendación: usa siempre la cabecera Idempotency-Key única por intento lógico (p. ej. UUID) y reintenta con la misma clave si hay timeout de red.
{
"message": { "description": "Ok", "title": "OK OK", "code": "90200" },
"data": {
"order_external_id": "ORD-2026-778295",
"message": "Pedido guardado exitosamente",
"id_route": 231472,
"id_route_type": 1,
"code_tracking": "GSG-E-231472",
"route_type_code": "DELIVERY",
"size_code": "XL_PLUS",
"service": "XL",
"date_route": "2026-09-04 10:30:00",
"after_cutoff": false,
"status": { "id": 3, "code": "REGISTRADO", "name": "REGISTRADO", "final": false },
"service_cost": {
"currency": "PEN",
"total": 28,
"base_cost": 28,
"package_extra_cost": 0,
"agency_handling_cost": 0,
"agency_registration_cost": 0,
"agency_labeling_cost": 0,
"pricing_rule": "XL_ZONE_TARIFF_V1"
},
"tracking_url": null,
"open_policy": "SEALED"
}
}
| Campo | Descripción |
|---|---|
order_external_id | El id que enviaste. |
id_route | Identificador interno del envío en GSG. |
id_route_type | Tipo de ruta numérico (1, 2, 3, 4, 7). |
code_tracking | Código de seguimiento GSG (GSG-E-231472). Muéstralo al comprador y úsalo en soporte. |
route_type_codev1.1 | DELIVERY, AGENCY, EXCHANGE, GSG_OFFICE, FLEX_DELIVERY. |
size_codev1.1 | Tamaño canónico registrado (S, M, L, XL_GRANDE, XL_PLUS, XL_MAX). Con size: "XL" es la categoría que GSG asignó. |
servicev1.1 | COURIER o XL. |
date_routev1.1 | Fecha programada normalizada, YYYY-MM-DD HH:mm:ss. |
after_cutoffv1.4 | true si el pedido es para hoy y se registró después de la hora límite (§ 5.4.1): quedó fuera de hora y GSG puede despacharlo el siguiente día hábil. false en el resto. |
statusv1.1 | Estado inicial: siempre REGISTRADO (id 3). Ver catálogo de estados. |
service_costv1.1 | Tarifa del servicio GSG para este envío (lo que GSG cobra al negocio), IGV incluido. total = suma de los componentes. pricing_rule: regla aplicada (DISTRICT_BASE_V1, XL_ZONE_TARIFF_V1, AGENCY_FIXED_V1, AGENCY_FIXED_XL_V1, AGENCY_MINIMUM_V1, AGENCY_DISTRICT_SURCHARGE_V1, AGENCY_LEGACY_DISTRICT_V1, GSG_OFFICE_V1, GSG_OFFICE_XL_V1, BUSINESS_AGREEMENT_V1). No incluye lo que el destinatario paga por el producto. |
tracking_urlv1.1 | URL pública de rastreo si GSG tiene habilitada la página de rastreo; null en caso contrario. No construyas la URL por tu cuenta: usa este campo. |
open_policyv1.3 | Apertura del paquete guardada: la que enviaste o, si no la enviaste, el predeterminado del negocio (SEALED si no configuró ninguno). null en tipo 2 (Agencia). En el ejemplo el pedido no envió open_policy. |
Si el pedido ya fue procesado correctamente con el mismo order_external_id y el mismo cuerpo, la respuesta es igual a la almacenada la primera vez (misma estructura que arriba, incluidos los campos nuevos si el pedido se registró con esta versión).
En situaciones excepcionales podría devolverse un objeto mínimo { "replay": true, "route_id": 231472 }; no es el flujo normal tras un registro completo.
Todas las respuestas de error siguen el patrón (sin data):
{
"message": {
"description": "Texto explicativo",
"title": "Error | Unauthorized Error | Too Many Requests | Error Server",
"code": "90400 | 90401 | 90409 | 90429 | 90500"
}
}
La tabla consolidada de todos los endpoints está en Referencia de errores. Resumen para el registro:
| Situación | message.description |
|---|---|
| Falta API key | API key requerida (Authorization Bearer o X-API-Key) |
| Formato de clave incorrecto | Formato de API key inválido |
| Clave incorrecta | API key no válida |
| Secreto revocado (rotación) | API key revocada o inactiva |
| Integración directa aún no aprobada | Integración pendiente de aprobación por GSG |
| Integración directa rechazada | Integración rechazada por GSG |
| Cliente de integración desactivado | Cliente de integración inactivo |
| Plataforma sin token de tienda | store_token requerido (X-Store-Token o body.store_token) |
| Token no pertenece a esa API key | store_token no vinculado a esta API key |
| API key con fecha de expiración vencida | API key expirada; genere una nueva |
| Vínculo pendiente / rechazado / bloqueado / desactivado | Vínculo de tienda inactivo o bloqueado (pendiente de aprobación por GSG) · Vínculo de tienda inactivo o bloqueado (rechazado por GSG) · Vínculo de tienda inactivo o bloqueado (bloqueado por GSG) · Vínculo de tienda inactivo o bloqueado (desactivado por el negocio) (prefijo histórico común; el paréntesis indica el estado) |
| Integración directa sin negocio activo | La integración directa no tiene un negocio activo; contacte a GSG |
Un fallo interno al validar credenciales (p. ej. base de datos caída) responde 500 Error validando credenciales de integración, no 401. Un 401 siempre significa que las credenciales enviadas son inválidas.
| Situación | Descripción típica |
|---|---|
| JSON malformado o cuerpo demasiado grande | El cuerpo JSON no es válido |
order_external_id ausente o > 120 | order_external_id es obligatorio (máximo 120 caracteres) |
| Falta un campo obligatorio común | full_name es obligatorio (nombre completo del destinatario), product es obligatorio (descripción del producto a enviar), code_pay_method es obligatorio (método de pago, ej. EFECTIVO, PAGADO, YAPE)… concatenados con . |
date_route ausente o inválido | date_route "..." no tiene un formato válido; use DD-MM-YYYY HH:mm en 24 horas (ej. 16-01-2026 14:30) o DD-MM-YYYY hh:mm:ss AM/PM (ej. 16-01-2026 02:30:00 PM) |
size fuera de catálogo | size "XXL" no es válido; valores permitidos: S (PEQUEÑO), M (MEDIANO), L (GRANDE), XL (con weight_kg, width_cm, height_cm y depth_cm por bulto: GSG clasifica), XL_GRANDE, XL_PLUS, XL_MAX (si lo omite se usa S/PEQUEÑO) |
"XL" sin peso o medidas | size XL requiere weight_kg, width_cm, height_cm y depth_cm por bulto (mayores a 0) para calcular la categoría; o envíe directamente XL_GRANDE, XL_PLUS o XL_MAX |
| Bulto mayor que XL Max | El bulto (58×55×40 cm, 30 kg) supera XL Max: es Especial / Cargo y se cotiza con operaciones. |
| XL deshabilitado | size: el servicio GSG XL no está disponible por integración en este momento; use S, M o L |
district ausente | district es obligatorio (distrito de entrega; define la tarifa del servicio) |
district fuera de catálogo | district "..." no existe en el catálogo de distritos GSG; verifique el nombre (ej. MIRAFLORES) o consulte GET /api/v1/integration/catalogs |
| Distrito sin cobertura XL | El distrito "..." no tiene cobertura GSG XL; requiere cotización manual. |
| Flags con valor no 0/1 | pay_at_destination debe ser 0 o 1 (se acepta número o string numérico); se recibió "..." |
| Campos del tipo de ruta | agency_id, agency_code o agency_name es requerido para ruta tipo Agencia · pay_at_destination es requerido para ruta tipo Agencia · number_document es requerido para ruta tipo Agencia · destination_address es requerido para ruta tipo Agencia · number_packages_in es requerido y debe ser mayor a 0 para ruta tipo Cambio · sede es requerido para ruta tipo Recojo en GSG |
| Agencia inexistente / no disponible | La agencia indicada por agency_id o agency_code no existe o está inactiva · La agencia indicada no está disponible para nuevos envíos · El alias de agencia "..." es ambiguo · agency_name es requerido cuando se selecciona Otra agencia · agency_id y agency_code no corresponden a la misma agencia |
| Partner sin tarifa XL para la categoría | La agencia ... no tiene tarifa XL configurada para ... (coordina con GSG) |
| Sede GSG inválida (tipo 4) | La sede GSG "..." no es válida. Sedes permitidas: ATE, LOS OLIVOS, LA VICTORIA. |
| Largo excedido | <campo> supera el máximo de N caracteres |
| Enteros / montos / coordenadas inválidos | number_packages debe ser un entero mayor o igual a 1; se recibió "..." · cost debe ser un monto numérico no negativo; se recibió "..." · latitude debe ser numérico; se recibió "..." |
open_policy fuera de catálogov1.3 | open_policy "ABIERTO" no es válido; valores permitidos: SEALED, INSPECT, TRY_ON |
pos_fee_included distinto de 0/1v1.3 | pos_fee_included debe ser 0 o 1 (se acepta número o string numérico); se recibió "..." |
url_maps inválidov1.3 | url_maps debe ser un enlace http(s) de hasta 2000 caracteres (ej. https://maps.app.goo.gl/...) |
| Situación | Descripción típica |
|---|---|
Mismo order_external_id, pedido ya procesado, distinto cuerpo | order_external_id ya fue usado con otro contenido; use otro id o reenvíe el mismo cuerpo |
| Petición en curso | Este pedido se está procesando; espere y reintente con el mismo payload |
Idempotency-Key reutilizada en otro pedido (procesado o en proceso) | Idempotency-Key ya usada para otro order_external_id; use una clave nueva por pedido (si el intento anterior falló, la clave se libera y no hay 409) |
| Duplicado genérico | Petición duplicada (idempotencia); consulte el resultado previo o Conflicto de registro duplicado |
Dos límites: por cliente de integración (Demasiadas peticiones: máximo 300 por minuto por cliente de integración. Espere y reintente con backoff., evaluado tras autenticar con tu API key) y por IP (Demasiadas peticiones desde esta IP; espere y reintente con backoff, 900/min, evaluado antes de autenticar). Revisa las cabeceras RateLimit / RateLimit-Policy. Detalle en Guía de inicio § 7.
Los 500 llevan siempre un texto fijo; el detalle interno del servidor nunca se expone al integrador.
| Situación | Descripción típica |
|---|---|
| Fallo al registrar (BD, etc.) | Error al registrar el pedido; reintente en unos segundos |
| Error validando el distrito o pre-cotizando | Error validando el distrito del pedido · Error validando el pedido; reintente en unos segundos |
| Error interno validando credenciales | Error validando credenciales de integración |
| Error en capa de idempotencia | Error de idempotencia |
Ante un 500 puedes reintentar con el mismo order_external_id y el mismo cuerpo: nada quedó registrado a medias.
order_external_id. Reenviar el mismo contenido inválido devuelve el mismo 400.curl (tipo 1, modo detallado)curl -X POST "https://{BASE_URL}/api/v1/orders/integration" \
-H "Content-Type: application/json" \
-H "X-API-Key: gsg_PREFIJO_SECRETO_COMPLETO" \
-H "X-Store-Token: st_TOKEN_DE_TIENDA" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d '{
"order_external_id": "PED-2026-0001",
"route_type": 1,
"full_name": "María Pérez",
"telephone": "987654321",
"address": "Av. Ejemplo 123",
"address_reference": "Frente al parque",
"district": "MIRAFLORES",
"date_route": "04-09-2026 10:30",
"code_pay_method": "EFECTIVO",
"cost": "150.00",
"advance": "0.00",
"product": "Pedido ecommerce",
"number_packages": 1,
"size": "S"
}'
Integración directa: omite -H "X-Store-Token: …".
store_token de forma segura (o que el negocio lo pegue en su panel privado).POST /quote si tu flujo muestra el costo de envío al negocio, y valida distritos y agencias contra GET /catalogs (cacheado 5 min).409 "en proceso", 429 o errores de red, siempre con la misma Idempotency-Key.order_external_id, id_route, code_tracking y service_cost.total devueltos para trazabilidad, conciliación y soporte.GET /catalogs → order_cutoff): después de esa hora propone al negocio la fecha del día siguiente y avísale si un pedido volvió con after_cutoff: true.Para URL base de producción, ambiente de pruebas, ampliación de tipos de ruta o dudas de negocio, coordina con GSG (integraciones directas: desde el panel; plataformas: con el administrador de integraciones que entregó la API key). Esta documentación describe el comportamiento técnico del endpoint implementado.
| Versión | Fecha | Cambios |
|---|---|---|
| 1.4 | 2026-09-29 | Hora límite de registro del día (§ 5.4.1): un pedido para hoy registrado después de la hora límite de GSG
(GET /catalogs → order_cutoff) se acepta igual pero queda fuera de hora. Respuesta 200 con el campo nuevo
after_cutoff (booleano). Sin cambios en el cuerpo, las cabeceras ni los errores. |
| 1.3 | 2026-09-25 | Campos opcionales nuevos (antes se descartaban sin error): open_policy (apertura del paquete: SEALED/INSPECT/TRY_ON;
sin enviar se aplica el predeterminado del negocio y, si no hay, SEALED; null en Agencia), pos_fee_included
(0/1, solo con TARJETA; informativo, no cambia montos) y url_maps (enlace http(s) ≤ 2000; se ignora en tipo 4).
Con latitude/longitude, address puede ir vacío. Respuesta 200 con open_policy efectivo. 400 nuevos para
valores inválidos de los tres campos. |
| 1.2 | 2026-09-15 | Alias POST /api/v1/integration/orders (la ruta histórica se mantiene). GSG XL sobre el modelo de zonas:
categorías XL_GRANDE/XL_PLUS/XL_MAX con tarifa por zona del distrito y por bulto
(XL_ZONE_TARIFF_V1; XL_STD deja de ofrecerse); size: "XL" + weight_kg/width_cm/height_cm/depth_cm
con clasificación automática; weight_kg opcional en S/M con 400 si supera el máximo de moto; L marcado legacy_only;
reglas nuevas en pricing_rule (GSG_OFFICE_XL_V1, BUSINESS_AGREEMENT_V1). |
| 1.1 | 2026-09-03 | Revisión del mismo día: alias PEQUENIO para S; agency_code/agency_name/package_registered/package_labeled ya no se normalizan antes del hash (entran tal como llegan); regla "misma caja" para order_external_id (comparación sin distinguir mayúsculas); una Idempotency-Key de un intento fallido se libera; 401 de vínculo con prefijo Vínculo de tienda inactivo o bloqueado (…) y 401 API key expirada; genere una nueva; 400 El cuerpo JSON no es válido; 429 en dos niveles (300/min por cliente + 900/min por IP); 500 con texto fijo Error al registrar el pedido; reintente en unos segundos. |
| 1.1 | 2026-09-03 | Cambios aditivos: tamaños GSG XL (XL_STD, XL_PLUS, XL_GRANDE, XL_MAX);
agencia por agency_code/agency_id, sucursal agency_branch_id, flags
package_registered/package_labeled; en agencia partner ya no se exigen district,
destination_address ni telephone; validación completa (incluida pre-cotización) antes de
reservar el order_external_id y regla "un intento fallido nunca bloquea"; límites de longitud con
400 claro; validación de enteros, montos y coordenadas; campos nuevos en la respuesta
(route_type_code, size_code, service, date_route, status,
service_cost, tracking_url); rate limit 300/min (429); mensajes 401 para
integraciones directas y estados de vínculo; escenario de integración directa (store_token opcional).
Ruta POST /api/integration/orders retirada (ya anunciado). |
| 1.0 | 2026-07-14 | Versión inicial publicada como documento interno API de registro de pedidos — Integración GSG (B2B):
autenticación API key + store_token, tipos 1/2/3/4/7, modo de cobro detallado, matriz de
obligatorios, idempotencia, respuestas y errores, lookup de tiendas. |