Pular para o conteúdo
API e webhooksv1
openapi.yaml
Menu da APIEstoque · Lançar entrada, saída ou ajuste de peças

Lançar entrada, saída ou ajuste de peças

POST https://api.precificador3d.com.br/v1/estoque/movimentos

Escopo: estoque:escrever (quem criou a chave precisa de estoque_produtos.movimentar). Sempre no local próprio: remessa e retorno de consignado só pela página do consignado. O saldo nunca fica negativo: saída maior que o saldo responde 422 saldo_insuficiente.

cURL

curl -X POST "https://api.precificador3d.com.br/v1/estoque/movimentos" \
  -H "Authorization: Bearer $PC3D_CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  --data '{
  "tipo": "saida",
  "variacao_id": "6b7c8d9e-0f1a-4b2c-3d4e-5f6a7b8c9d0e",
  "quantidade": 2,
  "motivo": "venda_loja",
  "observacao": "Pedido Loja Exemplo #88231"
}'

JavaScript

const resposta = await fetch('https://api.precificador3d.com.br/v1/estoque/movimentos', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.PC3D_CHAVE}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
  },
  body: JSON.stringify({
    "tipo": "saida",
    "variacao_id": "6b7c8d9e-0f1a-4b2c-3d4e-5f6a7b8c9d0e",
    "quantidade": 2,
    "motivo": "venda_loja",
    "observacao": "Pedido Loja Exemplo #88231"
  }),
});
if (!resposta.ok) {
  const erro = await resposta.json(); // application/problem+json
  throw new Error(`${erro.codigo}: ${erro.detail} (${erro.requisicao_id})`);
}
const dados = await resposta.json();

Python

import os
import uuid

import requests

resposta = requests.post(
    "https://api.precificador3d.com.br/v1/estoque/movimentos",
    headers={
        "Authorization": f"Bearer {os.environ['PC3D_CHAVE']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "tipo": "saida",
        "variacao_id": "6b7c8d9e-0f1a-4b2c-3d4e-5f6a7b8c9d0e",
        "quantidade": 2,
        "motivo": "venda_loja",
        "observacao": "Pedido Loja Exemplo #88231",
    },
    timeout=10,
)
resposta.raise_for_status()
dados = resposta.json()

Cabeçalhos

Idempotency-Keystringobrigatório
Chave única da operação, guardada por 24 h junto com o hash do corpo, o status e o id criado (sem corpo nem resposta). Repetir com o mesmo corpo devolve o mesmo status e o recurso relido pelo id. A mesma chave com outro corpo responde 422 idempotencia_conflito. (até 64 caracteres)

Corpo da requisição application/json

tipostringobrigatório
Valores: entrada, saida, ajuste.
variacao_idstring (uuid)obrigatório
parte_idstring (uuid)
quantidadeinteger
Obrigatória em entrada e saída. (de 1 a 99999)
contadointeger
Obrigatório em ajuste (saldo contado). (de 0 a 99999)
motivostringobrigatório
Valores: venda_loja, venda_marketplace, perda, devolucao, correcao, outro.
observacaostring
(até 200 caracteres)

Resposta 201

Movimento lançado.

Campos da resposta (9)
idstring (uuid)
tipostring
Valores: entrada, saida, ajuste.
variacao_idstring (uuid)
parte_idstring (uuid) | null
quantidadeinteger
saldo_antesinteger
saldo_depoisinteger
motivostring
criado_emstring (date-time)
201 Resposta
{
  "id": "8d9e0f1a-2b3c-4d4e-5f6a-7b8c9d0e1f2a",
  "tipo": "saida",
  "variacao_id": "6b7c8d9e-0f1a-4b2c-3d4e-5f6a7b8c9d0e",
  "parte_id": null,
  "quantidade": 2,
  "saldo_antes": 42,
  "saldo_depois": 40,
  "motivo": "venda_loja",
  "criado_em": "2026-10-03T14:02:11-03:00"
}

Outras respostas

  • 400 dados_invalidos: Dados, filtro, cursor ou cabeçalho inválido.
  • 401 nao_autenticado: Chave ausente, malformada, desconhecida, revogada ou expirada (a resposta é a mesma para todos os casos).
  • 403 escopo_insuficiente: Escopo insuficiente, conta bloqueada, módulo desligado ou chave suspensa.
  • 408 tempo_esgotado: O corpo do POST não chegou inteiro em 5 s.
  • 409 idempotencia_em_andamento: Requisição com a mesma Idempotency-Key ainda em andamento.
  • 413 corpo_grande_demais: Corpo acima de 64 KB.
  • 415 tipo_nao_suportado: Só `application/json`.
  • 422 saldo_insuficiente: Regra de negócio recusou (referência de outra conta ou inexistente, saldo insuficiente, quantidade fora do mínimo ou múltiplo) ou a Idempotency-Key já foi usada com outro corpo (`idempotencia_conflito`).
  • 429 limite_excedido: Limite de uso excedido (rajada, minuto, mês ou requisições simultâneas).
  • 500 erro_interno: Erro interno. O detalhe fica no log, ligado ao requisicao_id.
  • 503 indisponivel: API desligada, sob pressão (disjuntor aberto) ou no limite global da plataforma.

Esta página em Markdown · llms.txt