Discussions

Ask a Question
Back to all

Inconsistencia en cotización de tarifas por carrier usando Envia API con cityCode/stateCode

(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}