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

# Vender un pack desde tu propio checkout

> Cómo una venta hecha en tu web entra a Craqui con dos pedidos: asignar el pack y registrar el pago.

Vendes un pack de clases en tu web, o en recepción con tu sistema de caja, y quieres que el cliente lo tenga en
Craqui sin que nadie lo cargue a mano. Son dos pedidos: **asignar el pack** y **registrar el pago**. La API nunca
cobra: registra lo que ya cobraste.

Antes de empezar, el estudio tiene que tener habilitadas las escrituras de plata (si no, la respuesta es
[`money_writes_not_enabled`](https://docs.craqui.com/errors/money_writes_not_enabled)) y una clave con los permisos **Packs de créditos** y
**Pagos**, que la propietaria marca en el grupo «Plata» al crear la clave.

## 1. Asigna el pack

Manda el cliente, el pack y lo que cobraste. El monto va siempre en centésimos y con la moneda del estudio:
`360000` con `UYU` es \$ 3.600,00.

```bash theme={null}
curl https://api.craqui.com/v1/credit_grants \
  -H "Authorization: Bearer $CRAQUI_KEY" \
  -H "Idempotency-Key: venta-8812-pack" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "cli_01jqy553dmxw6vmq7g5vzfa9yz",
    "credit_pack_id": "cpk_01j63ec7mff1rr7pbk3z1b8ke1",
    "fee": { "amount_cents": 360000, "currency": "UYU" }
  }'
```

La respuesta es `201` con el pack asignado y su `fee_id`: la cuota del pack, que queda para cobrar. Guárdala.

* Si el precio del pack en Craqui no es el que cobraste, la respuesta es `409`
  [`price_changed`](https://docs.craqui.com/errors/price_changed) con `current_price`, y no se asigna nada. Resuélvelo con el estudio
  antes de reintentar.
* Un pack sin precio no lleva `fee`: manda `"no_fee_reason": "no_charge"`. Siempre uno de los dos.

## 2. Registra el pago

Con el `fee_id` del paso anterior, registra el pago por el saldo completo de la cuota:

```bash theme={null}
curl https://api.craqui.com/v1/payments \
  -H "Authorization: Bearer $CRAQUI_KEY" \
  -H "Idempotency-Key: venta-8812-pago" \
  -H "Content-Type: application/json" \
  -d '{
    "fee_id": "fee_01jq0h7v4dn2c9me4f8b5x3kwr",
    "amount": { "amount_cents": 360000, "currency": "UYU" },
    "payment_method": "bank_transfer",
    "notes": "Transferencia BROU ref 8812"
  }'
```

La respuesta es `201` con el pago. Al cliente le llega el recibo y, si el estudio emite la factura electrónica
sola con cada pago, sale la factura.

* Un pago es siempre por el saldo completo: si `amount` no coincide, la respuesta es `409`
  [`amount_mismatch`](https://docs.craqui.com/errors/amount_mismatch) con `expected_amount`, y no se registra nada. No hay pagos
  parciales.
* `notify: false` no le manda el recibo al cliente (necesita el permiso de silenciar avisos). La factura
  electrónica sale igual: es un documento fiscal, no un aviso.

## Si un pedido se corta

Repite el **mismo pedido con la misma `Idempotency-Key`**. Craqui responde lo que ya hizo, con
`Idempotent-Replayed: true`, también después de las 24 horas: nunca se asigna el pack dos veces ni se registra
el pago dos veces. Si cambias el pedido, usa una clave nueva; si no, la respuesta es
[`idempotency_key_reused`](https://docs.craqui.com/errors/idempotency_key_reused).

Si después de un corte recibes un `409` de estado (por ejemplo [`fee_already_paid`](https://docs.craqui.com/errors/fee_already_paid)
con otra clave), lee el objeto con un `GET` antes de decidir: puede que tu primer intento ya lo haya hecho.

## Mira antes de escribir

Cualquiera de los dos pedidos acepta `?dry_run=true`: responde la vista previa (créditos, cuota, saldo, si sale
el recibo y la factura) sin escribir nada y sin usar la `Idempotency-Key`.


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