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

# Aceptar pagos únicos

> Cobra a tus clientes una sola vez con el recurso payments de Commet — sin suscripción ni plan. Impuestos, recibo y comprobante de forma automática.

Un pago es un cargo único independiente, sin suscripción ni plan asociado.

Commet calcula los impuestos, genera un recibo y envía un comprobante en cada pago de forma automática.

<Note>
  Para deals de por vida y compras únicas cobradas como un **plan** (trials, intro offers, add-ons, modelos de consumo), usa [Pagos únicos](/docs/es/one-time-payments) en su lugar.
</Note>

## Link vs. charge

Hay dos formas de tomar un pago único.

* **Link** (`payments.create`): genera un link de pago alojado. El cliente abre la `url` y paga con cualquier tarjeta. Guarda (vault) el método de pago al confirmar.
* **Charge** (`payments.charge`): cobra el método de pago ya guardado del cliente fuera de sesión. Sin interacción del cliente, sin `url`.

## Crear un link de pago

Devuelve un `Payment` con una `url`. Redirige al cliente a esa URL para cobrar.

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    const payment = await commet.payments.create({
      amount: 25000,
      currency: 'usd',
      description: 'Annual report',
      customerId: 'user_123',
      successUrl: 'https://yourapp.com/thanks',
    })

    redirect(payment.url)
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    payment = commet.payments.create(
        amount=25000,
        currency='usd',
        description='Annual report',
        customer_id='user_123',
        success_url='https://yourapp.com/thanks',
    )

    redirect(payment.url)
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    payment, err := client.Payments.Create(ctx, &commet.CreatePaymentParams{
        Amount:      25000,
        Currency:    "usd",
        Description: "Annual report",
        CustomerID:  "user_123",
        SuccessURL:  "https://yourapp.com/thanks",
    })

    // redirect(payment.URL)
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    CreatePaymentParams params = CreatePaymentParams.builder()
        .amount(25000)
        .currency("usd")
        .description("Annual report")
        .customerId("user_123")
        .successUrl("https://yourapp.com/thanks")
        .build();
    var payment = commet.payments().create(params);

    // redirect(payment.url())
    ```
  </Tab>

  <Tab title="PHP">
    ```php theme={null}
    $result = $commet->payments->create(
        amount: 25000,
        currency: 'usd',
        description: 'Annual report',
        customerId: 'user_123',
        successUrl: 'https://yourapp.com/thanks',
    );

    redirect($result->url);
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST https://commet.co/api/v1/payments \
      -H "x-api-key: $COMMET_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "amount": 25000,
        "currency": "usd",
        "description": "Annual report",
        "customerId": "user_123",
        "successUrl": "https://yourapp.com/thanks"
      }'
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    commet payments create \
      --amount 25000 \
      --currency usd \
      --description "Annual report" \
      --customer-id user_123 \
      --success-url https://yourapp.com/thanks
    ```
  </Tab>
</Tabs>

`amount` está en centavos. `25000` son \$250.00.

### Parámetros

| Parámetro | Tipo | Requerido | Descripción |
| - | - | - | - |
| `amount` | `number` | Sí | Monto a cobrar en centavos |
| `currency` | `string` | Sí | Código de moneda ISO 4217 (`usd`, `eur`, `brl`) |
| `description` | `string` | Sí | Aparece en el link de pago, el recibo y el comprobante |
| `customerId` | `string` | No | ID de cliente de Commet (`cus_xxx`) o tu ID externo |
| `successUrl` | `string` | No | A dónde llega el cliente después de pagar |
| `metadata` | `object` | No | Pares clave-valor. Forma: `{ [key: string]: string }` |

## Cobrar un método de pago guardado

Cobra el método de pago guardado del cliente fuera de sesión. El cliente debe tener un método de pago en archivo.

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    const payment = await commet.payments.charge({
      customerId: 'user_123',
      amount: 25000,
      currency: 'usd',
      description: 'Annual report',
    })
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    response = commet.payments.charge(
        customer_id='user_123',
        amount=25000,
        currency='usd',
        description='Annual report',
    )
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    result, err := client.Payments.Charge(ctx, &commet.ChargePaymentParams{
        CustomerID:  "user_123",
        Amount:      25000,
        Currency:    "usd",
        Description: "Annual report",
    })
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    ChargePaymentParams params = ChargePaymentParams.builder()
        .customerId("user_123")
        .amount(25000)
        .currency("usd")
        .description("Annual report")
        .build();
    var payment = commet.payments().charge(params);
    ```
  </Tab>

  <Tab title="PHP">
    ```php theme={null}
    $result = $commet->payments->charge(
        customerId: 'user_123',
        amount: 25000,
        currency: 'usd',
        description: 'Annual report',
    );
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST https://commet.co/api/v1/payments/charge \
      -H "x-api-key: $COMMET_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "customerId": "user_123",
        "amount": 25000,
        "currency": "usd",
        "description": "Annual report"
      }'
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    commet payments charge \
      --customer-id user_123 \
      --amount 25000 \
      --currency usd \
      --description "Annual report"
    ```
  </Tab>
