Crear
Crea una automatización por plan de proyecto con sus hitos.
Descripción general
Este endpoint crea una automatización por plan de proyecto: los conceptos (items) definen el total del proyecto y los hitos (milestones) lo dividen. Al completar un hito se genera una orden de cobro por la parte de ese hito. Una solicitud exitosa devuelve 201 con la automatización creada, con la misma forma que Consultar plan de proyecto.
billing_mode define qué significa el value de cada hito:
percentage→ un porcentaje del total:"30"es 30 %. Los hitos deben sumar exactamente 100.fixed→ un monto. Los hitos deben sumar exactamente el total de los conceptos, con impuestos.
Con auto_even_split: true, la API divide el total en partes iguales e ignora el value de cada hito, que sigue siendo obligatorio. En percentage cada hito vale lo mismo; en fixed el total se reparte en centavos y la diferencia queda en el último hito.
Crear el plan no genera órdenes de cobro. remaining_amount empieza igual al total.
Acepta el header Idempotency-Key para reintentar sin duplicar la automatización.
Requiere el permiso Crear en Automatizaciones.
Endpoint
https://app.credonix.mx/api/v1/project-plan-automationsHitos por porcentaje
Con billing_mode: "percentage", cada hito es un porcentaje del total de los conceptos: 30 % de anticipo y 70 % a la entrega. La respuesta devuelve los hitos en porcentaje, con completed: false, y remaining_amount igual a total_amount.
{
"customer_id": "cmu21fp9g00qiv1dqitkc8c8x",
"legal_entity_id": "cmpydghmk0004v1oyioviuwjs",
"currency": "MXN",
"concept": "Implementación de sistema",
"billing_mode": "percentage",
"milestones": [
{
"description": "Anticipo",
"value": "30"
},
{
"description": "Entrega",
"value": "70"
}
],
"items": [
{
"product_name": "Servicio de consultoría",
"description": "Consultoría mensual",
"quantity": 1,
"unit_price": "100000",
"product_code": "84111506",
"unit_code": "E48",
"taxes": [
{
"type": "iva",
"category": "transferred",
"rate": "0.16"
}
]
}
]
}Hitos por monto fijo
Con billing_mode: "fixed", cada hito es un monto y la suma debe ser igual al total con impuestos: 348 + 812 = 1160.00. La respuesta devuelve los montos con dos decimales.
{
"customer_id": "cmu21ahvu00juv1dqayw8ba2r",
"legal_entity_id": "cmpydghmk0004v1oyioviuwjs",
"currency": "MXN",
"concept": "Desarrollo de sitio web",
"billing_mode": "fixed",
"milestones": [
{
"description": "Fase 1",
"value": "348"
},
{
"description": "Fase 2",
"value": "812"
}
],
"items": [
{
"product_name": "Servicio de consultoría",
"description": "Consultoría especializada",
"quantity": 1,
"unit_price": "1000",
"product_code": "84111506",
"unit_code": "E48",
"taxes": [
{
"type": "iva",
"category": "transferred",
"rate": "0.16"
}
]
}
]
}Reglas de los campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
customer_id | string | Sí | id de un cliente de tu organización. |
legal_entity_id | string | Sí | id de una razón social de tu organización. |
concept | string | Sí | Concepto de las órdenes de cobro. No puede estar vacío. |
description | string | null | No | Texto libre. |
currency | string | Sí | MXN o USD. |
grace_period_days | integer | No | Días entre la emisión y el vencimiento de cada orden. Número JSON entero, mayor o igual a 0. Por defecto 5. |
billing_mode | string | Sí | percentage o fixed. |
auto_even_split | boolean | No | Divide el total en partes iguales entre los hitos. Por defecto false. |
items | array | Sí | Conceptos del proyecto. Ver abajo. |
milestones | array | Sí | Hitos. Al menos uno. Ver abajo. |
No se aceptan otros campos: cualquier campo desconocido responde 400 con VALIDATION_ERROR.
milestones[]
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
id | string | No | Se ignora al crear. |
description | string | Sí | Descripción del hito. No puede estar vacía. |
due_date | string | null | No | Fecha estimada del hito, con el formato YYYY-MM-DD. |
value | string | number | Sí | Porcentaje (percentage) o monto (fixed). Acepta texto numérico o número, mayor o igual a 1. Obligatorio aun con auto_even_split. |
order_index | integer | No | Orden del hito, mayor o igual a 0. Por defecto, su posición en el arreglo. |
items[]
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
product_id | string | null | No | id de un producto de tu organización. |
product_name | string | null | No | Nombre del concepto. Cada concepto requiere product_name o description. |
description | string | null | No | Descripción del concepto. |
quantity | integer | Sí | Cantidad, como número JSON entero. |
unit_price | string | number | Sí | Precio unitario mayor o igual a 0, por ejemplo "1234.50". |
discount | string | null | No | Con discount_type: "percentage" es un porcentaje (10 es 10 %); con fixed, un monto. |
discount_type | string | null | No | percentage o fixed. |
product_code | string | null | No | Clave de producto o servicio del SAT. |
unit_code | string | null | No | Clave de unidad del SAT. |
taxes | array | No | Impuestos del concepto. Por defecto []. |
taxes[]
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
type | string | Sí | iva, isr o ieps. Cualquier otro valor es un impuesto local de hasta 10 caracteres. |
category | string | Sí | transferred (trasladado), withheld (retenido) o exempt (exento). IVA acepta los tres; ISR solo withheld; IEPS acepta transferred o withheld. Los impuestos locales no aceptan exempt. |
rate | string | Sí | Tasa como fracción: "0.16" es 16 %. Mayor o igual a 0. |
base | string | null | No | Base del impuesto. Si la omites, la respuesta devuelve el subtotal del concepto menos su descuento. |
Reglas del plan
Estas reglas responden 400 con INVALID_AUTOMATION. Si fallan varias, message las incluye todas:
- "Por lo menos un producto o servicio debe ser agregado."
- "Todos los productos deben incluir: cantidad y precio unitario."
- "Todos los productos deben contener un total igual o mayor a 0."
- "Todos los hitos deben incluir: descripción y valor."
- "Los hitos deben sumar 100%." (
percentagesinauto_even_split) - "Los hitos deben sumar el total de la orden de cobro." (
fixedsinauto_even_split)
Errores
| Status | Código | Causa |
|---|---|---|
400 | VALIDATION_ERROR | Un campo no cumple sus reglas. errors indica el campo y el motivo. |
400 | INVALID_AUTOMATION | Los conceptos o los hitos no cumplen las reglas del plan. |
400 | CUSTOMER_NOT_FOUND | customer_id no es un cliente de tu organización. |
400 | LEGAL_ENTITY_NOT_FOUND | legal_entity_id no es una razón social de tu organización. |
400 | PRODUCT_NOT_FOUND | Un product_id no es un producto de tu organización. |
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 Crear en Automatizaciones. |
400 — los hitos no suman 100 %
Con dos hitos de "30" en modo percentage:
{
"code": "INVALID_AUTOMATION",
"message": "Los hitos deben sumar 100%.",
"request_id": "711b255c-85ff-4f5d-a697-3691799f57cf"
}