# Editar (/docs/developers/api-reference/platform-catalogs/edit)

## Descripcion general [#descripcion-general]

Este endpoint escribe un **override** sobre un catálogo de plataforma, a nivel de toda la organización o acotado a una razón social. El override **toma efecto de inmediato** para cualquier catálogo, incluidas las tablas federales (UMA, ISR, IMSS). El identificador en la URL es el `catalog_key` del catálogo. Una solicitud exitosa devuelve `200` con la clave, el origen resultante y el `effective_payload` ya en vigor.

## Endpoint [#endpoint]

`PATCH https://app.integranom.com/api/v1/platform-catalogs/{catalog_key}`

**Path param:** `catalog_key` — string, la clave del catálogo a autoadministrar (por ejemplo `uma`, `isr_tariff`, `imss_worker_ramos`).

## Override a nivel organización [#override-a-nivel-organización]

***

Omite `legal_entity_number` (o envíalo como `null`) para que el override aplique a **toda la organización**. El `payload` es el nuevo valor y se valida contra el `shape` del catálogo. Su estructura **varía por catálogo**: el ejemplo de abajo (`scalar`) es ilustrativo; la forma real depende del `shape` (`scalar` / `range_table` / `keyed_table`).

Para conocer la estructura exacta del `payload`, consulta primero `effective_payload` / `platform_payload` en el endpoint de [detalle](/docs/developers/api-reference/platform-catalogs/detail).

```json
{
  "payload": { "daily": "113.14", "monthly": "3439.46" }
}
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/platform-catalogs/uma" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "payload": { "daily": "113.14", "monthly": "3439.46" }
}'
```

**Respuesta**

```json
{
"key": "uma",
"source": "org",
"frequency": null,
"legal_entity_number": null,
"effective_payload": { "daily": "113.14", "monthly": "3439.46" }
}
```

## Override frequency-scoped y por razón social [#override-frequency-scoped-y-por-razón-social]

***

Para un catálogo `frequency_scoped` (como `isr_tariff`) el campo `frequency` es **requerido**; en el resto de los catálogos se ignora. Con `legal_entity_number` limitas el override a esa razón social (el `source` regresa como `"rs"`); si lo omites, aplica a toda la organización.