</Tabs>

### Parámetros

| Parámetro | Tipo | Requerido | Descripción |
| - | - | - | - |
| `customerId` | `string` | Sí | ID de cliente de Commet (`cus_xxx`) o tu ID externo |
| `amount` | `number` | Sí | Monto a cobrar en centavos |
| `currency` | `string` | Sí | Código de moneda ISO 4217 (`usd`, `eur`, `brl`) |
| `description` | `string` | Sí | Aparece en el recibo y el comprobante |
| `metadata` | `object` | No | Pares clave-valor. Forma: `{ [key: string]: string }` |

## Obtener un pago

```typescript theme={null}
const payment = await commet.payments.get({ id: 'pay_123' })
```

## Listar pagos

```typescript theme={null}
const { data } = await commet.payments.list({
  customerId: 'user_123',
  limit: 20,
})
```

| Parámetro | Tipo | Requerido | Descripción |
| - | - | - | - |
| `customerId` | `string` | No | Filtra por un cliente |
| `limit` | `number` | No | Tamaño de página |
| `cursor` | `string` | No | Cursor de paginación de la página anterior |

## Cancelar un link de pago

Cancela un link pendiente para que ya no se pueda pagar.

```typescript theme={null}
await commet.payments.cancel({ id: 'pay_123' })
```

<Warning>
  Solo se puede cancelar un link que no haya sido pagado ni haya empezado a procesarse. Los charges no se pueden cancelar.
</Warning>

## El objeto Payment

| Campo | Tipo | Descripción |
| - | - | - |
| `id` | `string` | ID del pago (`pay_xxx`) |
| `customerId` | `string \| null` | Cliente al que pertenece el pago |
| `kind` | `"link" \| "charge"` | Cómo se tomó el pago |
| `status` | `string` | Estado actual (ver abajo) |
| `provider` | `"stripe" \| "commet" \| "dlocal"` | Proveedor de pago que lo procesó |
| `amountSubtotal` | `number` | Monto antes de impuestos en centavos |
| `taxAmount` | `number` | Impuestos en centavos |
| `amountTotal` | `number` | Subtotal + impuestos en centavos |
| `currency` | `string` | Código de moneda ISO 4217 |
| `description` | `string` | Descripción definida al crear |
| `metadata` | `object \| null` | Pares clave-valor definidos al crear |
| `url` | `string \| null` | Link de pago alojado. `null` para charges |
| `expiresAt` | `string \| null` | Cuándo expira el link |
| `createdAt` | `string` | Fecha y hora ISO 8601 |
| `updatedAt` | `string` | Fecha y hora ISO 8601 |
| `object` | `"payment"` | Tipo de objeto |
| `livemode` | `boolean` | `false` para pagos de sandbox |

### Estados

* `pending`: El link se creó y espera a que el cliente pague.
* `processing`: El pago se está confirmando con el proveedor.
* `succeeded`: El pago se completó y se generó un recibo.
* `requires_action`: El cliente debe completar un paso extra como 3D Secure.
* `failed`: El pago no se concretó.
* `canceled`: El link se canceló antes del pago.

`failed` y `requires_action` no son terminales para los links: el cliente puede volver a abrir el mismo link de pago y pagar con otra tarjeta, siempre que el link no haya expirado.

## Ver en el dashboard

Ve a **Payments**. Cada pago muestra su estado, monto, impuestos, cliente y el recibo generado.

## Limitaciones

* `amount` está en centavos — unidades menores de la moneda
* Los impuestos se calculan automáticamente y se suman sobre el `amount`
* `payments.charge` requiere un método de pago guardado en el cliente
* Los charges no se pueden cancelar
* Un link solo se puede cancelar mientras está `pending`

## Relacionado

* [Pagos únicos](/docs/es/one-time-payments) — Cargos únicos cobrados como un plan
* [Recibos y ciclos de cobro](/docs/es/invoices-and-billing-cycles) — Cómo se generan los recibos
* [Gestionar clientes](/docs/es/manage-customers) — Crear clientes y guardar métodos de pago
* [Referencia del SDK](/docs/es/sdk-reference) — Métodos del SDK de Node.js
* [CLI](/docs/es/cli#payments) — Crea links de pago desde la terminal


## Related topics

- [Pagos únicos](/docs/es/one-time-payments.md)
- [Quickstart](/docs/es/choose-a-billing-model.md)
- [CLI](/docs/es/cli.md)
- [Introducción](/docs/es/index.md)
- [Recibos y ciclos de cobro](/docs/es/invoices-and-billing-cycles.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.