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

# Colocar pedido

> Cierra un carrito abierto, bloquea su intent de pago y arranca fulfillment.

Valida el carrito actual, bloquea el intent de pago, copia el workflow de fulfillment, cierra el pedido y arranca el walker de place. El walker entra al primer `state` y espera una [actualización de estado](https://firespark.cloud/docs/es/integrations-api/orders/\[id]/status/patch) posterior.

> [!NOTE]
>
> Requiere un access token de Storefront API de [Intercambio de
> token](https://firespark.cloud/docs/es/storefront-api/oauth/exchange/post.md). Un segundo place del mismo
> pedido se rechaza.

En `@fire-spark/storefront`, llama `order.placeOrder()`. Sin `intent_id`, el SDK guarda primero los tenders actuales (de `setTenders` / `applyRedeem`, o de `payment` como un tender real) y luego coloca con el `intent_id` de ese borrador. Si la última sincronización del carrito fue rechazada, `placeOrder` lanza `OrderSyncRejectedError` (con el `code` de la API) y no coloca nada. Sin un tender real y con canjes que no cubren el total, lanza `OrderPaymentRequiredError` (`code: PAYMENT_REQUIRED`) sin llamar a la API.

## Parámetros de ruta

| Parámetro | Requerido | Descripción |
| - | - | - |
| `id` | Sí | Identificador externo del pedido |

## Cuerpo de la solicitud

Envía `intent_id` o `payment.type`. No hay efectivo por defecto: un cuerpo sin ninguno de los dos (`{}`) se rechaza con `422` `PAYMENT_REQUIRED`, salvo que los canjes cubran todo el total. En ese caso place arma solo tenders `REDEMPTION`.

| Campo | Requerido | Tipo | Descripción |
| - | - | - | - |
| `intent_id` | No | string | Id del intent `DRAFT` guardado con [Guardar intent de pago](https://firespark.cloud/docs/es/storefront-api/orders/\[id]/payment-intent/put). Place lo deja en `LOCKED`. Si lo envías, `payment` se ignora. |
| `payment.type` | No | `CASH` \| `CARD` \| `BANK_TRANSFER` \| `WALLET` \| `PIN_PAD` \| `FINANCING` \| `REDEMPTION` | Atajo de un solo método, requerido sin `intent_id` salvo que los canjes cubran el total. Place arma un tender real más un tender `REDEMPTION` por cada `payment_id` de los canjes. |
| `payment.provider` | No | id de proveedor del catálogo | Por defecto `firespark`. |
| `payment.id` | No | string | Id del pago del merchant. Se copia al tender real como `payment_id`. |
| `payment.collect_at` | No | `DEVICE` \| `KIOSK` \| `COUNTER` \| `DOOR` \| `OTHER` | Dónde se cobra ese tender. Por defecto `DOOR` para `CASH` y `DEVICE` para los demás métodos. |

Un intent `DRAFT` o `LOCKED` ya guardado se abandona si colocas sin `intent_id`. El intent nuevo queda `LOCKED`.

```bash theme={null}
curl -X POST "https://firespark.cloud/api/storefront/v1/orders/ord-48291/place" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "payment": {
      "type": "CARD",
      "provider": "kushki",
      "collect_at": "DEVICE"
    }
  }'
```

Para bloquear un borrador que ya guardaste:

```bash theme={null}
curl -X POST "https://firespark.cloud/api/storefront/v1/orders/ord-48291/place" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "intent_id": "pi_draft" }'
```

## Respuesta

| Estado | Significado |
| - | - |
| `201` | Aceptado — fulfillment arrancó (`status: ACCEPTED`) |
| `202` | Ya hay un place en curso (`status: IN_PROGRESS`) |
| `409` | El pedido ya fue colocado o ya no está `OPEN` (`status: EXISTS`) |
| `422` | Validación fallida, no se envió pago (`details.code: PAYMENT_REQUIRED`), el intent borrador no coincide, o el grafo de fulfillment es inválido |

```json Success theme={null}
{
  "data": {
    "order_id": "ord-48291",
    "order_fulfillment_id": "ord-48291",
    "status": "ACCEPTED"
  }
}
```


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