Carta Porte 3.1

Attach a carta_porte object to a type I or T invoice to include the Complemento Carta Porte 3.1 for road transport. It is rejected on any other type.

Add carta_porte as a top-level key in the standard POST /v1/issued-invoices request body alongside items, issuer, receiver, etc. See Issue an invoice for the base fields.


Example (type T)

{
  "entity_id":      "9b1c0e2a-4d3f-4a1b-8c2d-1e2f3a4b5c6d",
  "type":           "T",
  "issuer": { "fiscal_regime": "601", "place_of_issue": "06600" },
  "receiver": {
    "rfc":           "XAXX010101000",
    "name":          "PUBLICO EN GENERAL",
    "postal_code":   "06600",
    "fiscal_regime": "616",
    "cfdi_use":      "S01"
  },
  "payment_form":   "99",
  "payment_method": "PUE",
  "currency":       "MXN",
  "items": [
    {
      "product_code": "78101800",
      "unit_code":    "E48",
      "description":  "Road freight transport services",
      "quantity":     1,
      "unit_price":   0.00,
      "tax_object":   "01"
    }
  ],
  "carta_porte": {
    "international":  false,
    "total_distance": 450,
    "locations": [
      {
        "kind":     "origin",
        "rfc":      "XOXX010101000",
        "datetime": "2026-07-01T08:00:00",
        "address": {
          "street":       "Av. Industria 100",
          "postal_code":  "64000",
          "state":        "NL",
          "municipality": "Monterrey"
        }
      },
      {
        "kind":     "destination",
        "rfc":      "EKU9003173C9",
        "datetime": "2026-07-01T16:00:00",
        "distance": 450,
        "address": {
          "postal_code": "06600",
          "state":       "CDMX"
        }
      }
    ],
    "goods": {
      "gross_weight": 5000,
      "weight_unit":  "KGM",
      "items": [
        {
          "product_code": "24112000",
          "description":  "Industrial machinery parts",
          "quantity":     10,
          "unit_code":    "H87",
          "weight_kg":    5000,
          "hazardous":    false
        }
      ]
    },
    "transport": {
      "permit_type":   "TPAF01",
      "permit_number": "1234567890",
      "vehicle": {
        "config":       "VL",
        "plate":        "ABC1234",
        "year":         2022,
        "gross_weight": 8000
      },
      "insurance": {
        "liability_insurer": "SEGUROS ATLAS SA",
        "liability_policy":  "MXP-0001234"
      }
    },
    "operator": {
      "name":    "Juan Pérez López",
      "rfc":     "PELJ850312H45",
      "license": "D12345678"
    }
  }
}

Field reference

Root carta_porte fields

Field Type Required Description
carta_porte.international boolean no true for international transport. Defaults to false.
carta_porte.total_distance number yes Total route distance in kilometres (TotalDistRec). Must be ≥ 0.
carta_porte.locations array yes Route locations (Ubicaciones). Minimum 2. Must include at least one origin and one destination.
carta_porte.goods object yes Goods being transported (Mercancias).
carta_porte.transport object yes Vehicle and transport data (Autotransporte).
carta_porte.operator object yes Driver / operator data (Operadores).

Locations (carta_porte.locations[])

Field Type Required Description
locations[].kind string yes origin (Origen) or destination (Destino).
locations[].rfc string yes RFC of the origin/destination party, 12–13 characters.
locations[].datetime string yes Scheduled departure/arrival datetime, ISO 8601 (e.g. 2026-07-01T08:00:00).
locations[].distance number no Distance from the previous location in km (DistanciaRecorrida). Must be ≥ 0. Typically omitted on origin.
locations[].address object yes Address of the location.
locations[].address.street string no Street name and number.
locations[].address.postal_code string yes Postal code (CodigoPostal).
locations[].address.state string yes SAT c_Estado code (e.g. NL, CDMX, JAL).
locations[].address.country string no SAT c_Pais code. Defaults to MEX. Required for international transport.
locations[].address.municipality string no Municipality name.
locations[].address.locality string no Locality name.
locations[].address.neighborhood string no Neighborhood / colonia.

Goods (carta_porte.goods)

Field Type Required Description
goods.gross_weight number yes Total gross weight (PesoTotalMercancias). Must be ≥ 0.
goods.weight_unit string no SAT c_ClaveUnidadPeso code (e.g. KGM). Defaults to KGM.
goods.items array yes Individual cargo items (Mercancia). Minimum 1.
goods.items[].product_code string yes SAT goods code (BienesTransp, catalog c_ClaveProdServCP).
goods.items[].description string yes Goods description.
goods.items[].quantity number yes Quantity. Must be > 0.000001.
goods.items[].unit_code string yes SAT unit code (ClaveUnidad).
goods.items[].weight_kg number yes Weight in kilograms (PesoEnKg). Must be ≥ 0.
goods.items[].hazardous boolean no true if goods are hazardous. Defaults to false.

Transport (carta_porte.transport)

Field Type Required Description
transport.permit_type string yes SCT permit type (PermSCT, catalog c_TipoPermiso). E.g. TPAF01.
transport.permit_number string yes SCT permit number (NumPermisoSCT).
transport.vehicle object yes Vehicle data (IdentificacionVehicular).
transport.vehicle.config string yes Vehicle configuration (ConfigVehicular, catalog c_ConfigAutotransporte). E.g. VL.
transport.vehicle.plate string yes Vehicle plate number (PlacaVM).
transport.vehicle.year integer yes Vehicle model year (AnioModeloVM).
transport.vehicle.gross_weight number yes Vehicle gross weight in tonnes (PesoVehiculoCarga). Must be ≥ 0.
transport.insurance object yes Civil liability insurance (Seguros).
transport.insurance.liability_insurer string yes Insurer name (AseguraRespCivil).
transport.insurance.liability_policy string yes Policy number (PolizaRespCivil).

Operator (carta_porte.operator)

Field Type Required Description
operator.name string yes Full legal name of the driver (Nombre).
operator.rfc string no Operator RFC, 12–13 characters.
operator.license string no Driver's licence number (NumLicencia).

Related pages