Movimentos e transferências
Lê o extrato de estoque, lança entradas, saídas e ajustes, e transfere unidades entre depósitos.
Listar movimentos
O extrato é o registro imutável de tudo que mexeu no estoque: entradas, saídas e ajustes, do mais novo para o mais antigo. Use para auditar um saldo ou reconciliar com o seu sistema.
/api/v1/vendor/erp/inventory/movementsSellerLista o extrato de movimentos
Parâmetros de consulta
product_iduuidwarehouse_iduuidtypestringinoutadjustfromstring2026-10-01) ou data e hora RFC 3339.tostring2026-10-31) vale meia-noite do início do dia, então exclui os movimentos desse dia.pageintegerpadrão: 1per_pageintegerpadrão: 50Exemplo de requisição: Listar movimentos
curl "$BASE_URL/api/v1/vendor/erp/inventory/movements?warehouse_id=8204b8b8-e7e2-4b96-bba8-5a937fe001c8&type=in&per_page=20" \
-H "Authorization: Bearer $TOKEN"Resposta: Listar movimentos
{
"movements": [
{
"id": "593aca14-635f-4bd2-acc2-c10f99ddae51",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"warehouse_id": "8204b8b8-e7e2-4b96-bba8-5a937fe001c8",
"warehouse_name": "Depósito Central",
"type": "in",
"quantity": 20,
"reason": "Compra de reposição",
"reference": "NF 4521",
"created_by": "b00d3e7c-d5b4-4942-827a-06e2c43645af",
"created_at": "2026-10-11T14:30:00Z"
}
],
"total": 1
}Campos da resposta
movementsarrayMovimentos da página.
iduuidvendor_iduuidproduct_iduuidproduct_namestringwarehouse_iduuidwarehouse_namestringtypestringinoutadjustquantityintegerin/out; em adjust é o delta com sinal.reasonstringreferencestringcreated_byuuidcreated_atdatetimetotalintegerErros: Listar movimentos
| Status | Quando | Corpo |
|---|---|---|
| 500 | Um filtro de id não é um UUID válido (a plataforma devolve 500, não 400). | {"error":"failed to list movements","detail":"o valor \"xyz\" não é um uuid válido. Envie o identificador completo, com os 36 caracteres e os hífens. Corrija o campo e reenvie."} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |
Registrar movimento
Lança uma entrada, saída ou ajuste num depósito. O movimento e o novo saldo são gravados juntos, numa só transação. Quando o produto é do próprio seller, o mesmo delta também é refletido no estoque do catálogo, que é o que a vitrine e o checkout leem.
/api/v1/vendor/erp/inventory/movementsSellerRegistra um movimento de estoque
Corpo da requisição
product_iduuidobrigatóriowarehouse_iduuidobrigatóriotypestringobrigatórioinoutadjustin soma, out subtrai, adjust aplica quantity como delta com sinal. Aceita maiúsculas.quantityintegerobrigatórioin e out, positivo. Em adjust, um delta (positivo ou negativo), nunca o saldo final. Zero é recusado.reasonstringreferencestringExemplo de requisição: Registrar movimento
curl -X POST "$BASE_URL/api/v1/vendor/erp/inventory/movements" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"warehouse_id": "8204b8b8-e7e2-4b96-bba8-5a937fe001c8",
"type": "in",
"quantity": 20,
"reason": "Compra de reposição",
"reference": "NF 4521"
}'Resposta: Registrar movimento
{
"id": "593aca14-635f-4bd2-acc2-c10f99ddae51",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"warehouse_id": "8204b8b8-e7e2-4b96-bba8-5a937fe001c8",
"warehouse_name": "Depósito Central",
"type": "in",
"quantity": 20,
"reason": "Compra de reposição",
"reference": "NF 4521",
"created_by": "b00d3e7c-d5b4-4942-827a-06e2c43645af",
"created_at": "2026-10-11T14:30:00Z"
}Campos da resposta
iduuidvendor_iduuidproduct_iduuidproduct_namestringwarehouse_iduuidwarehouse_namestringtypestringinoutadjustquantityintegerin/out; em adjust é o delta com sinal.reasonstringreferencestringcreated_byuuidcreated_atdatetimeErros: Registrar movimento
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo não é um JSON válido. | {"error":"invalid request body","detail":"invalid character 'b' looking for beginning of object key string"} |
| 400 | product_id ausente. | {"error":"vendorerp: product_id required"} |
| 400 | warehouse_id ausente. | {"error":"vendorerp: warehouse_id required"} |
| 400 | type fora dos três valores. | {"error":"vendorerp: type must be in|out|adjust"} |
| 400 | quantity igual a zero. | {"error":"vendorerp: quantity must be non-zero"} |
| 400 | quantity negativa em in ou out. | {"error":"vendorerp: quantity must be positive for in/out"} |
| 400 | Saída ou ajuste negativo maior que o saldo atual. | {"error":"estoque insuficiente: saldo atual 4, a movimentação deixaria o saldo negativo"} |
| 404 | O depósito não existe ou é de outro seller. | {"error":"warehouse not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |
Transferir estoque
Move unidades de um depósito para outro do mesmo seller de forma atômica: a saída na origem e a entrada no destino são gravadas na mesma transação, ligadas por uma referência comum. Se qualquer parte falhar, nada muda.
/api/v1/vendor/erp/inventory/transferSellerTransfere estoque entre depósitos
Corpo da requisição
product_iduuidobrigatóriofrom_warehouse_iduuidobrigatórioto_warehouse_iduuidobrigatórioquantityintegerobrigatórioreasonstringTransferência entre depósitos.referencestringTRF-<origem>-<destino>.Exemplo de requisição: Transferir estoque
curl -X POST "$BASE_URL/api/v1/vendor/erp/inventory/transfer" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"from_warehouse_id": "8204b8b8-e7e2-4b96-bba8-5a937fe001c8",
"to_warehouse_id": "5d0f2a77-0c3e-4b0f-8d9a-1e6b7c2a4f90",
"quantity": 5,
"reason": "Reabastecer loja"
}'Resposta: Transferir estoque
{
"out": {
"id": "593aca14-635f-4bd2-acc2-c10f99ddae51",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"warehouse_id": "8204b8b8-e7e2-4b96-bba8-5a937fe001c8",
"warehouse_name": "Depósito Central",
"type": "out",
"quantity": 5,
"reason": "Compra de reposição",
"reference": "TRF-origem-destino",
"created_by": "b00d3e7c-d5b4-4942-827a-06e2c43645af",
"created_at": "2026-10-11T14:30:00Z"
},
"in": {
"id": "f6921987-1a3a-40ac-a800-2038b3991981",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"warehouse_id": "5d0f2a77-0c3e-4b0f-8d9a-1e6b7c2a4f90",
"warehouse_name": "Loja Pinheiros",
"type": "in",
"quantity": 5,
"reason": "Compra de reposição",
"reference": "TRF-origem-destino",
"created_by": "b00d3e7c-d5b4-4942-827a-06e2c43645af",
"created_at": "2026-10-11T14:30:00Z"
}
}Campos da resposta
outobjectinobjectErros: Transferir estoque
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo não é um JSON válido. | {"error":"invalid request body","detail":"invalid character 'b' looking for beginning of object key string"} |
| 400 | product_id ausente. | {"error":"vendorerp: product_id required"} |
| 400 | Falta um dos dois depósitos. | {"error":"vendorerp: from_warehouse_id and to_warehouse_id required"} |
| 400 | Origem igual ao destino. | {"error":"vendorerp: from and to warehouses must differ"} |
| 400 | quantity menor ou igual a zero. | {"error":"vendorerp: quantity must be positive"} |
| 400 | A origem não tem saldo suficiente. | {"error":"insufficient stock at source warehouse"} |
| 404 | Um dos depósitos não existe ou é de outro seller. | {"error":"warehouse not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |