Discussions
Inconsistencia en cotización de tarifas por carrier usando Envia API con cityCode/stateCode
15 days ago(edited)
Inconsistencia en cotización de tarifas por carrier usando Envia API con cityCode/stateCode
Descripción
Al realizar cotizaciones de envíos usando la API de Envia con múltiples carriers (TCC, Servientrega, InterRapidísimo y Coordinadora), se presentan respuestas inconsistentes dependiendo del carrier, incluso utilizando el mismo payload base y datos válidos para Colombia.
Comportamiento actual
- TCC: retorna tarifas correctamente.
- Servientrega: falla o no retorna tarifas de forma consistente.
- Coordinadora: errores intermitentes o respuestas inválidas.
- InterRapidísimo: errores genéricos o sin información útil.
- Resto de carriers: Todos retornan diferentes errores.
(CABE ACLARAR QUE EN LA INTERFAZ GRÁFICA TODOS SIRVEN)
Esto ocurre incluso usando cityCode, stateCode y postalCode consistentes.
Payload y script utilizado
import os
import requests
from app.config.load import ENVIA_API_KEY as TOKEN
API_URL = "https://api.envia.com/ship/rate/"
if not TOKEN:
raise Exception("Falta ENVIA_TOKEN")
HEADERS = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
CARRIERS = [
"serviEntrega",
"tcc",
"interRapidisimo",
"coordinadora"
]
ORIGIN = {
"city": "Bogota",
"state": "DC", #CUN tampoco sirve
"cityCode": "11001",
"stateCode": "11",
"postalCode": "110111"
}
DESTINATION = {
"city": "Pereira",
"state": "RIS",
"cityCode": "66001",
"stateCode": "66",
"postalCode": "660001"
}
def build_payload(carrier):
return {
"origin": {
"name": "Test",
"phone": "3235165881",
"street": "Calle 100 #15-00",
"city": ORIGIN["city"],
"state": ORIGIN["state"],
"cityCode": ORIGIN["cityCode"],
"stateCode": ORIGIN["stateCode"],
"country": "CO",
"postalCode": ORIGIN["postalCode"]
},
"destination": {
"name": "Test",
"phone": "3235165881",
"street": "Carrera 7 #10-00",
"city": DESTINATION["city"],
"state": DESTINATION["state"],
"cityCode": DESTINATION["cityCode"],
"stateCode": DESTINATION["stateCode"],
"country": "CO",
"postalCode": DESTINATION["postalCode"]
},
"packages": [
{
"content": "producto",
"amount": 1,
"type": "box",
"dimensions": {
"length": 10,
"width": 10,
"height": 10
},
"weight": 1,
"weightUnit": "KG",
"lengthUnit": "CM"
}
],
"shipment": {
"type": 1,
"carrier": carrier
},
"settings": {
"currency": "COP"
},
"declaredValue": 50000
}
def test_carrier(carrier):
payload = build_payload(carrier)
print(f"Probando: {carrier}")
try:
res = requests.post(API_URL, json=payload, headers=HEADERS, timeout=15)
print("Status:", res.status_code)
print("Response:", res.text)
data = res.json()
if data.get("meta") == "error":
return None
if not data.get("data"):
return None
price = data["data"][0].get("totalPrice") or data["data"][0].get("price")
if not price:
return None
return {
"carrier": carrier,
"price": float(price)
}
except Exception as e:
print("Error:", e)
return None
if __name__ == "__main__":
results = []
for carrier in CARRIERS:
result = test_carrier(carrier)
if result:
results.append(result)
if results:
cheapest = min(results, key=lambda x: x["price"])
print("\nMÁS BARATO:")
print(cheapest)
else:
print("\nNo se encontraron tarifas")
RESULTADOS:
Probando: serviEntrega
Status: 200
Response: {"meta":"error","error":{"code":1126,"description":"Invalid Option","message":"No se ha encontrado el Codigo DANE de la Ciudad Origen\nNo se ha encontrado el Codigo DANE de la Ciudad Destino"}}
Probando: tcc
Status: 200
Response: {"meta":"rate","data":[{"carrierId":170,"carrier":"tcc","carrierDescription":"TCC","serviceId":630,"service":"mensajeria","serviceDescription":"TCC Mensajeria","dropOff":0,"branchType":null,"zone":1,"deliveryEstimate":"1-2 d\u00edas","deliveryDate":{"date":"2026-04-16","dateDifference":1,"timeUnit":"day","time":"20:00"},"quantity":1,"basePrice":14190,"basePriceTaxes":0,"extendedFare":0,"insurance":550,"additionalServices":0,"additionalServicesTaxes":0,"additionalCharges":0,"additionalChargesTaxes":0,"importFee":0,"customKeyCost":0,"taxes":0,"totalPrice":14740,"currency":"COP","smsCost":0,"whatsappCost":0,"customKey":false,"cashOnDeliveryCommission":0,"cashOnDeliveryAmount":0,"calculatedDeclaredValue":0,"isMps":false,"shipmentTaxes":[],"branches":[],"costSummary":[{"quantity":1,"basePrice":14190,"basePriceTaxes":0,"extendedFare":0,"insurance":550,"additionalServices":0,"additionalServicesTaxes":0,"additionalCharges":0,"additionalChargesTaxes":0,"taxes":0,"totalPrice":14740,"costAdditionalServices":[{"id":36,"addToInvoice":1,"conceptId":7,"additionalService":"insurance","translationTag":"createLabel.createLabel.insurance","amount":1,"commission":550,"taxes":0,"cost":550,"value":0}],"costAdditionalCharges":[],"currency":"COP","customKey":false,"cashOnDeliveryCommission":0,"cashOnDeliveryAmount":0,"customKeyCommission":0,"smsCommission":0,"securityDeposit":false,"securityWeight":1,"importFee":0,"whatsappCommission":0,"folio":null,"calculatedDeclaredValue":0}],"packageDetails":{"totalWeight":1,"weightUnit":"KG","details":[{"appliedWeightType":"declared","weightUnit":"KG","weight":1,"content":"producto"}]},"landedCostId":null,"classifiedHsCodes":[],"landedCostTotal":null}]}
Probando: interRapidisimo
Status: 200
Response: {"meta":"error","error":{"code":1126,"description":"Unknown error","message":"Unknown error in InterRapidisimo"}}
Probando: coordinadora
Status: 200
Response: {"meta":"error","error":{"code":1300,"description":"Invalid Option","message":"Error: Bad Gateway"}}
MÁS BARATO:
{'carrier': 'tcc', 'price': 14740.0}
