Retirada em loja
Lista as retiradas em loja e conduz cada uma de aguardando preparo até pronta, retirada ou cancelada.
Na retirada em loja (BOPIS, "buy online, pick up in store") o cliente compra pelo site e busca o pedido num ponto da loja, em vez de receber em casa. Para cada pedido assim a plataforma abre uma retirada ligada a um depósito. O fluxo do balcão tem três passos: separar o pedido e marcar como pronto, receber o cliente e confirmar com o código que só ele tem, ou cancelar.
Ler exige view_shipping ou manage_shipping; as três ações exigem manage_shipping. Os estados e a regra de bloqueio do código estão na visão geral.
Listar retiradas
Devolve as retiradas da mais nova para a mais antiga, sem paginação, com o nome e o endereço do depósito e o número do pedido. O código de retirada não vem: ele só é visto pelo cliente.
/api/v1/admin/pickupsAdminLista as retiradas em loja
Parâmetros de consulta
statusstringawaiting_preparationreadypicked_upexpiredcancelledwarehouse_iduuid500.Exemplo de requisição
curl "$BASE_URL/api/v1/admin/pickups?status=awaiting_preparation" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"pickups": [
{
"id": "c3a1f0de-5b2e-4a77-9c41-0d6e8f1b2a33",
"order_id": "a8a3c7a3-5f15-45a8-a385-4f20fbf8b722",
"warehouse_id": "5e0a9c1d-7b3f-4d2a-8e6c-1f4b9a0c7d52",
"status": "awaiting_preparation",
"code_attempts": 0,
"expires_at": "2026-10-18T12:00:00Z",
"created_at": "2026-10-11T12:00:00Z",
"updated_at": "2026-10-11T12:00:00Z",
"warehouse_name": "Loja Centro",
"warehouse_address": "Rua das Flores, 100",
"warehouse_city": "São Paulo",
"warehouse_state": "SP",
"warehouse_zipcode": "01310100",
"order_number": "PEDIDO-20261011-0004"
}
]
}Sem retiradas, pickups vem [].
Campos da resposta
pickups[].iduuidpickups[].order_iduuidpickups[].warehouse_iduuidpickups[].vendor_iduuidpickups[].statusstringawaiting_preparationreadypicked_upexpiredcancelledpickups[].code_attemptsintegerpickups[].code_locked_untilstringpickups[].delivery_schedule_iduuidpickups[].ready_atstringpickups[].picked_up_atstringpickups[].expires_atstringexpired.pickups[].created_atstringpickups[].updated_atstringpickups[].warehouse_namestringpickups[].warehouse_addressstringpickups[].warehouse_citystringpickups[].warehouse_statestringpickups[].warehouse_zipcodestringpickups[].order_numberstringErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Sem token ou sem privilégio | {"error":"insufficient privileges", ...} |
| 500 | warehouse_id que não é UUID, ou falha interna | {"error":"failed to list pickups","detail":"..."} |
Marcar como pronta
Avisa que o pedido está separado. O estado passa de awaiting_preparation para ready, a data fica registrada e a plataforma publica o evento de retirada pronta, com o código, que alimenta o aviso ao cliente. É idempotente: repetir numa retirada já ready responde sucesso sem mudar nada.
/api/v1/admin/pickups/{id}/readyAdminMarca a retirada como pronta
Parâmetros de caminho
iduuidobrigatórioSem corpo.
Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/pickups/c3a1f0de-5b2e-4a77-9c41-0d6e8f1b2a33/ready" \
-H "Authorization: Bearer $TOKEN"Resposta
{ "status": "ready" }Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Retirada inexistente | {"error":"pickup not found"} |
| 400 | Estado que não permite (por exemplo, já retirada ou cancelada) | {"error":"cannot mark ready from status \"picked_up\""} |
| 400 | id que não é UUID | {"error":"o valor \"abc\" não é um uuid válido. ..."} |
Confirmar a retirada
Registra que o cliente retirou o pedido. Você informa o código de 6 dígitos que o cliente mostra; se bate, a retirada vai para picked_up e o usuário que confirmou fica registrado. Um código errado não é um erro HTTP: volta 200 com confirmed: false e quantas tentativas restam.
Depois de 5 códigos errados seguidos, a retirada é bloqueada por 15 minutos: a resposta passa a ser 429, e qualquer tentativa nesse período, mesmo com o código certo, também.
/api/v1/admin/pickups/{id}/confirmAdminConfirma a retirada com o código do cliente
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
codestringobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/pickups/c3a1f0de-5b2e-4a77-9c41-0d6e8f1b2a33/confirm" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"code": "483920"}'Resposta
{ "confirmed": true, "locked": false, "attempts_left": 0 }{ "confirmed": false, "locked": false, "attempts_left": 4 }{
"confirmed": false,
"locked": true,
"locked_until": "2026-10-11T12:30:00Z",
"attempts_left": 0
}Campos da resposta
confirmedbooleantrue quando o código bateu e a retirada foi concluída.lockedbooleantrue quando a retirada está bloqueada para novas tentativas.locked_untilstringlocked: true.attempts_leftinteger0, e esse número não indica falta de tentativas.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON | {"error":"invalid request body","detail":"..."} |
| 400 | Retirada inexistente | {"error":"pickup not found"} |
| 400 | Retirada que não está ready | {"error":"pickup not ready for confirmation (status \"awaiting_preparation\")"} |
| 429 | Código bloqueado por excesso de tentativas | o corpo de bloqueio acima |
Cancelar a retirada
Cancela uma retirada que ainda está em awaiting_preparation ou ready. A plataforma libera o estoque reservado no depósito e devolve ao estoque as unidades baixadas quando o pedido foi criado. Se uma dessas devoluções de estoque falhar, o cancelamento da retirada continua valendo e a falha é apenas registrada.
/api/v1/admin/pickups/{id}/cancelAdminCancela a retirada e devolve o estoque
Parâmetros de caminho
iduuidobrigatórioSem corpo.
Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/pickups/c3a1f0de-5b2e-4a77-9c41-0d6e8f1b2a33/cancel" \
-H "Authorization: Bearer $TOKEN"Resposta
{ "status": "cancelled" }Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Retirada inexistente, ou em estado que não permite cancelar (picked_up, expired, cancelled) | {"error":"pickup not found"} |
| 400 | id que não é UUID | {"error":"o valor \"abc\" não é um uuid válido. ..."} |