# Crear una factura recurrente

`POST https://api.fiscalisto.com/v1/recurring_invoices`

Una factura que el emisor timbra solo en cada fecha (cada interval meses en day_of_month, o cada interval semanas o días), a la hora que elija, con los timbres de su cuenta, y la manda al cliente si send_email. Cada una es una factura normal (invoice.stamped, con recurring_invoice) y nunca se timbra dos veces el mismo periodo. invoice es el cuerpo de POST /v1/invoices: se revisa ahora, con las mismas reglas.

## Parámetros

| Nombre | Dónde | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `Idempotency-Key` | encabezado |  | Opcional (los SDK la mandan solos). Si la respuesta se pierde, repita la solicitud con el mismo valor durante 24 horas: contesta lo mismo, con idempotent-replayed: true, y no lo hace dos veces (ni crea, ni manda correos, ni cobra). |

## Cuerpo

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `issuer` | string |  | El emisor (iss_…). Puede omitirse si la llave o la cuenta tienen uno solo. |
| `name` | string | sí | Para reconocerla: «Renta oficina 3», «Plan Pro de ACME». (hasta 80 caracteres) |
| `schedule` | objeto | sí | Cada cuánto y a qué hora se timbra. |
| `schedule.frequency` | `monthly`, `weekly`, `daily` | sí | monthly: cada interval meses en day_of_month. weekly o daily: cada interval semanas o días desde start_date. |
| `schedule.interval` | integer |  | Cada cuántos meses, semanas o días. Por omisión 1. Hasta 24 meses, 52 semanas o 365 días. (de 1 a 365) |
| `schedule.day_of_month` | integer o `"last"` |  | Con monthly: el día, del 1 al 28, o "last" (el último del mes). Por omisión el día de start_date, o el de hoy. |
| `schedule.start_date` | string |  | La primera factura, AAAA-MM-DD (hoy o después). Por omisión: con monthly, el próximo day_of_month; con weekly o daily, hoy. |
| `schedule.hour` | integer |  | La hora (0 a 23) en que se timbra, en time_zone. Por omisión 7. (de 0 a 23) |
| `schedule.time_zone` | `America/Mexico_City`, `America/Cancun`, `America/Mazatlan`, `America/Hermosillo`, `America/Tijuana`, `America/Ciudad_Juarez` |  | La zona de esa hora. Por omisión America/Mexico_City. |
| `invoice` | objeto | sí | La factura que se repite: el cuerpo de POST /v1/invoices, sin issuer, folio, date, global ni metadata. En description puede usar {mes}, {mes anterior}, {mes siguiente}, {año}, {año anterior}, {año siguiente} y {periodo}: cada factura los llena con su fecha. Como se escriben es como salen: {mes} «noviembre», {Mes} «Noviembre», {MES} «NOVIEMBRE». |
| `invoice.issuer` | string (iss_…) |  | Emisor (iss_…). Si la llave tiene un solo emisor o la cuenta tiene uno solo, puede omitirse. |
| `invoice.branch` | string (brn_…) |  | Sucursal (brn_…) desde donde se factura: su código postal va en LugarExpedicion, su dirección en el PDF y, si las tiene, sus series. Sin ella, el domicilio fiscal del emisor (la Matriz). |
| `invoice.warehouse` | string (whs_…) |  | Almacén (whs_…) de donde salen sus productos con track_stock. Por omisión, el de su sucursal (o el de la Matriz). |
| `invoice.customer` | string (cus_…) o objeto | sí | Cliente (Receptor): el id de uno de su catálogo (cus_…) o sus datos en un objeto. |
| `invoice.customer.tax_id` | string | sí | RFC (Rfc), 12 caracteres una persona moral y 13 una física. |
| `invoice.customer.legal_name` | string | sí | Nombre o razón social tal como está en la constancia de situación fiscal, sin el régimen de capital (sin «S.A. de C.V.»). (hasta 300 caracteres) |
| `invoice.customer.tax_system` | string | sí | Régimen fiscal (RegimenFiscal), clave de c_RegimenFiscal: 601, 612, 626… |
| `invoice.customer.zip` | string | sí | Código postal del domicilio fiscal del cliente (DomicilioFiscalReceptor), 5 dígitos. |
| `invoice.customer.email` | string o null |  | Correo a donde se envía (varios separados por comas). Solo se usa si se pide enviarlo. |
| `invoice.customer.foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.customer.foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.customer.foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.customer.ieps_taxpayer` | boolean |  | true si el cliente es contribuyente de IEPS: el IEPS va desglosado en vez de sumado al precio. |
| `invoice.items` | arreglo de objeto | sí | Conceptos (Conceptos), al menos uno. (hasta 200) |
| `invoice.items[].product` | string (prd_…) |  | Un producto de su catálogo (prd_…): toma su clave, unidad, precio e impuestos. |
| `invoice.items[].description` | string |  | Descripción del concepto (Descripcion), hasta 1,000 caracteres. (hasta 1000 caracteres) |
| `invoice.items[].product_key` | string |  | Clave del producto o servicio (ClaveProdServ), 8 dígitos de c_ClaveProdServ. Búsquela con GET /v1/sat_catalogs/product_keys?q=… |
| `invoice.items[].unit_key` | string |  | Clave de unidad (ClaveUnidad) de c_ClaveUnidad: E48 unidad de servicio (por omisión), H87 pieza, ACT actividad… (hasta 5 caracteres) |
| `invoice.items[].unit_name` | string o null |  | Nombre de la unidad (Unidad), hasta 20 caracteres. |
| `invoice.items[].sku` | string o null |  | Número de identificación o SKU (NoIdentificacion). |
| `invoice.items[].quantity` | number |  | Cantidad (Cantidad). Por omisión 1. (de -∞ a 1000000000) |
| `invoice.items[].unit_price` | number |  | Precio unitario antes de impuestos (ValorUnitario). (de 0 a 1000000000000) |
| `invoice.items[].discount` | number |  | Descuento (Descuento). (de 0 a 1000000000000) |
| `invoice.items[].taxability` | `01`, `02`, `03`, `04`, `05`, `06`, `07`, `08` |  | Objeto de impuesto (ObjetoImp), c_ObjetoImp: 01 no objeto, 02 sí objeto (por omisión), 03 sin desglose, 04 no causa… |
| `invoice.items[].iva` | `0`, `0.16`, `0.08`, `exento` |  | Tasa de IVA trasladado: 0.16 (por omisión), 0.08 (región fronteriza), 0 o exento. |
| `invoice.items[].ieps` | number |  | IEPS trasladado: tasa (0.265…) o cuota en pesos por unidad, según ieps_factor. (de 0 a 72.1605) |
| `invoice.items[].ieps_factor` | `Tasa`, `Cuota` |  | Tasa o Cuota (TipoFactor del IEPS). |
| `invoice.items[].ieps_units` | number |  | Unidades de IEPS a cuota (litros, cigarros…), si no son la cantidad. (de -∞ a 1000000000) |
| `invoice.items[].iva_retention` | number |  | Tasa de IVA retenido (por ejemplo 0.106667, dos terceras partes del 16%). (de 0 a 0.16) |
| `invoice.items[].isr_retention` | number |  | Tasa de ISR retenido (por ejemplo 0.10 honorarios, 0.0125 RESICO). (de 0 a 0.35) |
| `invoice.items[].predial` | arreglo de string |  | Números de cuenta predial (CuentaPredial) en arrendamiento. (hasta 10) |
| `invoice.items[].pedimentos` | arreglo de string |  | Números de pedimento (InformacionAduanera) de mercancía importada. (hasta 50) |
| `invoice.items[].third_party` | objeto |  | A cuenta de terceros (ACuentaTerceros): RFC, nombre, régimen y código postal. |
| `invoice.items[].third_party.tax_id` | string | sí | RFC de a cuenta de quién (RfcACuentaTerceros). (hasta 13 caracteres) |
| `invoice.items[].third_party.name` | string | sí | Nombre (NombreACuentaTerceros). (hasta 300 caracteres) |
| `invoice.items[].third_party.tax_system` | string | sí | Régimen fiscal (RegimenFiscalACuentaTerceros), c_RegimenFiscal. |
| `invoice.items[].third_party.zip` | string | sí | Código postal de su domicilio fiscal (DomicilioFiscalACuentaTerceros). |
| `invoice.items[].iedu` | objeto |  | Complemento de instituciones educativas privadas (IEDU): alumno, CURP, nivel y RVOE. |
| `invoice.items[].iedu.student_name` | string | sí | Nombre del alumno (nombreAlumno). (hasta 300 caracteres) |
| `invoice.items[].iedu.curp` | string | sí | CURP, 18 caracteres. (18 caracteres) |
| `invoice.items[].iedu.level` | `Preescolar`, `Primaria`, `Secundaria`, `Profesional técnico`, `Bachillerato o su equivalente` | sí | Nivel educativo (nivelEducativo). |
| `invoice.items[].iedu.rvoe` | string | sí | Reconocimiento de validez oficial de estudios (autRVOE). (hasta 30 caracteres) |
| `invoice.items[].iedu.payer_tax_id` | string o null |  | RFC de quien paga, si no es el receptor (rfcPago). |
| `invoice.items[].used_vehicle` | objeto |  | Complemento de vehículo usado. |
| `invoice.items[].used_vehicle.purchase_amount` | number | sí | Monto de adquisición (montoAdquisicion). (de -∞ a 1000000000000) |
| `invoice.items[].used_vehicle.sale_amount` | number | sí | Monto de enajenación (montoEnajenacion). (de -∞ a 1000000000000) |
| `invoice.items[].used_vehicle.vehicle_key` | string | sí | Clave vehicular (claveVehicular). (hasta 7 caracteres) |
| `invoice.items[].used_vehicle.make` | string | sí | Marca (marca). (hasta 50 caracteres) |
| `invoice.items[].used_vehicle.type` | string | sí | Tipo o versión (tipo). (hasta 50 caracteres) |
| `invoice.items[].used_vehicle.model` | string | sí | Año del modelo (modelo), 4 dígitos. |
| `invoice.items[].used_vehicle.engine_number` | string |  | Número de motor (numeroMotor). (hasta 17 caracteres) |
| `invoice.items[].used_vehicle.serial_number` | string |  | Número de serie (numeroSerie). (hasta 17 caracteres) |
| `invoice.items[].used_vehicle.niv` | string |  | Número de identificación vehicular (NIV). (hasta 17 caracteres) |
| `invoice.items[].used_vehicle.guide_value` | number | sí | Valor según la guía EBC o Libro Azul (valor). (de -∞ a 1000000000000) |
| `invoice.items[].used_vehicle.customs` | arreglo de objeto |  | Información aduanera de la importación del vehículo (InformacionAduanera). (hasta 10) |
| `invoice.items[].used_vehicle.customs[].number` | string | sí | Número del documento de importación (numero). (hasta 100 caracteres) |
| `invoice.items[].used_vehicle.customs[].date` | string | sí | Fecha del documento (fecha), AAAA-MM-DD. |
| `invoice.items[].used_vehicle.customs[].office` | string |  | Aduana (aduana). (hasta 100 caracteres) |
| `invoice.items[].addenda` | objeto |  | Addenda del receptor (Walmart, Soriana…), con sus propios campos. |
| `invoice.type` | `I`, `T` |  | I ingreso (por omisión; con global, factura global) o T traslado. Notas de crédito: POST /v1/credit_notes. Pagos: POST /v1/payments. (por omisión "I") |
| `invoice.carta_porte` | objeto |  | Complemento Carta Porte 3.1 (traslado de mercancías). |
| `invoice.carta_porte.modes` | arreglo de `01`, `02`, `03`, `04` |  | Cómo viajan las mercancías (c_CveTransporte): 01 autotransporte, 02 marítimo, 03 aéreo, 04 ferroviario; varios si es intermodal. Por omisión 01. (hasta 4) |
| `invoice.carta_porte.international` | objeto |  | Transporte internacional (TranspInternac Sí): entrada o salida, país, vía y regímenes aduaneros. |
| `invoice.carta_porte.international.direction` | `Entrada`, `Salida` | sí | EntradaSalidaMerc: Entrada o Salida. |
| `invoice.carta_porte.international.country` | string | sí | País de origen o destino (PaisOrigenDestino), c_Pais. (3 caracteres) |
| `invoice.carta_porte.international.via` | string | sí | Vía de entrada o salida (ViaEntradaSalida), c_CveTransporte (05 ducto incluido). (hasta 2 caracteres) |
| `invoice.carta_porte.international.regimes` | arreglo de string | sí | Regímenes aduaneros (RegimenAduanero), c_RegimenAduanero. (hasta 10) |
| `invoice.carta_porte.istmo` | objeto |  | Corredor Interoceánico del Istmo de Tehuantepec: polos de origen y destino (c_RegistroISTMO). |
| `invoice.carta_porte.istmo.origin` | string | sí | Polo de origen (UbicacionPoloOrigen). (hasta 2 caracteres) |
| `invoice.carta_porte.istmo.destination` | string | sí | Polo de destino (UbicacionPoloDestino). (hasta 2 caracteres) |
| `invoice.carta_porte.reverse_logistics` | boolean |  | Autotransporte: true si es logística inversa, recolección o devolución. |
| `invoice.carta_porte.origin` | objeto | sí | Ubicación de origen (Ubicacion TipoUbicacion Origen): remitente, fecha y hora de salida y domicilio. |
| `invoice.carta_porte.origin.tax_id` | string | sí | RFC del remitente (RFCRemitenteDestinatario); XEXX010101000 si es extranjero. |
| `invoice.carta_porte.origin.name` | string |  | Nombre del remitente (NombreRemitenteDestinatario). (hasta 254 caracteres) |
| `invoice.carta_porte.origin.foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.carta_porte.origin.foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.carta_porte.origin.foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.carta_porte.origin.date_time` | string | sí | Fecha y hora de salida (origen) o llegada (destino), AAAA-MM-DDTHH:MM, hora local. |
| `invoice.carta_porte.origin.distance_km` | number |  | Distancia recorrida desde la ubicación anterior, en km (DistanciaRecorrida). Autotransporte y ferroviario. (de -∞ a 99999) |
| `invoice.carta_porte.origin.station` | objeto |  | Estación, puerto o aeropuerto (TipoEstacion y NumEstacion de c_Estaciones). Solo sin autotransporte. |
| `invoice.carta_porte.origin.station.type` | string |  | Tipo de estación (TipoEstacion): 01 origen, 02 intermedia, 03 destino final. (hasta 2 caracteres) |
| `invoice.carta_porte.origin.station.number` | string |  | Clave de la estación, puerto o aeropuerto (NumEstacion), c_Estaciones. (hasta 12 caracteres) |
| `invoice.carta_porte.origin.station.name` | string |  | Nombre de la estación (NombreEstacion). (hasta 50 caracteres) |
| `invoice.carta_porte.origin.station.foreign` | boolean |  | true si la estación está en el extranjero (va sin TipoEstacion). |
| `invoice.carta_porte.origin.navigation` | `Altura`, `Cabotaje` |  | Marítimo: tipo de tráfico (NavegacionTrafico), Altura o Cabotaje. |
| `invoice.carta_porte.origin.address` | objeto | sí | Domicilio (Domicilio). En México basta el código postal: estado, municipio y localidad se toman de c_CodigoPostal. |
| `invoice.carta_porte.origin.address.street` | string |  | Calle (Calle). (hasta 100 caracteres) |
| `invoice.carta_porte.origin.address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.carta_porte.origin.address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.carta_porte.origin.address.zip` | string | sí | Código postal (CodigoPostal). En México se deducen de él estado, municipio y localidad. (hasta 12 caracteres) |
| `invoice.carta_porte.origin.address.country` | string |  | País (Pais), c_Pais. Por omisión MEX. (3 caracteres) |
| `invoice.carta_porte.origin.address.state` | string |  | Estado (Estado): en el extranjero c_Estado para USA y CAN, o texto. (hasta 30 caracteres) |
| `invoice.carta_porte.origin.address.municipality` | string |  | Municipio (Municipio), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.origin.address.locality` | string |  | Localidad (Localidad), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.origin.address.colony` | string |  | Colonia (Colonia), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.destinations` | arreglo de objeto | sí | Ubicaciones de destino (TipoUbicacion Destino), en orden: destinatario, llegada, distancia y domicilio. (hasta 20) |
| `invoice.carta_porte.destinations[].tax_id` | string | sí | RFC del destinatario (RFCRemitenteDestinatario); XEXX010101000 si es extranjero. |
| `invoice.carta_porte.destinations[].name` | string |  | Nombre del destinatario (NombreRemitenteDestinatario). (hasta 254 caracteres) |
| `invoice.carta_porte.destinations[].foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.carta_porte.destinations[].foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.carta_porte.destinations[].foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.carta_porte.destinations[].date_time` | string | sí | Fecha y hora de salida (origen) o llegada (destino), AAAA-MM-DDTHH:MM, hora local. |
| `invoice.carta_porte.destinations[].distance_km` | number |  | Distancia recorrida desde la ubicación anterior, en km (DistanciaRecorrida). Autotransporte y ferroviario. (de -∞ a 99999) |
| `invoice.carta_porte.destinations[].station` | objeto |  | Estación, puerto o aeropuerto (TipoEstacion y NumEstacion de c_Estaciones). Solo sin autotransporte. |
| `invoice.carta_porte.destinations[].station.type` | string |  | Tipo de estación (TipoEstacion): 01 origen, 02 intermedia, 03 destino final. (hasta 2 caracteres) |
| `invoice.carta_porte.destinations[].station.number` | string |  | Clave de la estación, puerto o aeropuerto (NumEstacion), c_Estaciones. (hasta 12 caracteres) |
| `invoice.carta_porte.destinations[].station.name` | string |  | Nombre de la estación (NombreEstacion). (hasta 50 caracteres) |
| `invoice.carta_porte.destinations[].station.foreign` | boolean |  | true si la estación está en el extranjero (va sin TipoEstacion). |
| `invoice.carta_porte.destinations[].navigation` | `Altura`, `Cabotaje` |  | Marítimo: tipo de tráfico (NavegacionTrafico), Altura o Cabotaje. |
| `invoice.carta_porte.destinations[].address` | objeto | sí | Domicilio (Domicilio). En México basta el código postal: estado, municipio y localidad se toman de c_CodigoPostal. |
| `invoice.carta_porte.destinations[].address.street` | string |  | Calle (Calle). (hasta 100 caracteres) |
| `invoice.carta_porte.destinations[].address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.carta_porte.destinations[].address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.carta_porte.destinations[].address.zip` | string | sí | Código postal (CodigoPostal). En México se deducen de él estado, municipio y localidad. (hasta 12 caracteres) |
| `invoice.carta_porte.destinations[].address.country` | string |  | País (Pais), c_Pais. Por omisión MEX. (3 caracteres) |
| `invoice.carta_porte.destinations[].address.state` | string |  | Estado (Estado): en el extranjero c_Estado para USA y CAN, o texto. (hasta 30 caracteres) |
| `invoice.carta_porte.destinations[].address.municipality` | string |  | Municipio (Municipio), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.destinations[].address.locality` | string |  | Localidad (Localidad), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.destinations[].address.colony` | string |  | Colonia (Colonia), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.goods` | arreglo de objeto | sí | Mercancías (Mercancia) que se transportan. (hasta 200) |
| `invoice.carta_porte.goods[].product_key` | string | sí | Clave del bien transportado (BienesTransp), c_ClaveProdServCP. |
| `invoice.carta_porte.goods[].description` | string | sí | Descripción de la mercancía (Descripcion). (hasta 1000 caracteres) |
| `invoice.carta_porte.goods[].quantity` | number | sí | Cantidad (Cantidad). (de -∞ a 1000000000) |
| `invoice.carta_porte.goods[].unit_key` | string | sí | Clave de unidad (ClaveUnidad), c_ClaveUnidad. (hasta 5 caracteres) |
| `invoice.carta_porte.goods[].weight_kg` | number | sí | Peso en kilogramos (PesoEnKg). (de 0.001 a 100000000) |
| `invoice.carta_porte.goods[].dimensions` | string |  | Dimensiones (Dimensiones), como 30/40/30cm o en plg. (hasta 20 caracteres) |
| `invoice.carta_porte.goods[].hazmat` | objeto |  | Material peligroso (MaterialPeligroso Sí): clave UN y embalaje. |
| `invoice.carta_porte.goods[].hazmat.key` | string | sí | Clave del material peligroso (CveMaterialPeligroso), c_MaterialPeligroso (número UN). (hasta 4 caracteres) |
| `invoice.carta_porte.goods[].hazmat.packaging` | string | sí | Tipo de embalaje (Embalaje), c_TipoEmbalaje. (hasta 4 caracteres) |
| `invoice.carta_porte.goods[].hazmat.packaging_description` | string |  | Descripción del embalaje (DescripEmbalaje). (hasta 100 caracteres) |
| `invoice.carta_porte.goods[].cofepris` | objeto |  | Datos COFEPRIS de la mercancía: sector y lo que pide cada uno (medicamentos, precursores, psicotrópicos, sustancias tóxicas, plaguicidas). |
| `invoice.carta_porte.goods[].cofepris.sector` | string | sí | Sector COFEPRIS (SectorCOFEPRIS): 01 medicamento, 02 precursores y químicos de uso dual, 03 psicotrópicos y estupefacientes, 04 sustancias tóxicas, 05 plaguicidas y fertilizantes. (hasta 2 caracteres) |
| `invoice.carta_porte.goods[].cofepris.active_ingredient` | string |  | Nombre del ingrediente activo (NombreIngredienteActivo). (hasta 1000 caracteres) |
| `invoice.carta_porte.goods[].cofepris.chemical_name` | string |  | Nombre químico (NomQuimico). (hasta 150 caracteres) |
| `invoice.carta_porte.goods[].cofepris.generic_name` | string |  | Denominación genérica del producto (DenominacionGenericaProd). (hasta 50 caracteres) |
| `invoice.carta_porte.goods[].cofepris.brand_name` | string |  | Denominación distintiva o marca (DenominacionDistintivaProd). (hasta 50 caracteres) |
| `invoice.carta_porte.goods[].cofepris.manufacturer` | string |  | Fabricante (Fabricante). (hasta 240 caracteres) |
| `invoice.carta_porte.goods[].cofepris.expiry` | string |  | Fecha de caducidad (FechaCaducidad), AAAA-MM-DD. (hasta 10 caracteres) |
| `invoice.carta_porte.goods[].cofepris.lot` | string |  | Lote del medicamento (LoteMedicamento). (hasta 10 caracteres) |
| `invoice.carta_porte.goods[].cofepris.form` | string |  | Forma farmacéutica (FormaFarmaceutica), c_FormaFarmaceutica. (hasta 2 caracteres) |
| `invoice.carta_porte.goods[].cofepris.conditions` | string |  | Condiciones especiales de transporte (CondicionesEspTransp), c_CondicionesEspeciales. (hasta 2 caracteres) |
| `invoice.carta_porte.goods[].cofepris.sanitary_registry` | string |  | Registro sanitario o folio de autorización (RegistroSanitarioFolioAutorizacion). (hasta 15 caracteres) |
| `invoice.carta_porte.goods[].cofepris.import_permit` | string |  | Permiso de importación (PermisoImportacion). (hasta 6 caracteres) |
| `invoice.carta_porte.goods[].cofepris.vucem_folio` | string |  | Folio de importación VUCEM (FolioImpoVUCEM). (hasta 25 caracteres) |
| `invoice.carta_porte.goods[].cofepris.cas` | string |  | Número CAS de la sustancia (NumCAS). (hasta 15 caracteres) |
| `invoice.carta_porte.goods[].cofepris.importer` | string |  | Razón social de la empresa importadora (RazonSocialEmpImp). (hasta 80 caracteres) |
| `invoice.carta_porte.goods[].cofepris.pesticide_registry` | string |  | Registro sanitario de plaguicidas COFEPRIS (NumRegSanPlagCOFEPRIS). (hasta 60 caracteres) |
| `invoice.carta_porte.goods[].cofepris.manufacturer_data` | string |  | Datos del fabricante (DatosFabricante). (hasta 600 caracteres) |
| `invoice.carta_porte.goods[].cofepris.formulator_data` | string |  | Datos del formulador (DatosFormulador). (hasta 600 caracteres) |
| `invoice.carta_porte.goods[].cofepris.maquilador_data` | string |  | Datos del maquilador (DatosMaquilador). (hasta 600 caracteres) |
| `invoice.carta_porte.goods[].cofepris.authorized_use` | string |  | Uso autorizado (UsoAutorizado). (hasta 1000 caracteres) |
| `invoice.carta_porte.goods[].value` | number |  | Valor de la mercancía (ValorMercancia); obligatorio en transporte aéreo. (de 0 a 1000000000000000) |
| `invoice.carta_porte.goods[].currency` | string |  | Moneda del valor de la mercancía (Moneda), c_Moneda. (3 caracteres) |
| `invoice.carta_porte.goods[].tariff` | string |  | Fracción arancelaria (FraccionArancelaria), 10 dígitos. Transporte internacional. (hasta 10 caracteres) |
| `invoice.carta_porte.goods[].cce_uuid` | string |  | UUID del CFDI con complemento de comercio exterior (UUIDComercioExt). (hasta 36 caracteres) |
| `invoice.carta_porte.goods[].material` | objeto |  | Tipo de materia (TipoMateria, c_TipoMateria) y su descripción si es «otra». |
| `invoice.carta_porte.goods[].material.type` | string | sí | Tipo de materia (TipoMateria), c_TipoMateria. (hasta 2 caracteres) |
| `invoice.carta_porte.goods[].material.description` | string |  | Descripción de la materia (DescripcionMateria), con el tipo 05 otra. (hasta 50 caracteres) |
| `invoice.carta_porte.goods[].customs_docs` | arreglo de objeto |  | Documentación aduanera (DocumentacionAduanera) de la mercancía en transporte internacional. (hasta 20) |
| `invoice.carta_porte.goods[].customs_docs[].type` | string | sí | Tipo de documento (TipoDocumento), c_DocumentoAduanero: 01 pedimento… (hasta 2 caracteres) |
| `invoice.carta_porte.goods[].customs_docs[].pedimento` | string |  | Número de pedimento (NumPedimento), con el formato «NN  NN  NNNN  NNNNNNN». Solo con el tipo 01. (hasta 21 caracteres) |
| `invoice.carta_porte.goods[].customs_docs[].doc_id` | string |  | Identificador del documento aduanero (IdentDocAduanero), con un tipo distinto de 01. (hasta 150 caracteres) |
| `invoice.carta_porte.goods[].customs_docs[].importer_tax_id` | string |  | RFC del importador (RFCImpo), con un pedimento. (hasta 13 caracteres) |
| `invoice.carta_porte.goods[].guides` | arreglo de objeto |  | Paquetería: guías de los paquetes o tarimas (GuiasIdentificacion). (hasta 100) |
| `invoice.carta_porte.goods[].guides[].number` | string | sí | Número de guía (NumeroGuiaIdentificacion). (hasta 30 caracteres) |
| `invoice.carta_porte.goods[].guides[].description` | string | sí | Descripción del contenido (DescripGuiaIdentificacion). (hasta 1000 caracteres) |
| `invoice.carta_porte.goods[].guides[].weight_kg` | number | sí | Peso en kilogramos (PesoEnKg). (de 0 a 100000000) |
| `invoice.carta_porte.goods[].quantities` | arreglo de objeto |  | Cuánto va a cada destino (CantidadTransporta), por destino. (hasta 40) |
| `invoice.carta_porte.goods[].quantities[].quantity` | number | sí | Cantidad que va a ese destino. (de -∞ a 1000000000) |
| `invoice.carta_porte.goods[].quantities[].destination` | integer | sí | El destino, por su posición en destinations (desde 0). (de 0 a 19) |
| `invoice.carta_porte.goods[].quantities[].mode` | `01`, `02`, `03`, `04` |  | Medio en que va esa cantidad (CvesTransporte), c_CveTransporte. |
| `invoice.carta_porte.goods[].detail` | objeto |  | Marítimo: detalle de la mercancía (DetalleMercancia): kilos netos, tara y piezas. |
| `invoice.carta_porte.goods[].detail.net_kg` | number | sí | Peso neto en kg (PesoNeto). (de 0 a 100000000) |
| `invoice.carta_porte.goods[].detail.tare_kg` | number | sí | Tara en kg (PesoTara). (de 0 a 100000000) |
| `invoice.carta_porte.goods[].detail.pieces` | integer |  | Número de piezas (NumPiezas). (de 0 a 1000000000) |
| `invoice.carta_porte.goods[].stcc` | string |  | Ferroviario: clave STCC (ClaveSTCC). (hasta 7 caracteres) |
| `invoice.carta_porte.vehicle` | objeto |  | Autotransporte (Autotransporte): vehículo, permiso SCT, seguros y remolques. |
| `invoice.carta_porte.vehicle.config` | string | sí | Configuración vehicular (ConfigVehicular), c_ConfigAutotransporte: C2, T3S2… (hasta 10 caracteres) |
| `invoice.carta_porte.vehicle.plate` | string | sí | Placa (PlacaVM), sin guiones ni espacios. (hasta 10 caracteres) |
| `invoice.carta_porte.vehicle.year` | integer | sí | Año del modelo (AnioModeloVM). (de 0 a 2100) |
| `invoice.carta_porte.vehicle.gross_weight` | number | sí | Peso bruto vehicular en toneladas (PesoBrutoVehicular). (de 0 a 999) |
| `invoice.carta_porte.vehicle.permit_type` | string | sí | Tipo de permiso SCT (PermSCT), c_TipoPermiso. (hasta 50 caracteres) |
| `invoice.carta_porte.vehicle.permit_number` | string | sí | Número de permiso SCT (NumPermisoSCT). (hasta 50 caracteres) |
| `invoice.carta_porte.vehicle.insurer` | string | sí | Aseguradora de responsabilidad civil (AseguraRespCivil). (hasta 50 caracteres) |
| `invoice.carta_porte.vehicle.policy` | string | sí | Póliza de responsabilidad civil (PolizaRespCivil). (hasta 30 caracteres) |
| `invoice.carta_porte.vehicle.env_insurer` | string |  | Aseguradora de daños al medio ambiente (AseguraMedAmbiente); obligatoria con material peligroso. (hasta 50 caracteres) |
| `invoice.carta_porte.vehicle.env_policy` | string |  | Póliza de daños al medio ambiente (PolizaMedAmbiente). (hasta 30 caracteres) |
| `invoice.carta_porte.vehicle.cargo_insurer` | string |  | Aseguradora de la carga (AseguraCarga). (hasta 50 caracteres) |
| `invoice.carta_porte.vehicle.cargo_policy` | string |  | Póliza de la carga (PolizaCarga). (hasta 30 caracteres) |
| `invoice.carta_porte.vehicle.premium` | number |  | Prima del seguro (PrimaSeguro). (de 0 a 1000000000000) |
| `invoice.carta_porte.vehicle.trailers` | arreglo de objeto |  | Remolques o semirremolques (Remolque): tipo (c_SubTipoRem) y placa. (hasta 2) |
| `invoice.carta_porte.vehicle.trailers[].type` | string | sí | Subtipo de remolque (SubTipoRem), c_SubTipoRem. (hasta 10 caracteres) |
| `invoice.carta_porte.vehicle.trailers[].plate` | string | sí | Placa del remolque (Placa). (hasta 10 caracteres) |
| `invoice.carta_porte.sea` | objeto |  | Transporte marítimo (TransporteMaritimo): embarcación, naviero y contenedores. |
| `invoice.carta_porte.sea.permit_type` | string |  | Tipo de permiso SCT (PermSCT), c_TipoPermiso. (hasta 10 caracteres) |
| `invoice.carta_porte.sea.permit_number` | string |  | Número de permiso SCT (NumPermisoSCT). (hasta 30 caracteres) |
| `invoice.carta_porte.sea.insurer` | string |  | Aseguradora de responsabilidad civil (AseguraRespCivil). (hasta 50 caracteres) |
| `invoice.carta_porte.sea.policy` | string |  | Póliza de responsabilidad civil (PolizaRespCivil). (hasta 30 caracteres) |
| `invoice.carta_porte.sea.vessel_type` | string | sí | Tipo de embarcación (TipoEmbarcacion), c_ConfigMaritima. (hasta 4 caracteres) |
| `invoice.carta_porte.sea.registration` | string | sí | Matrícula (Matricula). (hasta 30 caracteres) |
| `invoice.carta_porte.sea.imo` | string | sí | Número IMO (NumeroOMI): IMO y 7 dígitos. (hasta 10 caracteres) |
| `invoice.carta_porte.sea.year` | integer |  | Año de la embarcación (AnioEmbarcacion). (de 0 a 2100) |
| `invoice.carta_porte.sea.vessel_name` | string |  | Nombre de la embarcación (NombreEmbarc). (hasta 50 caracteres) |
| `invoice.carta_porte.sea.flag` | string | sí | Nacionalidad de la embarcación (NacionalidadEmbarc), c_Pais. (3 caracteres) |
| `invoice.carta_porte.sea.gross_tonnage` | number | sí | Unidades de arqueo bruto (UnidadesDeArqBruto). (de 0 a 1000000000) |
| `invoice.carta_porte.sea.cargo_type` | string | sí | Tipo de carga (TipoCarga), c_ClaveTipoCarga. (hasta 4 caracteres) |
| `invoice.carta_porte.sea.length` | number |  | Eslora en metros (Eslora). (de 0 a 100000) |
| `invoice.carta_porte.sea.beam` | number |  | Manga en metros (Manga). (de 0 a 100000) |
| `invoice.carta_porte.sea.draft` | number |  | Calado en metros (Calado). (de 0 a 100000) |
| `invoice.carta_porte.sea.depth` | number |  | Puntal en metros (Puntal). (de 0 a 100000) |
| `invoice.carta_porte.sea.line` | string |  | Línea naviera (LineaNaviera). (hasta 50 caracteres) |
| `invoice.carta_porte.sea.agent_name` | string | sí | Nombre del agente naviero consignatario (NombreAgenteNaviero). (hasta 100 caracteres) |
| `invoice.carta_porte.sea.agent_authorization` | string | sí | Autorización del agente naviero (NumAutorizacionNaviero), c_NumAutorizacionNaviero. (hasta 20 caracteres) |
| `invoice.carta_porte.sea.voyage` | string |  | Número de viaje (NumViaje). (hasta 30 caracteres) |
| `invoice.carta_porte.sea.bill_of_lading` | string |  | Número de conocimiento de embarque (NumConocEmbarc). (hasta 30 caracteres) |
| `invoice.carta_porte.sea.temp_permit` | string |  | Permiso temporal de navegación (PermisoTempNavegacion), para una embarcación extranjera. (hasta 19 caracteres) |
| `invoice.carta_porte.sea.containers` | arreglo de objeto |  | Contenedores (Contenedor). (hasta 100) |
| `invoice.carta_porte.sea.containers[].type` | string | sí | Tipo de contenedor (TipoContenedor), c_ContenedorMaritimo o c_Contenedor en ferroviario. (hasta 6 caracteres) |
| `invoice.carta_porte.sea.containers[].registration` | string |  | Matrícula (Matricula). (hasta 15 caracteres) |
| `invoice.carta_porte.sea.containers[].seal` | string |  | Número de precinto (NumPrecinto). (hasta 20 caracteres) |
| `invoice.carta_porte.sea.containers[].related_id_ccp` | string |  | Ferri: el IdCCP de la Carta Porte del autotransporte a bordo (IdCCPRelacionado). (hasta 36 caracteres) |
| `invoice.carta_porte.sea.containers[].truck_plate` | string |  | Ferri: placa del vehículo a bordo (PlacaVMCCP). (hasta 10 caracteres) |
| `invoice.carta_porte.sea.containers[].certified_at` | string |  | Ferri: fecha de certificación de la Carta Porte del vehículo (FechaCertificacionCCP). (hasta 19 caracteres) |
| `invoice.carta_porte.sea.containers[].trailers` | arreglo de objeto |  | Remolques o semirremolques (Remolque): tipo (c_SubTipoRem) y placa. (hasta 2) |
| `invoice.carta_porte.sea.containers[].trailers[].type` | string | sí | Subtipo de remolque (SubTipoRem), c_SubTipoRem. (hasta 10 caracteres) |
| `invoice.carta_porte.sea.containers[].trailers[].plate` | string | sí | Placa del remolque (Placa). (hasta 10 caracteres) |
| `invoice.carta_porte.air` | objeto |  | Transporte aéreo (TransporteAereo): permiso, guía y transportista. |
| `invoice.carta_porte.air.permit_type` | string | sí | Tipo de permiso SCT (PermSCT), c_TipoPermiso. (hasta 10 caracteres) |
| `invoice.carta_porte.air.permit_number` | string | sí | Número de permiso SCT (NumPermisoSCT). (hasta 50 caracteres) |
| `invoice.carta_porte.air.aircraft` | string |  | Matrícula de la aeronave (MatriculaAeronave). (hasta 11 caracteres) |
| `invoice.carta_porte.air.insurer` | string |  | Aseguradora de responsabilidad civil (AseguraRespCivil). (hasta 50 caracteres) |
| `invoice.carta_porte.air.policy` | string |  | Póliza de responsabilidad civil (PolizaRespCivil). (hasta 30 caracteres) |
| `invoice.carta_porte.air.waybill` | string | sí | Número de guía aérea (NumeroGuia), de 12 a 15 caracteres. (hasta 15 caracteres) |
| `invoice.carta_porte.air.contract_place` | string |  | Lugar del contrato (LugarContrato). (hasta 120 caracteres) |
| `invoice.carta_porte.air.carrier` | string | sí | Código del transportista (CodigoTransportista), c_CodigoTransporteAereo. (hasta 6 caracteres) |
| `invoice.carta_porte.air.shipper` | objeto |  | Embarcador (RFCEmbarcador o NumRegIdTribEmbarc y ResidenciaFiscalEmbarc, NombreEmbarcador). |
| `invoice.carta_porte.air.shipper.tax_id` | string |  | RFC del embarcador (RFCEmbarcador). (hasta 13 caracteres) |
| `invoice.carta_porte.air.shipper.foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.carta_porte.air.shipper.foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.carta_porte.air.shipper.foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.carta_porte.air.shipper.name` | string |  | Nombre del embarcador (NombreEmbarcador). (hasta 254 caracteres) |
| `invoice.carta_porte.air.rate_charge` | number |  | Cargo por tasación (CargoPorTasacion). (de 0 a 1000000000000000) |
| `invoice.carta_porte.rail` | objeto |  | Transporte ferroviario (TransporteFerroviario): servicio, tráfico, derechos de paso y carros. |
| `invoice.carta_porte.rail.service` | string | sí | Tipo de servicio (TipoDeServicio), c_TipoDeServicio. (hasta 4 caracteres) |
| `invoice.carta_porte.rail.traffic` | string | sí | Tipo de tráfico (TipoDeTrafico), c_TipoDeTrafico. (hasta 4 caracteres) |
| `invoice.carta_porte.rail.insurer` | string |  | Aseguradora de responsabilidad civil (AseguraRespCivil). (hasta 50 caracteres) |
| `invoice.carta_porte.rail.policy` | string |  | Póliza de responsabilidad civil (PolizaRespCivil). (hasta 30 caracteres) |
| `invoice.carta_porte.rail.rights` | arreglo de objeto |  | Derechos de paso (DerechosDePaso): tipo y kilómetros. (hasta 50) |
| `invoice.carta_porte.rail.rights[].type` | string | sí | Tipo de derecho de paso (TipoDerechoDePaso), c_DerechosDePaso. (hasta 6 caracteres) |
| `invoice.carta_porte.rail.rights[].km` | number | sí | Kilometraje pagado (KilometrajePagado). (de 0 a 100000) |
| `invoice.carta_porte.rail.cars` | arreglo de objeto | sí | Carros (Carro). (hasta 200) |
| `invoice.carta_porte.rail.cars[].type` | string | sí | Tipo de carro (TipoCarro), c_TipoCarro. (hasta 4 caracteres) |
| `invoice.carta_porte.rail.cars[].registration` | string | sí | Matrícula (Matricula). (hasta 15 caracteres) |
| `invoice.carta_porte.rail.cars[].guide` | string | sí | Guía del carro (GuiaCarro). (hasta 15 caracteres) |
| `invoice.carta_porte.rail.cars[].net_tons` | number | sí | Toneladas netas del carro (ToneladasNetasCarro). (de 0 a 1000000) |
| `invoice.carta_porte.rail.cars[].containers` | arreglo de objeto |  | Contenedores (Contenedor). (hasta 10) |
| `invoice.carta_porte.rail.cars[].containers[].type` | string | sí | Tipo de contenedor (TipoContenedor), c_ContenedorMaritimo o c_Contenedor en ferroviario. (hasta 4 caracteres) |
| `invoice.carta_porte.rail.cars[].containers[].empty_kg` | number | sí | Peso del contenedor vacío en kg (PesoContenedorVacio). (de 0 a 100000000) |
| `invoice.carta_porte.rail.cars[].containers[].net_kg` | number | sí | Peso neto en kg (PesoNeto). (de 0 a 100000000) |
| `invoice.carta_porte.drivers` | arreglo de objeto | sí | Operadores (FiguraTransporte tipo 01): RFC, licencia y nombre. (hasta 5) |
| `invoice.carta_porte.drivers[].tax_id` | string o `""` | sí | RFC del operador (RFCFigura); vacío si es extranjero (con foreign). |
| `invoice.carta_porte.drivers[].license` | string | sí | Número de licencia (NumLicencia). (hasta 16 caracteres) |
| `invoice.carta_porte.drivers[].name` | string | sí | Nombre del operador (NombreFigura). (hasta 254 caracteres) |
| `invoice.carta_porte.drivers[].foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.carta_porte.drivers[].foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.carta_porte.drivers[].foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.carta_porte.figures` | arreglo de objeto |  | Otras figuras de transporte: 02 propietario, 03 arrendador, 04 notificado, 05 integrante de coordinados. (hasta 10) |
| `invoice.carta_porte.figures[].type` | `02`, `03`, `04`, `05` | sí | Tipo de figura (TipoFigura): 02 propietario, 03 arrendador, 04 notificado, 05 integrante. |
| `invoice.carta_porte.figures[].tax_id` | string |  | RFC de la figura (RFCFigura). |
| `invoice.carta_porte.figures[].foreign` | objeto |  | Si es extranjero: su país de residencia (ResidenciaFiscal, c_Pais) y su número de registro tributario (NumRegIdTrib), con el RFC genérico XEXX010101000. |
| `invoice.carta_porte.figures[].foreign.tax_id` | string | sí | Número de registro de identidad fiscal en su país (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.carta_porte.figures[].foreign.country` | string | sí | País de residencia fiscal, clave de 3 letras de c_Pais (USA, CAN…). (3 caracteres) |
| `invoice.carta_porte.figures[].name` | string | sí | Nombre de la figura (NombreFigura). (hasta 254 caracteres) |
| `invoice.carta_porte.figures[].parts` | arreglo de string |  | Partes del transporte que posee o arrienda (ParteTransporte), c_ParteTransporte. (hasta 20) |
| `invoice.carta_porte.figures[].address` | objeto |  | Domicilio (Domicilio). En México basta el código postal: estado, municipio y localidad se toman de c_CodigoPostal. |
| `invoice.carta_porte.figures[].address.street` | string |  | Calle (Calle). (hasta 100 caracteres) |
| `invoice.carta_porte.figures[].address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.carta_porte.figures[].address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.carta_porte.figures[].address.zip` | string | sí | Código postal (CodigoPostal). En México se deducen de él estado, municipio y localidad. (hasta 12 caracteres) |
| `invoice.carta_porte.figures[].address.country` | string |  | País (Pais), c_Pais. Por omisión MEX. (3 caracteres) |
| `invoice.carta_porte.figures[].address.state` | string |  | Estado (Estado): en el extranjero c_Estado para USA y CAN, o texto. (hasta 30 caracteres) |
| `invoice.carta_porte.figures[].address.municipality` | string |  | Municipio (Municipio), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.figures[].address.locality` | string |  | Localidad (Localidad), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.carta_porte.figures[].address.colony` | string |  | Colonia (Colonia), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.ine` | objeto |  | Complemento INE (procesos electorales). |
| `invoice.ine.process` | `Ordinario`, `Precampaña`, `Campaña` | sí | Tipo de proceso (TipoProceso): Ordinario, Precampaña o Campaña. |
| `invoice.ine.committee` | `Ejecutivo Nacional`, `Ejecutivo Estatal`, `Directivo Estatal` |  | Tipo de comité (TipoComite), con el proceso Ordinario. |
| `invoice.ine.accounting_id` | string |  | Clave de contabilidad (IdContabilidad), hasta 6 dígitos. |
| `invoice.ine.entities` | arreglo de objeto |  | Entidades (Entidad): clave del estado, ámbito y claves de contabilidad. (hasta 64) |
| `invoice.ine.entities[].key` | string | sí | Clave de la entidad (ClaveEntidad), 3 letras. (3 caracteres) |
| `invoice.ine.entities[].scope` | `Local`, `Federal` |  | Ámbito (Ambito): Local o Federal. |
| `invoice.ine.entities[].accounting_ids` | arreglo de string |  | Claves de contabilidad (IdContabilidad). (hasta 50) |
| `invoice.leyendas` | arreglo de objeto |  | Complemento de leyendas fiscales. (hasta 10) |
| `invoice.leyendas[].text` | string | sí | Texto de la leyenda (textoLeyenda). (hasta 1000 caracteres) |
| `invoice.leyendas[].disposition` | string |  | Disposición fiscal (disposicionFiscal), por ejemplo LISR. (hasta 30 caracteres) |
| `invoice.leyendas[].norm` | string |  | Norma o artículo (norma). (hasta 100 caracteres) |
| `invoice.donation` | objeto |  | Complemento de donatarias. |
| `invoice.donation.in_kind` | boolean |  | true si el donativo es en especie (va sin forma de pago en efectivo). |
| `invoice.donation.deducted` | boolean |  | true si el donativo es deducible para quien lo da. |
| `invoice.local_taxes` | arreglo de objeto |  | Impuestos locales (complemento implocal): traslados y retenciones estatales. (hasta 20) |
| `invoice.local_taxes[].retention` | boolean | sí | true si es una retención local; false si es un traslado. |
| `invoice.local_taxes[].name` | string | sí | Nombre del impuesto local (ImpLocTrasladado o ImpLocRetenido), como ISH. (hasta 100 caracteres) |
| `invoice.local_taxes[].rate` | number | sí | Tasa en por ciento (TasadeTraslado o TasadeRetencion). (de 0 a 100) |
| `invoice.local_taxes[].amount` | number | sí | Importe del impuesto local. (de 0 a 1000000000000) |
| `invoice.export` | `01`, `02`, `03`, `04` |  | Exportación (Exportacion), c_Exportacion: 01 no aplica (por omisión), 02 definitiva… |
| `invoice.comercio_exterior` | objeto |  | Complemento de comercio exterior 2.0. |
| `invoice.comercio_exterior.motive` | `"05"` |  | Motivo de traslado (MotivoTraslado): 05 envío de mercancías propias. |
| `invoice.comercio_exterior.owners` | arreglo de objeto |  | Propietarios de la mercancía si no es el emisor (Propietario), con motive 05. (hasta 10) |
| `invoice.comercio_exterior.owners[].tax_id` | string | sí | Número de registro tributario del propietario (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.comercio_exterior.owners[].country` | string | sí | País de residencia del propietario (ResidenciaFiscal), c_Pais. (3 caracteres) |
| `invoice.comercio_exterior.incoterm` | string |  | Incoterm (Incoterm), c_INCOTERM: EXW, FOB, CIF, DAP, DDP… (3 caracteres) |
| `invoice.comercio_exterior.certificate` | string |  | Número de certificado de origen (NumCertificadoOrigen). (hasta 40 caracteres) |
| `invoice.comercio_exterior.usd_rate` | number | sí | Tipo de cambio a dólares (TipoCambioUSD). (de -∞ a 1000000) |
| `invoice.comercio_exterior.issuer_curp` | string |  | CURP del emisor persona física (Emisor Curp). (18 caracteres) |
| `invoice.comercio_exterior.issuer_address` | objeto |  | Domicilio del emisor (Emisor Domicilio): calle y números; lo demás sale de su código postal. |
| `invoice.comercio_exterior.issuer_address.street` | string | sí | Calle (Calle). (hasta 100 caracteres) |
| `invoice.comercio_exterior.issuer_address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.issuer_address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.issuer_address.zip` | string |  | Código postal del emisor (CodigoPostal). |
| `invoice.comercio_exterior.receiver_address` | objeto |  | Domicilio del receptor en el extranjero (Receptor Domicilio). |
| `invoice.comercio_exterior.receiver_address.street` | string | sí | Calle (Calle). (hasta 100 caracteres) |
| `invoice.comercio_exterior.receiver_address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.receiver_address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.receiver_address.colony` | string |  | Colonia (Colonia), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.receiver_address.locality` | string |  | Localidad (Localidad), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.receiver_address.municipality` | string |  | Municipio (Municipio), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.receiver_address.state` | string |  | Estado (Estado), c_Estado para USA y CAN. (hasta 30 caracteres) |
| `invoice.comercio_exterior.receiver_address.country` | string | sí | País (Pais), c_Pais. (3 caracteres) |
| `invoice.comercio_exterior.receiver_address.zip` | string | sí | Código postal en su país (CodigoPostal). (hasta 12 caracteres) |
| `invoice.comercio_exterior.recipient` | objeto |  | Destinatario, si no es el receptor (Destinatario). |
| `invoice.comercio_exterior.recipient.name` | string |  | Nombre del destinatario (Nombre). (hasta 300 caracteres) |
| `invoice.comercio_exterior.recipient.tax_id` | string |  | Número de registro tributario del destinatario (NumRegIdTrib). (hasta 40 caracteres) |
| `invoice.comercio_exterior.recipient.address` | objeto | sí | Domicilio del destinatario (Domicilio). |
| `invoice.comercio_exterior.recipient.address.street` | string | sí | Calle (Calle). (hasta 100 caracteres) |
| `invoice.comercio_exterior.recipient.address.exterior` | string |  | Número exterior (NumeroExterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.recipient.address.interior` | string |  | Número interior (NumeroInterior). (hasta 55 caracteres) |
| `invoice.comercio_exterior.recipient.address.colony` | string |  | Colonia (Colonia), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.recipient.address.locality` | string |  | Localidad (Localidad), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.recipient.address.municipality` | string |  | Municipio (Municipio), en el extranjero como texto. (hasta 120 caracteres) |
| `invoice.comercio_exterior.recipient.address.state` | string |  | Estado (Estado): en el extranjero c_Estado para USA y CAN, o texto. (hasta 30 caracteres) |
| `invoice.comercio_exterior.recipient.address.country` | string | sí | País (Pais), c_Pais. Por omisión MEX. (3 caracteres) |
| `invoice.comercio_exterior.recipient.address.zip` | string | sí | Código postal (CodigoPostal). En México se deducen de él estado, municipio y localidad. (hasta 12 caracteres) |
| `invoice.comercio_exterior.goods` | arreglo de objeto | sí | Mercancías (Mercancia), una por concepto exportado. (hasta 200) |
| `invoice.comercio_exterior.goods[].id` | string |  | Número de identificación de la mercancía (NoIdentificacion): el sku de su concepto. (hasta 100 caracteres) |
| `invoice.comercio_exterior.goods[].tariff` | string |  | Fracción arancelaria (FraccionArancelaria), 10 dígitos. Transporte internacional. |
| `invoice.comercio_exterior.goods[].unit` | string | sí | Unidad aduana (UnidadAduana), c_UnidadAduana. |
| `invoice.comercio_exterior.goods[].quantity` | number |  | Cantidad en la unidad aduana (CantidadAduana). (de -∞ a 100000000000000) |
| `invoice.comercio_exterior.goods[].unit_value_usd` | number |  | Valor unitario en dólares (ValorUnitarioAduana). (de 0 a 10000000000000000) |
| `invoice.comercio_exterior.notes` | string |  | Observaciones del complemento (Observaciones). (hasta 300 caracteres) |
| `invoice.global` | objeto |  | Factura global a público en general (InformacionGlobal): periodicidad, meses y año. |
| `invoice.global.periodicity` | string | sí | Periodicidad (Periodicidad), c_Periodicidad: 01 diario, 02 semanal, 03 quincenal, 04 mensual, 05 bimestral. |
| `invoice.global.months` | string | sí | Meses (Meses), c_Meses: 01 a 12, o 13 a 18 bimestres. |
| `invoice.global.year` | integer | sí | Año (Año). (de 2022 a 2100) |
| `invoice.use` | string |  | Uso del CFDI (UsoCFDI), clave de c_UsoCFDI. Por omisión G03, o S01 con régimen 616. |
| `invoice.payment_form` | string |  | Forma de pago (FormaPago), clave de c_FormaPago: 01 efectivo, 03 transferencia, 04 tarjeta de crédito, 28 débito, 99 por definir… Obligatoria con PUE; con PPD es 99. |
| `invoice.payment_method` | `PUE`, `PPD` |  | Método de pago (MetodoPago): PUE (una sola exhibición, por omisión) o PPD (en parcialidades o diferido, se cobra con complementos de pago). |
| `invoice.paid_later` | boolean |  | Con PUE: true si aún no le pagan («Por cobrar» en la app) aunque se pagará este mes. |
| `invoice.currency` | string |  | Moneda, clave ISO 4217 de c_Moneda (MXN, USD, EUR…). Por omisión MXN. (3 caracteres) |
| `invoice.series` | string |  | Serie (Serie), hasta 25 caracteres. Cada serie lleva sus propios folios. (hasta 25 caracteres) |
| `invoice.notes` | string |  | Observaciones que aparecen en el PDF (no van en el XML). (hasta 1000 caracteres) |
| `invoice.pdf_language` | `es`, `en`, `bi` |  | Idioma del PDF: es (por omisión) o en. |
| `invoice.addenda` | objeto |  | Addenda del receptor (Walmart, Soriana…), con sus propios campos. |
| `invoice.related` | objeto |  | CFDI relacionados (CfdiRelacionados): tipo de relación de c_TipoRelacion y los UUID. |
| `invoice.related.relationship` | string | sí | Tipo de relación (TipoRelacion): 01 nota de crédito, 03 devolución, 04 sustitución, 07 anticipo… |
| `invoice.related.uuids` | arreglo de string | sí | Folios fiscales relacionados. (hasta 20) |
| `invoice.exchange_rate` | number |  | Tipo de cambio a pesos (TipoCambio). Obligatorio si la moneda no es MXN; use el del DOF del día anterior. (de -∞ a 1000000) |
| `invoice.folio` | integer |  | Folio (Folio). Fiscalisto asigna el siguiente de la serie; mande uno solo si debe ser ese. (de 1 a 2000000000) |
| `invoice.continue_sequence` | boolean |  | Con un folio elegido: true para que los siguientes sigan desde ese número. |
| `invoice.date` | string |  | Fecha de emisión (Fecha) si no es ahora, AAAA-MM-DDTHH:MM:SS hora de la Ciudad de México: hasta 72 horas antes. |
| `invoice.send_email` | boolean |  | true para mandar el PDF y el XML por correo al timbrar, con el diseño de Fiscalisto. Por omisión no se envía. (por omisión false) |
| `invoice.email_cc` | string o null |  | Correos con copia, separados por comas. |
| `invoice.metadata` | objeto |  | Sus propios datos: hasta 50 llaves de 40 caracteres con valores de texto de hasta 500. No van al CFDI; vuelven en el objeto y en los webhooks. |
| `send_email` | boolean |  | Mandar cada factura al correo del cliente (customer.email o el del catálogo). Por omisión true. |
| `catch_up` | `all`, `latest` |  | Si quedaron periodos sin timbrar (sin timbres, en pausa con su fecha pasada): all los timbra todos, cada uno con su mes; latest solo el más reciente. Por omisión all. |

Ejemplo:

```json
{
  "name": "Renta oficina 3",
  "schedule": {
    "frequency": "monthly",
    "day_of_month": 1,
    "hour": 7
  },
  "invoice": {
    "customer": {
      "tax_id": "ICV060329BY0",
      "legal_name": "INMOBILIARIA CVA",
      "tax_system": "601",
      "zip": "33826",
      "email": "pagos@cva.example"
    },
    "payment_form": "03",
    "items": [
      {
        "description": "Renta de oficina de {mes} {año}",
        "product_key": "80131500",
        "unit_price": 15000
      }
    ]
  }
}
```

## Con el SDK de TypeScript

```ts
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

const recurringInvoice = await fiscalisto.recurringInvoices.create({
  name: "Renta oficina 3",
  schedule: {
    frequency: "monthly",
    day_of_month: 1,
    hour: 7,
  },
  invoice: {
    customer: {
      tax_id: "ICV060329BY0",
      legal_name: "INMOBILIARIA CVA",
      tax_system: "601",
      zip: "33826",
      email: "pagos@cva.example",
    },
    payment_form: "03",
    items: [
      {
        description: "Renta de oficina de {mes} {año}",
        product_key: "80131500",
        unit_price: 15000,
      },
    ],
  },
}, { idempotencyKey: "pedido-A-1042" });
```

## Con el SDK de Python

```python
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

recurring_invoice = fiscalisto.recurring_invoices.create({
    "name": "Renta oficina 3",
    "schedule": {
        "frequency": "monthly",
        "day_of_month": 1,
        "hour": 7,
    },
    "invoice": {
        "customer": {
            "tax_id": "ICV060329BY0",
            "legal_name": "INMOBILIARIA CVA",
            "tax_system": "601",
            "zip": "33826",
            "email": "pagos@cva.example",
        },
        "payment_form": "03",
        "items": [
            {
                "description": "Renta de oficina de {mes} {año}",
                "product_key": "80131500",
                "unit_price": 15000,
            },
        ],
    },
}, idempotency_key="pedido-A-1042")
```

## Con el SDK de PHP

```php
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

$recurringInvoice = $fiscalisto->recurringInvoices->create([
    'name' => 'Renta oficina 3',
    'schedule' => [
        'frequency' => 'monthly',
        'day_of_month' => 1,
        'hour' => 7,
    ],
    'invoice' => [
        'customer' => [
            'tax_id' => 'ICV060329BY0',
            'legal_name' => 'INMOBILIARIA CVA',
            'tax_system' => '601',
            'zip' => '33826',
            'email' => 'pagos@cva.example',
        ],
        'payment_form' => '03',
        'items' => [
            [
                'description' => 'Renta de oficina de {mes} {año}',
                'product_key' => '80131500',
                'unit_price' => 15000,
            ],
        ],
    ],
], ['idempotency_key' => 'pedido-A-1042']);
```

## Con el SDK de .NET

```csharp
using System.Text.Json;
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var recurringInvoice = await fiscalisto.RecurringInvoices.CreateAsync(new CreateRecurringInvoiceParams
{
    Name = "Renta oficina 3",
    Schedule = new()
    {
        Frequency = "monthly",
        DayOfMonth = JsonDocument.Parse("1").RootElement,
        Hour = 7,
    },
    Invoice = new()
    {
        Customer = new InvoiceCreateCustomer
        {
            TaxId = "ICV060329BY0",
            LegalName = "INMOBILIARIA CVA",
            TaxSystem = "601",
            Zip = "33826",
            Email = "pagos@cva.example",
        },
        PaymentForm = "03",
        Items = new()
        {
            new()
            {
                Description = "Renta de oficina de {mes} {año}",
                ProductKey = "80131500",
                UnitPrice = 15000,
            },
        },
    },
}, new RequestOptions { IdempotencyKey = "pedido-A-1042" });
```

## Con el SDK de Go

```go
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	recurringInvoice, err := client.RecurringInvoices.Create(ctx, &fiscalisto.CreateRecurringInvoiceParams{
		Name: "Renta oficina 3",
		Schedule: fiscalisto.CreateRecurringInvoiceParamsSchedule{
			Frequency:  "monthly",
			DayOfMonth: json.RawMessage(`1`),
			Hour:       fiscalisto.Int64(7),
		},
		Invoice: fiscalisto.CreateRecurringInvoiceParamsInvoice{
			Customer: fiscalisto.ObjectOf(fiscalisto.InvoiceCreateCustomer{
				TaxID:     "ICV060329BY0",
				LegalName: "INMOBILIARIA CVA",
				TaxSystem: "601",
				Zip:       "33826",
				Email:     fiscalisto.String("pagos@cva.example"),
			}),
			PaymentForm: fiscalisto.String("03"),
			Items: []fiscalisto.InvoiceCreateItem{
				{
					Description: fiscalisto.String("Renta de oficina de {mes} {año}"),
					ProductKey:  fiscalisto.String("80131500"),
					UnitPrice:   fiscalisto.Float64(15000),
				},
			},
		},
	}, fiscalisto.WithIdempotencyKey("pedido-A-1042"))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(recurringInvoice.ID)
}
```

## Con el SDK de Java

```java
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.RequestOptions;
import com.fiscalisto.model.CreateRecurringInvoiceParams;
import com.fiscalisto.model.CreateRecurringInvoiceParamsInvoice;
import com.fiscalisto.model.CreateRecurringInvoiceParamsSchedule;
import com.fiscalisto.model.InvoiceCreateCustomer;
import com.fiscalisto.model.InvoiceCreateItem;
import java.util.List;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var recurringInvoice = fiscalisto.recurringInvoices().create(new CreateRecurringInvoiceParams()
        .setName("Renta oficina 3")
        .setSchedule(new CreateRecurringInvoiceParamsSchedule()
                .setFrequency("monthly")
                .setDayOfMonth(1)
                .setHour(7))
        .setInvoice(new CreateRecurringInvoiceParamsInvoice()
                .setCustomer(new InvoiceCreateCustomer()
                        .setTaxId("ICV060329BY0")
                        .setLegalName("INMOBILIARIA CVA")
                        .setTaxSystem("601")
                        .setZip("33826")
                        .setEmail("pagos@cva.example"))
                .setPaymentForm("03")
                .setItems(List.of(
                        new InvoiceCreateItem()
                                .setDescription("Renta de oficina de {mes} {año}")
                                .setProductKey("80131500")
                                .setUnitPrice(15000)
                ))), RequestOptions.idempotencyKey("pedido-A-1042"));
System.out.println(recurringInvoice.getId());
```

## Respuesta 201

Correcto.

Un objeto `RecurringInvoice`:

| Campo | Tipo | Siempre viene | Descripción |
| --- | --- | --- | --- |
| `id` | string | sí | Identificador del objeto, con su prefijo (iss_, inv_, ret_, cus_, prd_, emp_, bat_, brn_, whs_, stm_, adj_, evt_, whe_). |
| `livemode` | boolean | sí | true en producción (llaves fk_live_), false en pruebas (fk_test_). Lo de pruebas no vale ante el SAT. |
| `object` | `"recurring_invoice"` | sí | Qué tipo de objeto es («invoice», «customer»…). |
| `issuer` | string | sí | El emisor (iss_…). |
| `name` | string | sí | Para reconocerla. |
| `status` | `active`, `paused` | sí | active (timbra en cada fecha) o paused. |
| `schedule` | objeto | sí | Cada cuánto: frequency (monthly, weekly o daily), interval, day_of_month (con monthly; "last" es el último del mes), y la hora (hour, en time_zone) en que se timbra. |
| `schedule.frequency` | `monthly`, `weekly`, `daily` | sí | monthly: cada interval meses en day_of_month. weekly o daily: cada interval semanas o días. |
| `schedule.interval` | integer | sí | Cada cuántos meses, semanas o días. (de -9007199254740991 a 9007199254740991) |
| `schedule.day_of_month` | integer o `"last"` o null | sí | Con monthly: el día del mes, del 1 al 28, o "last" (el último). null con weekly o daily. |
| `schedule.hour` | integer | sí | La hora (0 a 23) en que se timbra, en time_zone. (de -9007199254740991 a 9007199254740991) |
| `schedule.time_zone` | string | sí | La zona de esa hora (America/Mexico_City, America/Cancun…). |
| `next_invoice_on` | string | sí | La fecha (AAAA-MM-DD) de la siguiente factura. |
| `last_invoiced_on` | string o null | sí | La fecha del último periodo que timbró, o null si aún no timbra ninguna. |
| `last_invoice` | string o null | sí | La última factura (inv_…) que timbró, o null. |
| `last_error` | objeto o null | sí | Por qué no se pudo timbrar la última vez (sin timbres, el cliente borrado, el SAT la rechazó…), o null. Se vuelve a intentar a la siguiente hora del día siguiente; también llega recurring_invoice.failed. |
| `last_error.message` | string o null | sí | Qué pasó. |
| `send_email` | boolean | sí | Si cada factura se manda al correo del cliente. |
| `catch_up` | `all`, `latest` | sí | Si quedaron periodos sin timbrar: all los timbra todos, latest solo el más reciente. |
| `customer` | objeto | sí | A quién se factura. |
| `customer.tax_id` | string | sí | RFC (Rfc), 12 caracteres una persona moral y 13 una física. |
| `customer.legal_name` | string o null | sí | Nombre o razón social tal como está en la constancia de situación fiscal, sin el régimen de capital (sin «S.A. de C.V.»). |
| `currency` | string | sí | La moneda de la factura. |
| `items` | arreglo de objeto | sí | Los conceptos, con description tal como se guardó ({mes}, {año}… se llenan en cada factura). |
| `items[].description` | string | sí | Descripción del concepto (Descripcion), hasta 1,000 caracteres. |
| `items[].product_key` | string | sí | Clave del producto o servicio (ClaveProdServ), 8 dígitos de c_ClaveProdServ. Búsquela con GET /v1/sat_catalogs/product_keys?q=… |
| `items[].quantity` | number |  | Cantidad (Cantidad). Por omisión 1. |
| `items[].unit_key` | string |  | Clave de unidad (ClaveUnidad) de c_ClaveUnidad: E48 unidad de servicio (por omisión), H87 pieza, ACT actividad… |
| `items[].unit_price` | number | sí | Precio unitario antes de impuestos (ValorUnitario). |
| `total` | number o null | sí | El total de cada factura con los precios de hoy. |
| `created_at` | string (date-time) o null | sí | Cuándo se creó. |

```json
{
  "id": "rin_OufpKqnrvx9p7Hq2mZr1XyT5uBcW8sKdLx",
  "object": "recurring_invoice",
  "livemode": false,
  "issuer": "iss_OufpKqnrvx9p",
  "name": "Renta oficina 3",
  "status": "active",
  "schedule": {
    "frequency": "monthly",
    "interval": 1,
    "day_of_month": 1,
    "hour": 7,
    "time_zone": "America/Mexico_City"
  },
  "next_invoice_on": "2026-11-01",
  "last_invoiced_on": "2026-10-01",
  "last_invoice": "inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN",
  "last_error": null,
  "send_email": true,
  "catch_up": "all",
  "customer": {
    "tax_id": "ICV060329BY0",
    "legal_name": "INMOBILIARIA CVA"
  },
  "currency": "MXN",
  "items": [
    {
      "description": "Renta de oficina de {mes} {año}",
      "product_key": "80131500",
      "quantity": 1,
      "unit_key": "E48",
      "unit_price": 15000
    }
  ],
  "total": 17400,
  "created_at": "2026-09-28T11:02:14-06:00"
}
```

## Errores

Puede responder 400, 401, 403, 404, 429, 500 con el cuerpo de error de siempre; cada código está en https://fiscalisto.com/docs/api/errores.md.