El campo `reason` es opcional e informativo. Recuerda que el `payload` de este ejemplo es ilustrativo: su forma real depende del `shape` del catálogo.

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/platform-catalogs/isr_tariff" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "frequency": "monthly",
  "legal_entity_number": 1,
  "reason": "Actualización interna de tarifa",
  "payload": { "...": "estructura según el shape del catálogo" }
}'
```

**Respuesta**

```json
{
"key": "isr_tariff",
"source": "rs",
"frequency": "monthly",
"legal_entity_number": 1,
"effective_payload": { "...": "estructura según el shape del catálogo" }
}
```

## Payload de isn\_by\_state [#payload-de-isn_by_state]

***

Para `isn_by_state` el `payload` es un objeto que va de la clave del estado a su valor, y cada valor es una cadena decimal (tasa plana) o un objeto con **exactamente uno** de `rate` o `brackets`, más los opcionales `taxSurchargeRate`, `baseSurchargeRate` y `exemptMonthlyAmount`, todos cadenas decimales. Los `brackets` llevan `lowerLimit`, `upperLimit` (`null` en el último), `fixedFee` y `marginalRate`. En la respuesta, `effective_payload` trae cada estado como una cadena decimal con su tasa base, y las definiciones con objeto vienen aparte en `isn_definitions`.

```json
{
  "payload": {
    "SIN": {
      "brackets": [
        { "lowerLimit": "0.01", "upperLimit": "500000.00", "fixedFee": "0.00", "marginalRate": "0.024" },
        { "lowerLimit": "500000.01", "upperLimit": null, "fixedFee": "12000.00", "marginalRate": "0.026" }
      ]
    },
    "CAM": { "rate": "0.03", "taxSurchargeRate": "0.33" },
    "QUE": { "rate": "0.03", "exemptMonthlyAmount": "76617.76" },
    "JAL": "0.03"
  }
}
```

El `payload` se rechaza con `400` cuando un estado trae `rate` y `brackets` a la vez o ninguno de los dos, cuando un valor no es una cadena decimal válida, cuando trae un campo que no existe, o cuando los rangos no son contiguos y ascendentes, se traslapan o dejan abierto un rango que no es el último. El cuerpo de la respuesta es `{ "message": "Invalid catalog payload for this catalog's shape.", "errors": { ... } }`, con `errors` indexado por la clave del estado que falló.

## Campos del cuerpo [#campos-del-cuerpo]

| Campo                 | Tipo            | Notas                                                                                                                                                                                                                                                |
| --------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `frequency`           | string          | **Requerido solo** para catálogos `frequency_scoped` (por ejemplo `isr_tariff`). Se ignora en el resto.                                                                                                                                              |
| `legal_entity_number` | integer \| null | Omitir o `null` = override a nivel de toda la organización. Un número lo limita a esa razón social.                                                                                                                                                  |
| `reason`              | string          | Opcional e informativo.                                                                                                                                                                                                                              |
| `payload`             | object          | El nuevo valor. Se valida contra el `shape` del catálogo; su estructura varía por catálogo. Consulta `effective_payload` / `platform_payload` en el [detalle](/docs/developers/api-reference/platform-catalogs/detail) para conocer la forma exacta. |

## Forma de la respuesta [#forma-de-la-respuesta]

`200 OK` — la clave del catálogo, el origen resultante y el valor efectivo ya en vigor:

```json
{
  "key": "uma",
  "source": "org",
  "frequency": null,
  "legal_entity_number": null,
  "effective_payload": { "daily": "113.14", "monthly": "3439.46" }
}
```

## Errores [#errores]

| Status | Código                   | Causa                                                                                                                                          |
| ------ | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | `FREQUENCY_REQUIRED`     | Catálogo frequency-scoped sin `frequency`.                                                                                                     |
| `400`  | `INVALID_PAYLOAD`        | El `payload` no cumple el shape del catálogo. El cuerpo de la respuesta trae `errors` con el detalle.                                          |
| `400`  | `LEGAL_ENTITY_NOT_FOUND` | La razón social indicada no existe en tu organización.                                                                                         |
| `400`  | `BELOW_MINIMUM`          | Un valor queda por debajo del mínimo del catálogo. En `factor_dias_mes`: 5 para `semana`, 12 para `quincena`, 28 para `mes` y 336 para `anio`. |
| `400`  | `ABOVE_MAXIMUM`          | Un valor queda por encima del máximo del catálogo. En `factor_dias_mes`, `mes` no puede pasar de 31.                                           |
| `401`  | -                        | API key ausente o inválida.                                                                                                                    |
| `404`  | -                        | El catálogo con ese `catalog_key` no existe.                                                                                                   |

## Vocabulario de códigos de error [#vocabulario-de-códigos-de-error]

| Código                   | Significado                                                                                         |
| ------------------------ | --------------------------------------------------------------------------------------------------- |
| `FREQUENCY_REQUIRED`     | El catálogo es frequency-scoped y no incluiste `frequency` en el cuerpo.                            |
| `INVALID_PAYLOAD`        | El `payload` no cumple el `shape` del catálogo. Revisa `errors` en la respuesta para ver qué falló. |
| `LEGAL_ENTITY_NOT_FOUND` | El `legal_entity_number` no corresponde a ninguna razón social de tu organización.                  |
| `BELOW_MINIMUM`          | Un valor del `payload` es menor al mínimo que permite el catálogo.                                  |
| `ABOVE_MAXIMUM`          | Un valor del `payload` es mayor al máximo que permite el catálogo.                                  |