{"openapi":"3.1.0","info":{"title":"GLS Spain — Agencias API","version":"1.0.0","description":"API interna del widget de agencias GLS Spain. Todos los endpoints son servidos por el servidor DEP (discover.goil.dev)."},"servers":[{"url":"https://discover.goil.dev"}],"paths":{"/api/gls/agencies":{"get":{"operationId":"list_agencies","summary":"Listar agencias activas","responses":{"200":{"description":"Lista de agencias","content":{"application/json":{"schema":{"type":"object","properties":{"agencies":{"type":"array","items":{"$ref":"#/components/schemas/AgencySummary"}}}}}}}}}},"/api/gls/agencies/{agencyId}":{"get":{"operationId":"get_agency","summary":"Detalle de una agencia","parameters":[{"name":"agencyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle completo","content":{"application/json":{"schema":{"type":"object","properties":{"agency":{"$ref":"#/components/schemas/Agency"}}}}}},"404":{"description":"Agencia no encontrada"}}}},"/api/gls/agencies/{agencyId}/track":{"post":{"operationId":"track_shipment","summary":"Rastrear envío","parameters":[{"name":"agencyId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["trackingCode"],"properties":{"trackingCode":{"type":"string","description":"Código de seguimiento."}}}}}},"responses":{"200":{"description":"Estado del envío"},"400":{"description":"trackingCode requerido"},"404":{"description":"Agencia no encontrada"}}}},"/api/gls/agencies/{agencyId}/quote":{"get":{"operationId":"get_quote","summary":"Calcular presupuesto del envio","parameters":[{"name":"agencyId","in":"path","required":true,"schema":{"type":"string"}},{"name":"packages","in":"query","required":true,"schema":{"type":"integer","minimum":1}},{"name":"weightKg","in":"query","required":true,"schema":{"type":"number","minimum":0.1}},{"name":"service","in":"query","required":false,"schema":{"type":"string","enum":["standard","express","international"],"default":"standard"}}],"responses":{"200":{"description":"Presupuesto con subtotal, IVA y total en EUR"},"400":{"description":"Params obligatorios faltantes"},"404":{"description":"Agencia no encontrada"},"422":{"description":"Servicio no disponible en esta agencia"}}}},"/api/gls/agencies/{agencyId}/pickup":{"post":{"operationId":"request_pickup","summary":"Solicitar recogida","parameters":[{"name":"agencyId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["date","address","contact"],"properties":{"date":{"type":"string","format":"date"},"timeSlot":{"type":"string"},"address":{"type":"string"},"contact":{"type":"object","required":["name","phone"],"properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"}}},"packages":{"type":"integer","minimum":1},"notes":{"type":"string"},"parcelShopId":{"type":"string","description":"ID del parcelshop de entrega. Si se indica, deliveryType = parcelshop."}}}}}},"responses":{"201":{"description":"Solicitud confirmada con número de referencia"},"400":{"description":"Campos obligatorios faltantes"},"404":{"description":"Agencia no encontrada"},"422":{"description":"La agencia no ofrece servicio de recogida"}}}},"/api/gls/agencies/{agencyId}/schedule":{"get":{"operationId":"get_schedule","summary":"Horario semanal de la agencia","parameters":[{"name":"agencyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Horario semanal y estado del día actual"},"404":{"description":"Agencia no encontrada"}}}},"/api/gls/parcelshops":{"get":{"operationId":"list_parcelshops","summary":"Listar parcelshops activos","parameters":[{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Filtrar por ciudad."},{"name":"service","in":"query","required":false,"schema":{"type":"string","enum":["drop_off","pickup","locker"]},"description":"Filtrar por servicio."}],"responses":{"200":{"description":"Lista de parcelshops con nombre, dirección, ciudad y horario"}}}},"/api/gls/parcelshops/{parcelShopId}":{"get":{"operationId":"get_parcelshop","summary":"Detalle de un parcelshop","parameters":[{"name":"parcelShopId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle completo del parcelshop"},"404":{"description":"No encontrado"}}}},"/api/gls/orders/{ref}/cancel":{"post":{"operationId":"cancel_order","summary":"Cancelar un pedido","description":"Cancela un pedido en estado 'confirmed'. Devuelve 409 si el pedido está en tránsito, entregado o ya cancelado.","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"},"description":"Número de referencia del pedido."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","description":"Motivo de la cancelación. Opcional."}}}}}},"responses":{"200":{"description":"Pedido cancelado correctamente"},"404":{"description":"Pedido no encontrado"},"409":{"description":"El pedido no puede cancelarse (estado incompatible)"}}}},"/api/gls/orders/{ref}/report-damage":{"post":{"operationId":"report_damage","summary":"Reportar paquete dañado","description":"Abre una reclamación por daño. Devuelve claimNumber e instrucciones según el momento de detección.","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["noticePoint","description","contactPhone"],"properties":{"noticePoint":{"type":"string","enum":["on_delivery","at_parcelshop","after_opening","other"],"description":"Momento en que se detectó el daño."},"description":{"type":"string","description":"Descripción detallada del daño."},"contactPhone":{"type":"string","description":"Teléfono de contacto."}}}}}},"responses":{"200":{"description":"Reclamación abierta, devuelve claimNumber y resolución"},"400":{"description":"Campos obligatorios faltantes o noticePoint inválido"},"404":{"description":"Pedido no encontrado"},"409":{"description":"Ya existe una reclamación para este pedido"}}}},"/api/gls/orders/{ref}/update":{"post":{"operationId":"update_order","summary":"Modificar un pedido","description":"Actualiza los datos de recogida, destinatario o notas de un pedido en estado 'confirmed'. Devuelve 409 si el pedido no está en estado 'confirmed'.","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"},"description":"Número de referencia del pedido."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pickup":{"type":"object","description":"Datos de recogida a actualizar.","properties":{"date":{"type":"string","format":"date"},"timeSlot":{"type":"string"},"address":{"type":"string"},"contact":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"}}}}},"recipient":{"type":"object","description":"Datos del destinatario a actualizar.","properties":{"name":{"type":"string"},"address":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"}}},"notes":{"type":"string","description":"Notas para el transportista."}}}}}},"responses":{"200":{"description":"Pedido actualizado correctamente, devuelve el pedido completo"},"400":{"description":"Body vacío o sin campos válidos"},"404":{"description":"Pedido no encontrado"},"409":{"description":"El pedido no puede modificarse (estado incompatible)"}}}}},"components":{"schemas":{"AgencySummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"services":{"type":"array","items":{"type":"string"}}}},"Agency":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"schedule":{"type":"object","additionalProperties":{"type":"string"}},"services":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"}}}}}}