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

# Actualizar cobro

> Actualiza un cobro existente sin cancelarlo ni recrearlo, y reenvía el mensaje solo si lo pides.

Actualiza un cobro **en sitio**: cambias monto, título, fecha u otros campos sin
cancelar el cobro ni crear uno nuevo. El mensaje al cliente se reenvía **solo si
envías `resend: true`**.

<Note>
  Pensado para cobros que cambian a diario (por ejemplo, intereses de mora). En
  lugar de cancelar y recrear el cobro en cada ajuste —lo que reenvía un mensaje
  cada vez y satura al cliente— actualizas el mismo cobro y decides cuándo
  notificar.
</Note>

Solo se modifican los campos que envías; el resto queda intacto. La idempotencia
(`x-idempotency`) no aplica a este endpoint.

### Path Parameters

<ParamField path="payment_id" type="string" required placeholder="9e5ccd4a-d2f0-49dd-87fc-a0da752bd166">
  ID del cobro que quieres actualizar. [Crear cobro](/client/payments/create).
</ParamField>

### Body

Todos los campos son opcionales.

<ParamField body="resend" type="boolean" default="false">
  Si es `true`, reenvía la solicitud de pago al cliente (WhatsApp) con los datos
  actualizados. Si es `false` o se omite, el cobro se actualiza en silencio y **no
  se consume ningún mensaje**.
</ParamField>

<ParamField body="amount" type="number">
  Nuevo monto a cobrar.
</ParamField>

<ParamField body="tax" type="number">
  Nuevo monto de impuestos, en la misma moneda.
</ParamField>

<ParamField body="title" type="string">
  Breve mensaje que se muestra al cliente al pagar. Mínimo 4 caracteres.
</ParamField>

<ParamField body="description" type="string">
  Descripción del cobro. Mínimo 4 caracteres.
</ParamField>

<ParamField body="reference" type="string">
  Referencia de pago para el portal de recaudo.
</ParamField>

<ParamField body="phone" type="string">
  Número de teléfono del cliente al que se reenvía la solicitud vía WhatsApp.
</ParamField>

<ParamField body="email" type="string">
  Correo del cliente para la solicitud de pago.
</ParamField>

<ParamField body="document_url" type="string">
  URL de un documento (por ejemplo, la factura actualizada) que se mostrará al
  cliente. Si lo envías, se usa tal cual; si no, y cambió el monto, título o
  descripción, OnePay regenera automáticamente su propio documento.
</ParamField>

<ParamField body="due_date" type="date">
  Fecha límite de pago, formato `YYYY-MM-DD HH:MM:SS`.
</ParamField>

<ParamField body="expiration_date" type="date">
  Fecha de expiración del cobro, formato `YYYY-MM-DD HH:MM:SS`.
</ParamField>

<Warning>
  Solo se pueden actualizar cobros **abiertos** (pendientes, en progreso,
  rechazados, programados o parcialmente pagados). Un cobro ya pagado, cancelado
  o expirado responde `422 cant_update_payment`.

  Además, si el cobro tiene una **transacción en curso** en la pasarela, no se
  puede cambiar el `amount` ni el `tax` (responde `422 payment_charge_in_progress`);
  los campos de texto sí se pueden editar.
</Warning>

### Ejemplos de uso

<Tabs>
  <Tab title="curl">
    ```bash theme={null}
    curl https://api.onepay.la/v1/payments/9e5ccd4a-d2f0-49dd-87fc-a0da752bd166 \
      -X PUT \
      -H "Authorization: Bearer sk_test_xxx" \
      -H "Content-Type: application/json" \
      -d '{
        "amount": 1523000,
        "title": "Cuota + interés al 22-jul",
        "resend": false
      }'
    ```
  </Tab>

  <Tab title="JavaScript">
    ```ts theme={null}
    import fetch from 'node-fetch';

    const body = {
      amount: 1523000,
      title: 'Cuota + interés al 22-jul',
      resend: false
    };

    await fetch('https://api.onepay.la/v1/payments/9e5ccd4a-d2f0-49dd-87fc-a0da752bd166', {
      method: 'PUT',
      headers: {
        Authorization: 'Bearer sk_test_xxx',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(body)
    });
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    import requests

    payload = {
        "amount": 1523000,
        "title": "Cuota + interés al 22-jul",
        "resend": False
    }

    response = requests.put(
        "https://api.onepay.la/v1/payments/9e5ccd4a-d2f0-49dd-87fc-a0da752bd166",
        headers={"Authorization": "Bearer sk_test_xxx"},
        json=payload,
        timeout=15
    )
    response.raise_for_status()
    print(response.json())
    ```
  </Tab>
</Tabs>

### Response

Devuelve el cobro actualizado, con la misma estructura que [Crear cobro](/client/payments/create).

<ResponseField name="id" type="string">
  Identificador único del cobro.
</ResponseField>

<ResponseField name="amount" type="number">
  Monto del cobro en pesos.
</ResponseField>

<ResponseField name="status" type="string">
  Estado del cobro.
</ResponseField>

<ResponseField name="title" type="string">
  Título del cobro.
</ResponseField>

<ResponseField name="description" type="string">
  Descripción del cobro.
</ResponseField>

<ResponseField name="due_date" type="string">
  Fecha límite de pago (ISO 8601), si aplica.
</ResponseField>

<ResponseField name="payment_link" type="string">
  Enlace de pago del cobro.
</ResponseField>

### Ejemplo de respuesta

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "9e5ccd4a-d2f0-49dd-87fc-a0da752bd166",
    "source": "Cuota + interés al 22-jul",
    "currency": "COP",
    "amount": 1523000,
    "amount_label": "$ 1.523.000",
    "title": "Cuota + interés al 22-jul",
    "description": null,
    "phone": "+573201112233",
    "expiration_at": "2025-03-20T22:36:24.000000Z",
    "due_date": null,
    "document_link": null,
    "external_id": null,
    "allows": {
      "cards": true,
      "accounts": true,
      "card_extra": false,
      "realtime": false,
      "pse": true,
      "transfiya": true
    },
    "status": "pending",
    "is_test": false,
    "created_at": "2025-03-05T22:36:24.000000Z",
    "paid_at": null,
    "payment_link": "https://pagos.onepay.la/payment/9e5ccd4a-d2f0-49dd-87fc-a0da752bd166",
    "redirect_url": null,
    "provider_id": null,
    "metadata": null,
    "customer": null,
    "method": null,
    "splits": [],
    "company": null,
    "commission": null
  }
  ```

  ```json 422 Cobro no editable theme={null}
  {
    "message": "Este pago ya no se puede actualizar por su estado actual.",
    "code": 15007,
    "code_name": "cant_update_payment"
  }
  ```

  ```json 422 Transacción en curso theme={null}
  {
    "message": "Este pago tiene una transacción activa en proceso. Por favor espera a que expire e intenta nuevamente.",
    "code": 15004,
    "code_name": "payment_charge_in_progress"
  }
  ```

  ```json 404 Pago theme={null}
  {
    "message": "Registro no encontrado, Pago no existe",
    "code": 10002,
    "code_name": "record_not_found"
  }
  ```
</ResponseExample>
