Editar
Actualiza parcialmente una orden de cobro y, opcionalmente, timbra su CFDI.
Descripción general
Este endpoint actualiza parcialmente una orden de cobro. Todos los campos del cuerpo son opcionales: los que omites conservan su valor guardado. Una solicitud exitosa devuelve 200 con la orden de cobro completa.
Según los campos que envíes, la edición es básica o completa, igual que en la aplicación:
- Edición básica: solo
concept,description,issue_date,due_date,notesynote. Se permite aunque la orden de cobro tenga un CFDI emitido.statusse recalcula, salvo en órdenes de cobro canceladas. - Edición completa: incluye
customer_id,legal_entity_id,currency,itemso un objetocfdi. Si la orden de cobro tiene un CFDI emitido (sat_status: "emitted"), responde409con el códigoINVOICE_HAS_CFDI; cancela primero el CFDI con Cancelar CFDI.
En una edición completa:
itemsreemplaza todos los conceptos. Si omitesitems, se conservan los conceptos guardados y labasede sus impuestos se recalcula como el subtotal neto de cada concepto.- Se recalculan los totales y
remaining_amount(saldo pendiente) queda como el nuevo total menos los pagos activos. Si los pagos superan el nuevo total, responde409conPAYMENTS_EXCEED_TOTAL. - Los datos fiscales del cliente se vuelven a copiar a la orden de cobro.
sat_statusqueda enemittedsi la solicitud timbra un CFDI real y ennot_requireden cualquier otro caso.- Con
cfdi, la respuesta incluye la llavecfdicon el CFDI timbrado. Si faltan datos para timbrar, responde400conCFDI_STAMP_FAILED.
Para timbrar una orden de cobro en USD, usa Emitir CFDI: en este endpoint, cfdi sobre una orden en USD responde 400, con VALIDATION_ERROR si falta cfdi.exchange_rate y con EXCHANGE_RATE_NOT_SUPPORTED si lo envías.
Requiere el permiso Administrar en Órdenes de cobro.
Endpoint
https://app.credonix.mx/api/v1/invoices/{invoiceId}Path param: invoiceId — el id de la orden de cobro.
Edición básica
Envía solo los datos básicos que quieras cambiar. El ejemplo edita una orden de cobro con un CFDI emitido (sat_status: "emitted").
{ "concept": "Mantenimiento de sistemas septiembre 2026" }Reemplazar los conceptos
Enviar items hace una edición completa: los conceptos anteriores se reemplazan y los totales se recalculan. note guarda el motivo del cambio en la actividad de la orden de cobro.
{
"concept": "Consultoría septiembre 2026, alcance ampliado",
"items": [
{
"product_name": "Consultoría administrativa",
"description": "Servicio mensual de consultoría",
"quantity": 1,
"unit_price": "2000",
"product_code": "84111506",
"unit_code": "E48",
"taxes": [
{ "type": "iva", "category": "transferred", "rate": "0.16" }
]
}
],
"note": "Ajuste de precio acordado con el cliente"
}Editar y timbrar en modo de prueba
Con cfdi, la API aplica la edición y timbra el CFDI con los conceptos resultantes. La respuesta incluye cfdi. Como el ejemplo usa "test": true, el CFDI es de prueba y sat_status queda en not_required. La orden de cobro es en MXN, así que exchange_rate se ignora y el CFDI trae exchange_rate: null.
"cfdi": {
"payment_form": "03",
"payment_method": "PUE",
"cfdi_use": "G03",
"issue_date": "2026-09-14",
"exchange_rate": "17.10",
"test": true
}Reglas de los campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
concept | string | No | No vacío. |
description | string | null | No | null se guarda como "". |
issue_date | string | No | YYYY-MM-DD. |
due_date | string | null | No | YYYY-MM-DD. No puede ser anterior a issue_date. |
notes | string | null | No | Notas internas. |
note | string | No | Máximo 500 caracteres. Motivo del cambio; se guarda en la actividad de la orden de cobro. |
customer_id | string | No | Edición completa. Cliente de tu organización. |
legal_entity_id | string | No | Edición completa. Razón social de tu organización. |
currency | MXN | USD | No | Edición completa. |
items | array | No | Edición completa. Reemplaza todos los conceptos. Mismas reglas que en Crear orden de cobro. |
cfdi | object | null | No | Edición completa y timbrado. Mismas reglas que en Crear orden de cobro. |
Errores
| Status | Código | Causa |
|---|---|---|
400 | VALIDATION_ERROR | Falla de validación del cuerpo, por ejemplo due_date anterior a issue_date. errors[] trae el detalle por campo. |
400 | CUSTOMER_NOT_FOUND | customer_id no existe en tu organización. |
400 | LEGAL_ENTITY_NOT_FOUND | legal_entity_id no existe en tu organización. |
400 | PRODUCT_NOT_FOUND | Un product_id de los conceptos no existe en tu organización. |
400 | EXCHANGE_RATE_NOT_SUPPORTED | Se envió cfdi.exchange_rate en una orden de cobro en USD. |
400 | CFDI_STAMP_FAILED | No fue posible timbrar. message explica la causa. |
400 | LEGAL_ENTITY_NOT_CONFIGURED | Con "test": true, la razón social no está configurada para timbrar CFDI de prueba. |
401 | MISSING_API_KEY | INVALID_API_KEY | API_KEY_REVOKED | API key ausente, inválida o revocada. |
403 | INSUFFICIENT_PERMISSIONS | La API key no tiene el permiso Administrar en Órdenes de cobro. |
404 | NOT_FOUND | La orden de cobro no existe en tu organización. |
409 | INVOICE_HAS_CFDI | Edición completa sobre una orden de cobro con un CFDI emitido. |
409 | PAYMENTS_EXCEED_TOTAL | Los pagos de la orden de cobro superan el nuevo total. |
500 | INTERNAL_ERROR | Error interno. |
409 — la orden de cobro tiene un CFDI emitido
{
"code": "INVOICE_HAS_CFDI",
"message": "Esta orden de cobro cuenta con una factura emitida. Solo es posible modificar información básica de la orden. Para realizar cambios adicionales, primero es necesario cancelar la factura.",
"request_id": "c8c02cbd-4b5b-414f-a1ba-0075afa708ca"
}409 — los pagos superan el nuevo total
{
"code": "PAYMENTS_EXCEED_TOTAL",
"message": "El total de pagos de esta orden de cobro excede el nuevo monto de la orden de cobro. Ajusta los pagos primero o disminuye el monto de la orden de cobro.",
"request_id": "0d8d6dfa-dd61-43c6-ac50-85349dcbcc4b"
}