> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cedarai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cross-border (Mexico) waybills

> Carta Porte data requirements for bill-of-lading calls whose origin or destination is in Mexico.

Mexican law (SAT *Carta Porte*) requires customs and tariff data on top of a standard bill of lading whenever a shipment crosses the US–Mexico border. Cedar enforces these rules during 824 application advice validation against every waybill created or updated through [`/ims/waybills/bill-of-lading`](/api-reference/create-bill-of-lading) (and every equivalent inbound EDI message). Missing or malformed data surfaces as an `816*` or `825*` error code on the resulting waybill.

## When the requirements apply

The Carta Porte data block is required when **both** of the following are true:

* `shipmentQualifier` is one of `6` (split first bill), `7` (split subordinate), `B` (single BOL), `C` (consolidated), `F` (stop-off), `M` (master BOL), `S` (submaster BOL), `W` (revenue empty).
* Exactly one of `originStation` and `destinationStation` resolves to Mexico (origin **xor** destination — pure intra-Mexico moves are currently not validated by this rule). Cedar resolves the country from `countryCode` if present, otherwise from `stateOrProvince`.

Empty, intermodal, switch, blind-memo, and company-business qualifiers (`1`, `8`, `E`, `G`, `H`, `I`, `N`, `X`) are exempt regardless of route.

## Where the data goes

Carta Porte data is attached to the **equipment**, not to the top-level `lineItems[]` array:

| Array                                       | Schema                         | Purpose                                                                                                  |
| ------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------- |
| `waybill.lineItems[]`                       | `LineItem`                     | Describes the lading commodity for the rail waybill itself. Required on every waybill, MX or not.        |
| `waybill.equipmentDetails[].shipmentInfo[]` | `EquipmentShipmentInformation` | Per-equipment Carta Porte block transmitted to Mexican customs. Required only for cross-border waybills. |

The two arrays are **not** interchangeable. `waybill.lineItems[].quantity` is a nested `LineItemQuantity` object (`billedAsQuantity`, `weightQualifier`, etc.); `shipmentInfo[].lineItems[].quantity` is a flat numeric field corresponding to the X12 417 N1001 element. A cross-border waybill needs both populated.

When `waybillTemplateId` is set on a [`/ims/waybills/bill-of-lading`](/api-reference/create-bill-of-lading) request, Cedar merges template data with the request rather than replacing the waybill wholesale.

### `equipmentDetails[].shipmentInfo[]`

* Template fields (for example `referenceIdQualifier`, `referenceId`, `extendedReferenceInfo`, commodity scaffolding on line items) fill in when the request omits them.
* Request fields override template values **only when the request value is non-null**. An explicit `null` or omitted field in the request does not clear template data.
* When the request includes a non-null `shipmentInfo[].lineItems[].weight`, that value is also written to the lead equipment's `netWeightLbs` and `grossWeightLbs` (converted to pounds when `weightUnitCode` is `K`).

You can send minimal request `shipmentInfo` containing only dynamic line-item fields (`quantity`, `weight`, `weightUnitCode`) and rely on the template for Carta Porte reference data.

### `parties[]`

* **Shipper, consignee, freight bill party, and in-care-of** (one per bill): Cedar merges each matching pair. Request address data is kept unless the template party includes a non-empty address block (name, address lines, city/state/zip, etc.), in which case the template address block is used. Administrative contacts, billing info, and reference info from the request and template are all retained.
* **All other party types** (for example Rule 11): every party from the request and every party from the template is kept. Nothing is replaced or deduplicated.

## Required content of each `shipmentInfo[]` entry

For each commodity on each piece of equipment:

| Field                                                       | Required value                                                                                                                                          |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `referenceIdQualifier`                                      | `UNC` — flags the entry as a UNSPSC-classified commodity.                                                                                               |
| `referenceId`                                               | The UNSPSC code. Must exist in Cedar's Carta Porte reference data, otherwise validation returns `816801010CE`.                                          |
| `extendedReferenceInfo[]` with `referenceIdQualifier = MTC` | At least one entry. `referenceId` must be a 10-digit Mexico Tariff Rate Code with no punctuation, and must exist in the reference data.                 |
| `lineItems[]`                                               | At least one entry. Each entry must populate `quantity` (N1001), `weight` (N1008), `weightUnitCode` (N1007), and `smallestExteriorPackageType` (N1010). |

## Hazardous shipments

If the waybill has any `hazardousInfo[]` entries, every `shipmentInfo[]` block with `referenceIdQualifier = UNC` must additionally include at least one `extendedReferenceInfo[]` entry with `referenceIdQualifier = MHC` (Mexico SAT Hazardous Code). The MHC value must be prefixed with `UN` and must exist in the Carta Porte reference data.

## Required shipper contact

Cross-border waybills must include a `parties[]` entry with `partyType = SH` (shipper) that has at least one `administrativeContacts[]` entry containing all of:

* `contactFunctionCode = SP`
* a non-empty `name`
* `communicationNumbers[]` with the first entry `qualifier = TE` (telephone) and a non-empty `number`, and the second entry `qualifier = EM` (email) and a non-empty `number`

<Info>
  The same validation runs whether a waybill is created via `/ims/waybills/bill-of-lading` or arrives over EDI. The error codes returned in 824 application advice are identical, so the troubleshooting flow is the same regardless of source.
</Info>
