---
title: "Carrinho e compra"
description: "Do carrinho persistido ao pedido pago."
---
O carrinho do LuckyMaker é persistido por `uuid`. A SDK cria, salva e reutiliza esse UUID sozinha.

## UUID do carrinho

Você não passa o UUID como argumento. Ele fica na propriedade `sdk.cart.uuid`:

```ts
console.log(sdk.cart.uuid); // undefined antes do primeiro uso
```

Na primeira chamada que precisa de carrinho, a SDK gera um UUID e guarda. No browser, ele fica em `localStorage`; em SSR/Node, em memória.

Para continuar um carrinho existente:

```ts
sdk.cart.uuid = "uuid-do-carrinho";
```

Ou na criação da instância:

```ts
const sdk = new LMSdk({
    baseUrl: "api.sualoja.com.br",
    cartUuid: "uuid-do-carrinho"
});
```

## Consultar o carrinho

```ts
const cart = await sdk.cart.getCart();
const items = await sdk.cart.getItems();
```

Se ainda não existir carrinho, a SDK cria o UUID e o backend cria o registro vazio.

## Adicionar itens

`addItems` cria o carrinho automaticamente quando necessário:

```ts
await sdk.cart.addItems({
    item: {
        type: "RAFFLE_NUMBERS",
        raffleUUID: "uuid-do-sorteio",
        amount: 10
    }
});

console.log(sdk.cart.uuid); // UUID salvo pela SDK
```

Tipos de item suportados:

| `type` | Campos principais |
|---|---|
| `RAFFLE_NUMBERS` | `raffleUUID`, `amount` |
| `RAFFLE_NUMBERS` + `kind: "GAMBLING"` | `raffleUUID`, `priceMultiplier`, `amount` |
| `ECOMMERCE_ITEM` | `itemId`, `amount` |
| `SUBSCRIPTION` | `planId`, `amount` |
| `CREDITS` | `amount` |

## Substituir e remover

```ts
await sdk.cart.replaceItems({
    items: [
        { type: "CREDITS", amount: 50 }
    ]
});

await sdk.cart.removeItem("item-id");
```

## Ofertas e cupons

```ts
const publicOffers = await sdk.offers.listPublic();
const myOffers = await sdk.offers.listOffers();
const coupons = await sdk.offers.listCoupons();

await sdk.offers.claimOffer("offer-id");
await sdk.coupons.redeemCoupon("CUPOM10");
```

## Validar o carrinho

Para validar itens antes de persistir:

```ts
const issues = await sdk.cart.previewIssues({
    items: [
        { type: "RAFFLE_NUMBERS", raffleUUID: "uuid", amount: 10 }
    ],
    paymentMethod: "PIX"
});
```

Para validar o carrinho já persistido:

```ts
const issues = await sdk.cart.previewIssuesCart({
    cpf: "00000000000"
});
```

## Checkout

Use o UUID que a SDK já salvou:

```ts
const cartUuid = sdk.cart.uuid;

if (!cartUuid) {
    throw new Error("Carrinho ainda não criado.");
}

const purchase = await sdk.purchase.createPurchase({
    captcha: "<token-do-captcha>",
    cart: {
        uuid: cartUuid
    },
    paymentData: {
        type: "PIX"
    }
});
```

Ou pelo fluxo de pedidos:

```ts
const order = await sdk.orders.createOrder("payment-id", {
    cpf: "00000000000"
});

const bonds = await sdk.orders.getBonds("payment-id");
```

## Carrinho expirado

Se o backend responder `CART_GONE` ou `CART_NOT_FOUND`, a SDK descarta o UUID antigo e repete a requisição uma vez com um carrinho novo. Você não precisa tratar esse caso manualmente.

## Status e acompanhamento

```ts
const order = await sdk.orders.getOrder("payment-id");
const payments = await sdk.payments.listHistory({ page: 1 });
const shipping = await sdk.payments.getShipping("payment-uuid");
```

:::tip[Type safety]
O union de itens é gerado do TypeBox. O autocomplete mostra os campos obrigatórios de cada variante.
:::