Referência

Stock e armazéns

Armazéns, saldos, lotes e movimentos. Uma venda baixa o stock sozinha; aqui está o que se faz por fora de uma venda: compras (entradas) e saídas manuais.

Armazéns, saldos, lotes e movimentos. Uma venda baixa o stock sozinha; aqui está o que se faz por fora de uma venda: compras (entradas) e saídas manuais.

OperaçãoO que faz
GET /api/estoque/armazensOs armazéns, cada um com o estabelecimento a que pertence.
GET /api/estoque/armazens/{id}Um armazém.
GET /api/estoque/saldosOs saldos de stock, por artigo, armazém e lote.
GET /api/estoque/saldos/baixo-estoqueOs artigos abaixo do stock mínimo definido no cadastro.
GET /api/estoque/saldos/por-produtosO saldo de vários artigos de uma vez, num armazém.
GET /api/estoque/saldos/historico/{produtoId}Os movimentos de stock de um artigo (entradas, saídas, transferências), do mais recente para o mais antigo, com o saldo depois de cada um.
GET /api/estoque/lotesOs lotes (com validade) de um ou de todos os artigos.
GET /api/estoque/lotes/{id}Um lote.
GET /api/estoque/entradasAs compras (entradas de stock) registadas.
GET /api/estoque/entradas/{id}Uma compra, com as linhas, os custos e os pagamentos.
POST /api/estoque/entradasRegista uma compra a um fornecedor: dá entrada no stock e cria a conta a pagar.
GET /api/estoque/saidas-manuaisAs saídas manuais de stock (quebras, ofertas, consumo interno).
GET /api/estoque/saidas-manuais/{id}Uma saída manual.
POST /api/estoque/saidas-manuaisRegista uma saída de stock que não é uma venda, com o motivo.
POST /api/estoque/armazensCria um armazém num estabelecimento.
PUT /api/estoque/armazens/{id}Altera um armazém.
POST /api/estoque/armazens/{id}/predefinirFaz deste armazém o predefinido do estabelecimento (o que as vendas usam quando não se indica outro).
DELETE /api/estoque/armazens/{id}Elimina um armazém.
POST /api/estoque/lotesCria um lote (descrição e validade).
PUT /api/estoque/lotes/{id}Altera um lote.
DELETE /api/estoque/lotes/{id}Elimina um lote.
POST /api/estoque/saldos/retirarRetira stock de um artigo, sempre o mais antigo primeiro (FIFO).
POST /api/estoque/entradas-manuaisDá entrada de stock sem fornecedor nem factura (stock inicial, ajuste positivo de inventário).
POST /api/estoque/entradas/{id}/anexoAnexa à entrada de stock a imagem ou o PDF do documento do fornecedor.
GET /api/estoque/entradas/{id}/anexoDescarrega o anexo de uma entrada de stock.
DELETE /api/estoque/entradas/{id}/anexoRemove o anexo de uma entrada de stock.
POST /api/estoque/transferenciasTransfere stock de um armazém para outro.
GET /api/estoque/transferencias/recentesAs transferências mais recentes.
GET /api/estoque/transferencias/produtosPesquisa de artigos com stock no armazém de origem, para preparar uma transferência.
GET /api/estoque/transferencias/disponibilidadeO stock disponível no armazém de origem para uma lista de artigos.
GET /api/estoque/transferencias/estoque-no-destinoO stock que uma lista de artigos já tem no armazém de destino.
GET /api/estoque/transferencias/pendentesAs transferências à espera de confirmação.
POST /api/estoque/transferencias/{id}/confirmarConfirma uma transferência: o stock passa para o destino.
POST /api/estoque/transferencias/{id}/rejeitarRejeita uma transferência (com um motivo, opcional): o stock fica na origem.
GET /api/estoque/transferencias/{id}Uma transferência de stock, com as linhas.
GET /api/estoque/transferenciasLista as transferências de stock.
POST /api/estoque/reservas-stockCria um pedido de reserva de stock a um cliente, por um prazo.
GET /api/estoque/reservas-stock/activosOs pedidos de reserva de stock activos.
GET /api/estoque/reservas-stock/activos/resumoOs totais de todas as reservas de stock activas.
GET /api/estoque/reservas-stock/cliente/{clienteId}As reservas de stock activas de um cliente.
GET /api/estoque/reservas-stock/historicoO histórico dos pedidos de reserva de stock.
GET /api/estoque/reservas-stock/produtosPesquisa de artigos para reservar, com o stock de um armazém.
GET /api/estoque/reservas-stock/disponibilidadeO stock disponível para reservar, de uma lista de artigos num armazém.
POST /api/estoque/reservas-stock/{id}/linhas/{linhaId}/confirmarConfirma uma linha de um pedido de reserva: o stock fica reservado.
POST /api/estoque/reservas-stock/{id}/prorrogarProrroga o prazo de um pedido de reserva de stock.
POST /api/estoque/reservas-stock/{id}/cancelarCancela um pedido de reserva de stock (com um motivo, opcional): o stock volta a ficar livre.
GET /api/estoque/reservas/disponibilidadeOnde um artigo tem stock disponível, em toda a empresa.
GET /api/estoque/reservasLista as reservas de stock entre estabelecimentos.
POST /api/estoque/reservasPede stock a outro estabelecimento (uma reserva entre estabelecimentos).
POST /api/estoque/reservas/{id}/confirmarO estabelecimento de origem confirma uma reserva de stock.
POST /api/estoque/reservas/{id}/recusarO estabelecimento de origem recusa uma reserva de stock (com um motivo, opcional).
GET /api/estoque/guias-transferenciaAs guias de transferência interna: o documento interno que acompanha cada transferência.
POST /api/estoque/guias-transferencia/{id}/confirmar-recepcaoConfirma a recepção da mercadoria de uma guia de transferência interna.
GET/api/estoque/armazens#

Os armazéns, cada um com o estabelecimento a que pertence.

  • Permissão Estoque.ArmazemLer

O id é o armazemId dos documentos que movimentam stock. Um documento só pode usar um armazém do seu estabelecimento.

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
filtrona pesquisatexto
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro
todasAsLojasna pesquisaverdadeiro/falso

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].descricaotextoA descrição.
itens[].localizacaotextoOnde fica o armazém.
itens[].predefinidoverdadeiro/falsoVerdadeiro no armazém por omissão do estabelecimento.
itens[].lojaIdidentificador (UUID)O estabelecimento.
itens[].lojaNometexto
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Exemplo

Os armazéns do estabelecimento

Pedido
curl 'https://<endereço-da-API>/api/estoque/armazens?tamanho=5' \
  -H 'X-Api-Key: assw_v1_<chave>'
Pedido
const resposta = await fetch('https://<endereço-da-API>/api/estoque/armazens?tamanho=5', {
  method: 'GET',
  headers: {
    "X-Api-Key": "assw_v1_<chave>"
  },
})
const dados = await resposta.json()
Pedido
import requests

resposta = requests.get(
    'https://<endereço-da-API>/api/estoque/armazens?tamanho=5',
    headers={
        'X-Api-Key': 'assw_v1_<chave>'
    },
)
dados = resposta.json()
Pedido
using var cliente = new HttpClient { BaseAddress = new Uri("https://<endereço-da-API>") };
using var pedido = new HttpRequestMessage(HttpMethod.Get, "/api/estoque/armazens?tamanho=5");
pedido.Headers.Add("X-Api-Key", "assw_v1_<chave>");
using var resposta = await cliente.SendAsync(pedido);
var texto = await resposta.Content.ReadAsStringAsync();

200 OK Resposta

Resposta
content-type: application/json; charset=utf-8
x-mucanda-api-version: 1

{
  "itens": [
    {
      "id": "01a12201-f4d4-7215-996c-6e230d2c67f6",
      "descricao": "Armazém Principal",
      "localizacao": "Loja de Viana",
      "predefinido": true,
      "lojaId": "01a12201-f4d4-7da7-a880-4239624940d5",
      "lojaNome": "Loja de Viana"
    },
    {
      "id": "01a12201-f4d4-78a0-8dde-1efc41b94776",
      "descricao": "Armazém Principal",
      "localizacao": "Loja Central",
      "predefinido": true,
      "lojaId": "01a12201-f4d4-7c07-86b7-e5b24035993e",
      "lojaNome": "Loja Central"
    },
    {
      "id": "01a12201-fc2b-7c7c-801f-ebf0cc7fbebc",
      "descricao": "Armazém de Reserva",
      "localizacao": "Loja Central — traseiras",
      "predefinido": false,
      "lojaId": "01a12201-f4d4-7c07-86b7-e5b24035993e",
      "lojaNome": "Loja Central"
    }
  ],
  "proximoCursor": null
}
GET/api/estoque/armazens/{id}#

Um armazém.

  • Permissão Estoque.ArmazemLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
ididentificador (UUID)Identificador único (UUID).
descricaotextoA descrição.
localizacaotextoOnde fica o armazém.
predefinidoverdadeiro/falsoVerdadeiro no armazém por omissão do estabelecimento.
lojaIdidentificador (UUID)O estabelecimento.
lojaNometexto

Erros específicos

NAO_ENCONTRADO — além dos gerais.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/armazens/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/saldos#

Os saldos de stock, por artigo, armazém e lote.

  • Permissão Estoque.ProdutosEmEstoqueLer

Filtre por armazemId, lojaId ou produtoId. diasParaVencer mostra só o que vence dentro desse número de dias (0 = o que já expirou).

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
armazemIdna pesquisaidentificador (UUID)
lojaIdna pesquisaidentificador (UUID)
produtoIdna pesquisaidentificador (UUID)
diasParaVencerna pesquisanúmero inteiro
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].produtoIdidentificador (UUID)O artigo.
itens[].produtoNometexto
itens[].codigoBarratexto ou nuloO código de barras.
itens[].precoCustonúmero ou nuloO custo do artigo.
itens[].precoUnitarionúmeroO preço de uma unidade, sem imposto.
itens[].armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
itens[].armazemDescricaotextoO nome do armazém.
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].loteDescricaotexto ou nuloO nome do lote.
itens[].loteValidadedata e hora (ISO 8601) ou nulo
itens[].quantidadenúmeroA quantidade.
itens[].valornúmeroO valor.
itens[].criadoEmUtcdata e hora (ISO 8601)Quando o evento aconteceu (UTC).
itens[].reservadonúmero
itens[].disponivelnúmero
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Exemplo

O stock de um artigo num armazém

Pedido
curl 'https://<endereço-da-API>/api/estoque/saldos?produtoId=01a12201-fa97-7f9b-8eec-2f731b91a53b&armazemId=01a12201-f4d4-78a0-8dde-1efc41b94776&tamanho=5' \
  -H 'X-Api-Key: assw_v1_<chave>'
Pedido
const resposta = await fetch('https://<endereço-da-API>/api/estoque/saldos?produtoId=01a12201-fa97-7f9b-8eec-2f731b91a53b&armazemId=01a12201-f4d4-78a0-8dde-1efc41b94776&tamanho=5', {
  method: 'GET',
  headers: {
    "X-Api-Key": "assw_v1_<chave>"
  },
})
const dados = await resposta.json()
Pedido
import requests

resposta = requests.get(
    'https://<endereço-da-API>/api/estoque/saldos?produtoId=01a12201-fa97-7f9b-8eec-2f731b91a53b&armazemId=01a12201-f4d4-78a0-8dde-1efc41b94776&tamanho=5',
    headers={
        'X-Api-Key': 'assw_v1_<chave>'
    },
)
dados = resposta.json()
Pedido
using var cliente = new HttpClient { BaseAddress = new Uri("https://<endereço-da-API>") };
using var pedido = new HttpRequestMessage(HttpMethod.Get, "/api/estoque/saldos?produtoId=01a12201-fa97-7f9b-8eec-2f731b91a53b&armazemId=01a12201-f4d4-78a0-8dde-1efc41b94776&tamanho=5");
pedido.Headers.Add("X-Api-Key", "assw_v1_<chave>");
using var resposta = await cliente.SendAsync(pedido);
var texto = await resposta.Content.ReadAsStringAsync();

200 OK Resposta

Resposta
content-type: application/json; charset=utf-8
x-mucanda-api-version: 1

{
  "itens": [
    {
      "id": "01a12201-fdea-7fb7-9b78-d253ceb46151",
      "produtoId": "01a12201-fa97-7f9b-8eec-2f731b91a53b",
      "produtoNome": "Arroz agulha 5 kg",
      "codigoBarra": "560000100137",
      "precoCusto": 5000,
      "precoUnitario": 6500,
      "armazemId": "01a12201-f4d4-78a0-8dde-1efc41b94776",
      "armazemDescricao": "Armazém Principal",
      "loteId": null,
      "loteDescricao": null,
      "loteValidade": null,
      "quantidade": 536,
      "valor": 2680000,
      "criadoEmUtc": "2026-10-09T18:51:57.89556Z",
      "reservado": 0,
      "disponivel": 536
    }
  ],
  "proximoCursor": null
}
GET/api/estoque/saldos/baixo-estoque#

Os artigos abaixo do stock mínimo definido no cadastro.

  • Permissão Estoque.ProdutosEmEstoqueLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
lojaIdna pesquisaidentificador (UUID)
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].produtoIdidentificador (UUID)O artigo.
itens[].produtoNometexto
itens[].codigoBarratexto ou nuloO código de barras.
itens[].precoCustonúmero ou nuloO custo do artigo.
itens[].precoUnitarionúmeroO preço de uma unidade, sem imposto.
itens[].lojaIdidentificador (UUID)O estabelecimento.
itens[].lojaNometexto
itens[].estoqueMinimonúmero
itens[].quantidadeTotalnúmero
itens[].valornúmeroO valor.
itens[].reservadonúmero
itens[].disponivelnúmero
itens[].paraVendaverdadeiro/falso
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/saldos/baixo-estoque' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/saldos/por-produtos#

O saldo de vários artigos de uma vez, num armazém.

  • Permissão Estoque.ProdutosEmEstoqueLer

Repita produtoIds na pesquisa (?armazemId=…&produtoIds=a&produtoIds=b). Útil para validar um carrinho antes de emitir.

Parâmetros

NomeOndeTipoObrigatório
armazemIdna pesquisaidentificador (UUID)sim
produtoIdsna pesquisalista de identificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
[].produtoIdidentificador (UUID)O artigo.
[].quantidadenúmeroA quantidade.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/saldos/por-produtos' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/saldos/historico/{produtoId}#

Os movimentos de stock de um artigo (entradas, saídas, transferências), do mais recente para o mais antigo, com o saldo depois de cada um.

  • Permissão Estoque.ProdutosEmEstoqueLer

Parâmetros

NomeOndeTipoObrigatório
produtoIdno caminhoidentificador (UUID)sim
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
[].datadata e hora (ISO 8601)A data e hora (UTC).
[].armazemDescricaotextoO nome do armazém.
[].loteDescricaotexto ou nuloO nome do lote.
[].tipotexto
[].quantidadenúmeroA quantidade.
[].saldoAposMovimentonúmeroO saldo depois deste movimento.
[].documentotexto ou nulo

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/saldos/historico/<produtoId>' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/lotes#

Os lotes (com validade) de um ou de todos os artigos.

  • Permissão Estoque.LotesLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
filtrona pesquisatexto
produtoIdna pesquisaidentificador (UUID)
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].descricaotextoA descrição.
itens[].validadedata e hora (ISO 8601) ou nuloA data de validade do lote.
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/lotes' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/lotes/{id}#

Um lote.

  • Permissão Estoque.LotesLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
ididentificador (UUID)Identificador único (UUID).
descricaotextoA descrição.
validadedata e hora (ISO 8601) ou nuloA data de validade do lote.

Erros específicos

NAO_ENCONTRADO — além dos gerais.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/lotes/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/entradas#

As compras (entradas de stock) registadas.

  • Permissão Estoque.EntradasLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
itens[].datadata e hora (ISO 8601)A data e hora (UTC).
itens[].facturatexto
itens[].tipoDocumentotexto
itens[].fornecedorNometexto
itens[].armazemDescricaotextoO nome do armazém.
itens[].totalnúmeroO total.
itens[].vencimentodata e hora (ISO 8601)O dia do vencimento.
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/entradas' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/entradas/{id}#

Uma compra, com as linhas, os custos e os pagamentos.

  • Permissão Estoque.EntradasLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
ididentificador (UUID)Identificador único (UUID).
numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
datadata e hora (ISO 8601)A data e hora (UTC).
facturatexto
tipoDocumentotexto
dataFacturadata e hora (ISO 8601)
fornecedorIdidentificador (UUID)
fornecedorNometexto
armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
armazemDescricaotextoO nome do armazém.
condicaoPagamentotexto
vencimentodata e hora (ISO 8601)O dia do vencimento.
observacaotexto ou nuloO texto livre.
custosAdicionaisnúmero
anexoNomeOriginaltexto ou nulo
anexoTipoConteudotexto ou nulo
anexoTamanhoBytesnúmero inteiro ou nulo
totalnúmeroO total.
moedaCodigotexto ou nulo
cambionúmero ou nulo
valorNaMoedanúmero ou nulo
itenslista de objectos
itens[].produtoIdidentificador (UUID)O artigo.
itens[].produtoNometexto
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].loteDescricaotexto ou nuloO nome do lote.
itens[].precoUnitarionúmeroO preço de uma unidade, sem imposto.
itens[].quantidadenúmeroA quantidade.
itens[].descontoPercentualnúmeroO desconto da linha, em percentagem (0 a 99).
itens[].impostoPercentualnúmeroA taxa de IVA aplicada, em percentagem.
itens[].precoTotalnúmeroPreço × quantidade, antes do desconto.
itens[].valorDescontonúmeroO valor do desconto.
itens[].subtotalnúmeroA soma das linhas, já com desconto e sem imposto.
itens[].valorImpostonúmeroO IVA.
itens[].valorPagarnúmeroO total da linha: subtotal + imposto − retenção.
pagamentoslista de objectos
pagamentos[].ididentificador (UUID)Identificador único (UUID).
pagamentos[].metodoPagamentoIdidentificador (UUID)O método de pagamento.
pagamentos[].metodoPagamentoDescricaotexto
pagamentos[].valornúmeroO valor.
pagamentos[].datadata e hora (ISO 8601)A data e hora (UTC).
totalPagonúmero
dividanúmero
identidadeobjecto ou nulo
identidade.empresaobjecto
identidade.empresa.nometextoO nome.
identidade.empresa.numeroContribuintetexto ou nuloO número de contribuinte (NIF).
identidade.empresa.enderecotexto ou nuloA morada.
identidade.empresa.telefonetexto ou nuloO telefone.
identidade.empresa.emailtextoO endereço de e-mail.
identidade.empresa.websitetexto ou nulo
identidade.empresa.temLogotipoverdadeiro/falso
identidade.empresa.informacaoFacturatexto ou nulo
identidade.empresa.contasBancariaslista de objectos
identidade.empresa.numeroCertificadoAgttexto ou nulo
identidade.empresaGestoraverdadeiro/falso
identidade.rodapeDaMarcaobjecto ou nulo
identidade.rodapeDaMarca.titulotexto
identidade.rodapeDaMarca.mensagemtexto
identidade.rodapeDaMarca.sitetexto
identidade.rodapeDaMarca.emailtextoO endereço de e-mail.
identidade.rodapeDaMarca.telefonetextoO telefone.
identidade.rodapeDaMarca.pilareslista de texto
identidade.rodapeDaMarca.comLogotipoverdadeiro/falso
identidade.mostraRodapeDoPlanoverdadeiro/falso

Erros específicos

NAO_ENCONTRADO — além dos gerais.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/entradas/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/entradas#

Regista uma compra a um fornecedor: dá entrada no stock e cria a conta a pagar.

  • Permissão Estoque.EntradaProdutos
  • Idempotência aceita Idempotency-Key

factura é o número da factura do fornecedor. Com tipoDocumento: "FacturaRecibo" a compra tem de vir paga por inteiro (valorPago e metodoPagamentoId); com "Factura" fica por pagar, com o vencimento da condicaoPagamento.

Cada linha leva precoUnitario, quantidade e impostoPercentual; um artigo com validade exige loteId.

atualizarPrecoCusto e atualizarPrecoVenda fazem a compra actualizar o custo e os preços do artigo.

Aceita Idempotency-Key.

Corpo do pedido (JSON · CreateEntradaEstoqueCommand)

CampoTipoObrigatórioSignificado
facturatextosim
tipoDocumentouma de: «FacturaRecibo», «Factura»sim
dataFacturadata e hora (ISO 8601)sim
fornecedorIdidentificador (UUID)sim
armazemIdidentificador (UUID)simO armazém de onde saiu (ou para onde voltou) o stock.
condicaoPagamentouma de: «ProntoPagamento», «Dias30», «Dias60», «Dias90», «Dias120»sim
observacaotexto ou nuloO texto livre.
itenslista de objectossim
itens[].produtoIdidentificador (UUID)simO artigo.
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].precoUnitarionúmerosimO preço de uma unidade, sem imposto.
itens[].quantidadenúmerosimA quantidade.
itens[].descontoPercentualnúmerosimO desconto da linha, em percentagem (0 a 99).
itens[].impostoPercentualnúmerosimA taxa de IVA aplicada, em percentagem.
valorPagonúmero
metodoPagamentoIdidentificador (UUID) ou nuloO método de pagamento.
atualizarPrecoCustoverdadeiro/falso
atualizarPrecoVendaverdadeiro/falso
custosAdicionaisnúmero
percentagemIvaDedutivelnúmero ou nulo
moedaCodigotexto ou nulo
cambionúmero ou nulo

Resposta

Devolve 201 com { "id": "…" }.

Erros específicos

REFERENCIA_NAO_ENCONTRADA · ERRO_DE_VALIDACAO · IDEMPOTENCIA_CONFLITO — além dos gerais.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/entradas' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "factura": "texto",
  "tipoDocumento": "FacturaRecibo",
  "dataFactura": "2026-10-12T09:00:00Z",
  "fornecedorId": "00000000-0000-0000-0000-000000000000",
  "armazemId": "00000000-0000-0000-0000-000000000000",
  "condicaoPagamento": "ProntoPagamento",
  "itens": [
    {
      "produtoId": "00000000-0000-0000-0000-000000000000",
      "precoUnitario": 0,
      "quantidade": 0,
      "descontoPercentual": 0,
      "impostoPercentual": 0
    }
  ]
}'
GET/api/estoque/saidas-manuais#

As saídas manuais de stock (quebras, ofertas, consumo interno).

  • Permissão Estoque.SaidasLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
dataIniciona pesquisadata e hora (ISO 8601)
dataFimna pesquisadata e hora (ISO 8601)
lojaIdna pesquisaidentificador (UUID)
nomeProdutona pesquisatexto
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
itens[].datadata e hora (ISO 8601)A data e hora (UTC).
itens[].produtoIdidentificador (UUID)O artigo.
itens[].produtoNometexto
itens[].armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
itens[].armazemDescricaotextoO nome do armazém.
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].loteDescricaotexto ou nuloO nome do lote.
itens[].quantidadenúmeroA quantidade.
itens[].motivotexto
itens[].identidadeobjecto ou nulo
itens[].identidade.empresaobjecto
itens[].identidade.empresaGestoraverdadeiro/falso
itens[].identidade.rodapeDaMarcaobjecto ou nulo
itens[].identidade.mostraRodapeDoPlanoverdadeiro/falso
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/saidas-manuais' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/saidas-manuais/{id}#

Uma saída manual.

  • Permissão Estoque.SaidasLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
ididentificador (UUID)Identificador único (UUID).
numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
datadata e hora (ISO 8601)A data e hora (UTC).
produtoIdidentificador (UUID)O artigo.
produtoNometexto
armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
armazemDescricaotextoO nome do armazém.
loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
loteDescricaotexto ou nuloO nome do lote.
quantidadenúmeroA quantidade.
motivotexto
identidadeobjecto ou nulo
identidade.empresaobjecto
identidade.empresa.nometextoO nome.
identidade.empresa.numeroContribuintetexto ou nuloO número de contribuinte (NIF).
identidade.empresa.enderecotexto ou nuloA morada.
identidade.empresa.telefonetexto ou nuloO telefone.
identidade.empresa.emailtextoO endereço de e-mail.
identidade.empresa.websitetexto ou nulo
identidade.empresa.temLogotipoverdadeiro/falso
identidade.empresa.informacaoFacturatexto ou nulo
identidade.empresa.contasBancariaslista de objectos
identidade.empresa.numeroCertificadoAgttexto ou nulo
identidade.empresaGestoraverdadeiro/falso
identidade.rodapeDaMarcaobjecto ou nulo
identidade.rodapeDaMarca.titulotexto
identidade.rodapeDaMarca.mensagemtexto
identidade.rodapeDaMarca.sitetexto
identidade.rodapeDaMarca.emailtextoO endereço de e-mail.
identidade.rodapeDaMarca.telefonetextoO telefone.
identidade.rodapeDaMarca.pilareslista de texto
identidade.rodapeDaMarca.comLogotipoverdadeiro/falso
identidade.mostraRodapeDoPlanoverdadeiro/falso

Erros específicos

NAO_ENCONTRADO — além dos gerais.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/saidas-manuais/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/saidas-manuais#

Regista uma saída de stock que não é uma venda, com o motivo.

  • Permissão Estoque.SaidaProdutos
  • Idempotência aceita Idempotency-Key

O motivo é obrigatório: fica no histórico do artigo. A quantidade não pode exceder o saldo (erro STOCK_INSUFICIENTE). Aceita Idempotency-Key.

Corpo do pedido (JSON · RegistarSaidaManualEstoqueCommand)

CampoTipoObrigatórioSignificado
produtoIdidentificador (UUID)simO artigo.
armazemIdidentificador (UUID)simO armazém de onde saiu (ou para onde voltou) o stock.
loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
quantidadenúmerosimA quantidade.
motivotextosim

Resposta

Devolve 201 com { "id": "…" }.

Erros específicos

STOCK_INSUFICIENTE · LOTE_EXPIRADO — além dos gerais.

Exemplo

Registar uma saída manual de stock (quebra, oferta, consumo interno)

Pedido
curl -X POST 'https://<endereço-da-API>/api/estoque/saidas-manuais' \
  -H 'Idempotency-Key: 90b47795-0678-4093-909f-de365a2371a0' \
  -H 'X-Api-Key: assw_v1_<chave>' \
  -H 'Content-Type: application/json' \
  -d '{
  "produtoId": "01a12201-fa97-7f9b-8eec-2f731b91a53b",
  "armazemId": "01a12201-f4d4-78a0-8dde-1efc41b94776",
  "loteId": null,
  "quantidade": 1,
  "motivo": "Embalagem danificada"
}'
Pedido
const resposta = await fetch('https://<endereço-da-API>/api/estoque/saidas-manuais', {
  method: 'POST',
  headers: {
    "Idempotency-Key": "90b47795-0678-4093-909f-de365a2371a0",
    "X-Api-Key": "assw_v1_<chave>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "produtoId": "01a12201-fa97-7f9b-8eec-2f731b91a53b",
    "armazemId": "01a12201-f4d4-78a0-8dde-1efc41b94776",
    "loteId": null,
    "quantidade": 1,
    "motivo": "Embalagem danificada"
  }),
})
const dados = await resposta.json()
Pedido
import requests

resposta = requests.post(
    'https://<endereço-da-API>/api/estoque/saidas-manuais',
    headers={
        'Idempotency-Key': '90b47795-0678-4093-909f-de365a2371a0',
        'X-Api-Key': 'assw_v1_<chave>',
        'Content-Type': 'application/json'
    },
    json={
        'produtoId': '01a12201-fa97-7f9b-8eec-2f731b91a53b',
        'armazemId': '01a12201-f4d4-78a0-8dde-1efc41b94776',
        'loteId': None,
        'quantidade': 1,
        'motivo': 'Embalagem danificada'
    },
)
dados = resposta.json()
Pedido
using var cliente = new HttpClient { BaseAddress = new Uri("https://<endereço-da-API>") };
using var pedido = new HttpRequestMessage(HttpMethod.Post, "/api/estoque/saidas-manuais");
pedido.Headers.Add("Idempotency-Key", "90b47795-0678-4093-909f-de365a2371a0");
pedido.Headers.Add("X-Api-Key", "assw_v1_<chave>");
pedido.Content = new StringContent("""
{
  "produtoId": "01a12201-fa97-7f9b-8eec-2f731b91a53b",
  "armazemId": "01a12201-f4d4-78a0-8dde-1efc41b94776",
  "loteId": null,
  "quantidade": 1,
  "motivo": "Embalagem danificada"
}
""", Encoding.UTF8, "application/json");
using var resposta = await cliente.SendAsync(pedido);
var texto = await resposta.Content.ReadAsStringAsync();

201 Created Resposta

Resposta
content-type: application/json; charset=utf-8
x-mucanda-api-version: 1
location: /api/estoque/saidas-manuais/01a12f69-9c62-7976-90b3-8f8e2d45911f

{
  "id": "01a12f69-9c62-7976-90b3-8f8e2d45911f"
}
POST/api/estoque/armazens#

Cria um armazém num estabelecimento.

  • Permissão Estoque.ArmazemEditar
  • Idempotência aceita Idempotency-Key

Devolve o id. Cada estabelecimento já nasce com um armazém principal.

Corpo do pedido (JSON · CreateArmazemCommand)

CampoTipoObrigatórioSignificado
descricaotextosimA descrição.
localizacaotextosimOnde fica o armazém.
lojaIdidentificador (UUID) ou nuloO estabelecimento.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/armazens' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "descricao": "texto",
  "localizacao": "texto"
}'
PUT/api/estoque/armazens/{id}#

Altera um armazém.

  • Permissão Estoque.ArmazemEditar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON · UpdateArmazemRequest)

CampoTipoObrigatórioSignificado
descricaotextosimA descrição.
localizacaotextosimOnde fica o armazém.

Pedido

curl
curl -X PUT 'https://<endereço-da-API>/api/estoque/armazens/<id>' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Content-Type: application/json' \
  -d '{
  "descricao": "texto",
  "localizacao": "texto"
}'
POST/api/estoque/armazens/{id}/predefinir#

Faz deste armazém o predefinido do estabelecimento (o que as vendas usam quando não se indica outro).

  • Permissão Estoque.ArmazemEditar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/armazens/<id>/predefinir' \
  -H 'X-Api-Key: <a-sua-chave>'
DELETE/api/estoque/armazens/{id}#

Elimina um armazém.

  • Permissão Estoque.ArmazemEditar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X DELETE 'https://<endereço-da-API>/api/estoque/armazens/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/lotes#

Cria um lote (descrição e validade).

  • Permissão Estoque.LotesEditar
  • Idempotência aceita Idempotency-Key

Devolve o id.

Corpo do pedido (JSON · CreateLoteCommand)

CampoTipoObrigatórioSignificado
descricaotextosimA descrição.
validadedata e hora (ISO 8601) ou nuloA data de validade do lote.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/lotes' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "descricao": "texto"
}'
PUT/api/estoque/lotes/{id}#

Altera um lote.

  • Permissão Estoque.LotesEditar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON · UpdateLoteRequest)

CampoTipoObrigatórioSignificado
descricaotextosimA descrição.
validadedata e hora (ISO 8601) ou nuloA data de validade do lote.

Pedido

curl
curl -X PUT 'https://<endereço-da-API>/api/estoque/lotes/<id>' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Content-Type: application/json' \
  -d '{
  "descricao": "texto"
}'
DELETE/api/estoque/lotes/{id}#

Elimina um lote.

  • Permissão Estoque.LotesEditar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X DELETE 'https://<endereço-da-API>/api/estoque/lotes/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/saldos/retirar#

Retira stock de um artigo, sempre o mais antigo primeiro (FIFO).

  • Permissão Estoque.SaidaProdutos
  • Idempotência aceita Idempotency-Key

É a saída única e reaproveitável do stock: consome o saldo mais antigo primeiro, por lote.

Corpo do pedido (JSON · RetirarEstoqueFifoCommand)

CampoTipoObrigatórioSignificado
produtoIdidentificador (UUID)simO artigo.
armazemIdidentificador (UUID)simO armazém de onde saiu (ou para onde voltou) o stock.
quantidadenúmerosimA quantidade.
documentotexto ou nulo

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/saldos/retirar' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "produtoId": "00000000-0000-0000-0000-000000000000",
  "armazemId": "00000000-0000-0000-0000-000000000000",
  "quantidade": 0
}'
POST/api/estoque/entradas-manuais#

Dá entrada de stock sem fornecedor nem factura (stock inicial, ajuste positivo de inventário).

  • Permissão Estoque.EntradaProdutos
  • Idempotência aceita Idempotency-Key

Envie Idempotency-Key: repetir o pedido não o executa duas vezes. Ver Idempotência.

O que entrou consulta-se pelo extracto real do artigo (GET /api/estoque/saldos/historico/{produtoId}).

Corpo do pedido (JSON · RegistarEntradaManualEstoqueCommand)

CampoTipoObrigatórioSignificado
produtoIdidentificador (UUID)simO artigo.
armazemIdidentificador (UUID) ou nuloO armazém de onde saiu (ou para onde voltou) o stock.
loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
quantidadenúmerosimA quantidade.
observacaotexto ou nuloO texto livre.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/entradas-manuais' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "produtoId": "00000000-0000-0000-0000-000000000000",
  "quantidade": 0
}'
POST/api/estoque/entradas/{id}/anexo#

Anexa à entrada de stock a imagem ou o PDF do documento do fornecedor.

  • Permissão Estoque.EntradaProdutos

O corpo é um formulário multipart/form-data com o campo ficheiro. Uma imagem grande é reduzida pelo servidor.

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/entradas/<id>/anexo' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/entradas/{id}/anexo#

Descarrega o anexo de uma entrada de stock.

  • Permissão Estoque.EntradasLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta

Devolve 200 com o ficheiro anexado.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/entradas/<id>/anexo' \
  -H 'X-Api-Key: <a-sua-chave>'
DELETE/api/estoque/entradas/{id}/anexo#

Remove o anexo de uma entrada de stock.

  • Permissão Estoque.EntradaProdutos

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X DELETE 'https://<endereço-da-API>/api/estoque/entradas/<id>/anexo' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/transferencias#

Transfere stock de um armazém para outro.

  • Permissão Estoque.Movimentar
  • Idempotência aceita Idempotency-Key

Pode ficar pendente de confirmação (ver as transferências pendentes). Devolve o id.

Corpo do pedido (JSON · CreateTransferenciaEstoqueCommand)

CampoTipoObrigatórioSignificado
armazemOrigemIdidentificador (UUID)sim
armazemDestinoIdidentificador (UUID)sim
autorizadoPortexto ou nulo
observacaotexto ou nuloO texto livre.
itenslista de objectossim
itens[].produtoIdidentificador (UUID)simO artigo.
itens[].quantidadenúmerosimA quantidade.
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/transferencias' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "armazemOrigemId": "00000000-0000-0000-0000-000000000000",
  "armazemDestinoId": "00000000-0000-0000-0000-000000000000",
  "itens": [
    {
      "produtoId": "00000000-0000-0000-0000-000000000000",
      "quantidade": 0
    }
  ]
}'
GET/api/estoque/transferencias/recentes#

As transferências mais recentes.

  • Permissão Estoque.TransferenciasLer

limite (por omissão 8).

Parâmetros

NomeOndeTipoObrigatório
limitena pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
[].datadata e hora (ISO 8601)A data e hora (UTC).
[].armazemOrigemDescricaotexto
[].armazemDestinoDescricaotexto
[].autorizadoPortexto
[].totalnúmeroO total.
[].lojaOrigemIdidentificador (UUID)
[].lojaOrigemNometexto
[].lojaDestinoIdidentificador (UUID)
[].lojaDestinoNometexto
[].estadotextoO estado actual.
[].numeroProdutosnúmero inteiro
[].dataResolucaodata e hora (ISO 8601) ou nulo
[].motivoRejeicaotexto ou nulo

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/recentes' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/transferencias/produtos#

Pesquisa de artigos com stock no armazém de origem, para preparar uma transferência.

  • Permissão Estoque.Movimentar

armazemOrigemId obrigatório; filtro e tamanho (por omissão 30).

Parâmetros

NomeOndeTipoObrigatório
armazemOrigemIdna pesquisaidentificador (UUID)sim
filtrona pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].codigoInternotexto ou nuloO código interno do artigo.
[].codigoBarratexto ou nuloO código de barras.
[].nometextoO nome.
[].unidadetexto ou nulo
[].controlarValidadeverdadeiro/falso
[].disponivelnúmero
[].usaLoteverdadeiro/falso

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/produtos' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/transferencias/disponibilidade#

O stock disponível no armazém de origem para uma lista de artigos.

  • Permissão Estoque.Movimentar

armazemOrigemId e produtoIds (repetido) obrigatórios.

Parâmetros

NomeOndeTipoObrigatório
armazemOrigemIdna pesquisaidentificador (UUID)sim
produtoIdsna pesquisalista de identificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
[].produtoIdidentificador (UUID)O artigo.
[].disponivelnúmero
[].loteslista de objectos
[].lotes[].loteIdidentificador (UUID)O lote, quando o artigo controla validade.
[].lotes[].descricaotextoA descrição.
[].lotes[].validadedata e hora (ISO 8601) ou nuloA data de validade do lote.
[].lotes[].disponivelnúmero

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/disponibilidade' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/transferencias/estoque-no-destino#

O stock que uma lista de artigos já tem no armazém de destino.

  • Permissão Estoque.Movimentar

armazemDestinoId e produtoIds (repetido) obrigatórios.

Parâmetros

NomeOndeTipoObrigatório
armazemDestinoIdna pesquisaidentificador (UUID)sim
produtoIdsna pesquisalista de identificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
[].produtoIdidentificador (UUID)O artigo.
[].quantidadenúmeroA quantidade.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/estoque-no-destino' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/transferencias/pendentes#

As transferências à espera de confirmação.

  • Permissão Estoque.TransferenciasLer

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
[].datadata e hora (ISO 8601)A data e hora (UTC).
[].armazemOrigemDescricaotexto
[].armazemDestinoDescricaotexto
[].autorizadoPortexto
[].totalnúmeroO total.
[].lojaOrigemIdidentificador (UUID)
[].lojaOrigemNometexto
[].lojaDestinoIdidentificador (UUID)
[].lojaDestinoNometexto
[].estadotextoO estado actual.
[].numeroProdutosnúmero inteiro
[].dataResolucaodata e hora (ISO 8601) ou nulo
[].motivoRejeicaotexto ou nulo

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/pendentes' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/transferencias/{id}/confirmar#

Confirma uma transferência: o stock passa para o destino.

  • Permissão Estoque.Movimentar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/transferencias/<id>/confirmar' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/transferencias/{id}/rejeitar#

Rejeita uma transferência (com um motivo, opcional): o stock fica na origem.

  • Permissão Estoque.Movimentar
  • Idempotência aceita Idempotency-Key

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON)

CampoTipoObrigatório
motivotexto ou nulo

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/transferencias/<id>/rejeitar' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{}'
GET/api/estoque/transferencias/{id}#

Uma transferência de stock, com as linhas.

  • Permissão Estoque.TransferenciasLer

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
ididentificador (UUID)Identificador único (UUID).
numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
datadata e hora (ISO 8601)A data e hora (UTC).
armazemOrigemIdidentificador (UUID)
armazemOrigemDescricaotexto
armazemDestinoIdidentificador (UUID)
armazemDestinoDescricaotexto
autorizadoPortexto
observacaotexto ou nuloO texto livre.
totalnúmeroO total.
lojaOrigemIdidentificador (UUID)
lojaOrigemNometexto
lojaDestinoIdidentificador (UUID)
lojaDestinoNometexto
estadotextoO estado actual.
dataResolucaodata e hora (ISO 8601) ou nulo
motivoRejeicaotexto ou nulo
itenslista de objectos
itens[].produtoIdidentificador (UUID)O artigo.
itens[].produtoNometexto
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].loteDescricaotexto ou nuloO nome do lote.
itens[].quantidadenúmeroA quantidade.
itens[].precoUnitarionúmeroO preço de uma unidade, sem imposto.
identidadeobjecto ou nulo
identidade.empresaobjecto
identidade.empresa.nometextoO nome.
identidade.empresa.numeroContribuintetexto ou nuloO número de contribuinte (NIF).
identidade.empresa.enderecotexto ou nuloA morada.
identidade.empresa.telefonetexto ou nuloO telefone.
identidade.empresa.emailtextoO endereço de e-mail.
identidade.empresa.websitetexto ou nulo
identidade.empresa.temLogotipoverdadeiro/falso
identidade.empresa.informacaoFacturatexto ou nulo
identidade.empresa.contasBancariaslista de objectos
identidade.empresa.numeroCertificadoAgttexto ou nulo
identidade.empresaGestoraverdadeiro/falso
identidade.rodapeDaMarcaobjecto ou nulo
identidade.rodapeDaMarca.titulotexto
identidade.rodapeDaMarca.mensagemtexto
identidade.rodapeDaMarca.sitetexto
identidade.rodapeDaMarca.emailtextoO endereço de e-mail.
identidade.rodapeDaMarca.telefonetextoO telefone.
identidade.rodapeDaMarca.pilareslista de texto
identidade.rodapeDaMarca.comLogotipoverdadeiro/falso
identidade.mostraRodapeDoPlanoverdadeiro/falso

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias/<id>' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/transferencias#

Lista as transferências de stock.

  • Permissão Estoque.TransferenciasLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
itens[].datadata e hora (ISO 8601)A data e hora (UTC).
itens[].armazemOrigemDescricaotexto
itens[].armazemDestinoDescricaotexto
itens[].autorizadoPortexto
itens[].totalnúmeroO total.
itens[].lojaOrigemIdidentificador (UUID)
itens[].lojaOrigemNometexto
itens[].lojaDestinoIdidentificador (UUID)
itens[].lojaDestinoNometexto
itens[].estadotextoO estado actual.
itens[].numeroProdutosnúmero inteiro
itens[].dataResolucaodata e hora (ISO 8601) ou nulo
itens[].motivoRejeicaotexto ou nulo
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/transferencias' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/reservas-stock#

Cria um pedido de reserva de stock a um cliente, por um prazo.

  • Permissão Estoque.ReservasClienteCriar
  • Idempotência aceita Idempotency-Key

Distinto das reservas entre estabelecimentos. Devolve o id.

Corpo do pedido (JSON · CriarPedidoReservaStockCommand)

CampoTipoObrigatórioSignificado
clienteIdidentificador (UUID)simO cliente do documento.
prazoMinutosnúmero inteiro ou nulo
expiraEmUtcdata e hora (ISO 8601) ou nulo
observacaotexto ou nuloO texto livre.
itenslista de objectossim
itens[].produtoIdidentificador (UUID)simO artigo.
itens[].armazemIdidentificador (UUID)simO armazém de onde saiu (ou para onde voltou) o stock.
itens[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].quantidadenúmerosimA quantidade.
lojaIdidentificador (UUID) ou nuloO estabelecimento.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas-stock' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "clienteId": "00000000-0000-0000-0000-000000000000",
  "itens": [
    {
      "produtoId": "00000000-0000-0000-0000-000000000000",
      "armazemId": "00000000-0000-0000-0000-000000000000",
      "quantidade": 0
    }
  ]
}'
GET/api/estoque/reservas-stock/activos#

Os pedidos de reserva de stock activos.

  • Permissão Estoque.ReservasClienteLer

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
itens[].clienteIdidentificador (UUID)O cliente do documento.
itens[].clienteNometextoO nome do cliente tal como estava na emissão.
itens[].criadoEmUtcdata e hora (ISO 8601)Quando o evento aconteceu (UTC).
itens[].expiraEmUtcdata e hora (ISO 8601)
itens[].observacaotexto ou nuloO texto livre.
itens[].linhaslista de objectos
itens[].linhas[].ididentificador (UUID)Identificador único (UUID).
itens[].linhas[].produtoIdidentificador (UUID)O artigo.
itens[].linhas[].produtoNometexto
itens[].linhas[].unidadetexto ou nulo
itens[].linhas[].armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
itens[].linhas[].armazemDescricaotextoO nome do armazém.
itens[].linhas[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].linhas[].loteDescricaotexto ou nuloO nome do lote.
itens[].linhas[].quantidadenúmeroA quantidade.
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/activos' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas-stock/activos/resumo#

Os totais de todas as reservas de stock activas.

  • Permissão Estoque.ReservasClienteLer

Resposta (200 · JSON)

CampoTipo
pedidosnúmero inteiro
reservasnúmero inteiro
aExpirarEmBrevenúmero inteiro

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/activos/resumo' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas-stock/cliente/{clienteId}#

As reservas de stock activas de um cliente.

  • Permissão Estoque.ReservasClienteLer

O ecrã de emissão mostra-as ao escolher o cliente, para a venda as cumprir.

A resposta é uma página: itens e proximoCursor. Ver Paginação.

Parâmetros

NomeOndeTipoObrigatório
clienteIdno caminhoidentificador (UUID)sim
cursorna pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
itenslista de objectosOs registos desta página.
itens[].ididentificador (UUID)Identificador único (UUID).
itens[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
itens[].clienteIdidentificador (UUID)O cliente do documento.
itens[].clienteNometextoO nome do cliente tal como estava na emissão.
itens[].criadoEmUtcdata e hora (ISO 8601)Quando o evento aconteceu (UTC).
itens[].expiraEmUtcdata e hora (ISO 8601)
itens[].observacaotexto ou nuloO texto livre.
itens[].linhaslista de objectos
itens[].linhas[].ididentificador (UUID)Identificador único (UUID).
itens[].linhas[].produtoIdidentificador (UUID)O artigo.
itens[].linhas[].produtoNometexto
itens[].linhas[].unidadetexto ou nulo
itens[].linhas[].armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
itens[].linhas[].armazemDescricaotextoO nome do armazém.
itens[].linhas[].loteIdidentificador (UUID) ou nuloO lote, quando o artigo controla validade.
itens[].linhas[].loteDescricaotexto ou nuloO nome do lote.
itens[].linhas[].quantidadenúmeroA quantidade.
proximoCursortexto ou nuloO cursor da página seguinte; nulo quando não há mais. Ver Paginação.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/cliente/<clienteId>' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas-stock/historico#

O histórico dos pedidos de reserva de stock.

  • Permissão Estoque.ReservasClienteLer

limite (por omissão 12).

Parâmetros

NomeOndeTipoObrigatório
limitena pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
[].linhaIdidentificador (UUID)
[].pedidoIdidentificador (UUID)
[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
[].clienteNometextoO nome do cliente tal como estava na emissão.
[].produtoNometexto
[].unidadetexto ou nulo
[].armazemDescricaotextoO nome do armazém.
[].loteDescricaotexto ou nuloO nome do lote.
[].quantidadenúmeroA quantidade.
[].criadoEmUtcdata e hora (ISO 8601)Quando o evento aconteceu (UTC).
[].estadotextoO estado actual.

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/historico' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas-stock/produtos#

Pesquisa de artigos para reservar, com o stock de um armazém.

  • Permissão Estoque.ReservasClienteCriar

armazemId obrigatório; filtro e tamanho (por omissão 30).

Parâmetros

NomeOndeTipoObrigatório
armazemIdna pesquisaidentificador (UUID)sim
filtrona pesquisatexto
tamanhona pesquisanúmero inteiro

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].codigoInternotexto ou nuloO código interno do artigo.
[].codigoBarratexto ou nuloO código de barras.
[].nometextoO nome.
[].unidadetexto ou nulo
[].controlarValidadeverdadeiro/falso
[].disponivelnúmero
[].usaLoteverdadeiro/falso

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/produtos' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas-stock/disponibilidade#

O stock disponível para reservar, de uma lista de artigos num armazém.

  • Permissão Estoque.ReservasClienteCriar

armazemId e produtoIds (repetido) obrigatórios.

Parâmetros

NomeOndeTipoObrigatório
armazemIdna pesquisaidentificador (UUID)sim
produtoIdsna pesquisalista de identificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
[].produtoIdidentificador (UUID)O artigo.
[].disponivelnúmero
[].loteslista de objectos
[].lotes[].loteIdidentificador (UUID)O lote, quando o artigo controla validade.
[].lotes[].descricaotextoA descrição.
[].lotes[].validadedata e hora (ISO 8601) ou nuloA data de validade do lote.
[].lotes[].disponivelnúmero

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas-stock/disponibilidade' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/reservas-stock/{id}/linhas/{linhaId}/confirmar#

Confirma uma linha de um pedido de reserva: o stock fica reservado.

  • Permissão Estoque.ReservasClienteGerir

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim
linhaIdno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas-stock/<id>/linhas/<linhaId>/confirmar' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/reservas-stock/{id}/prorrogar#

Prorroga o prazo de um pedido de reserva de stock.

  • Permissão Estoque.ReservasClienteGerir
  • Idempotência aceita Idempotency-Key

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON · ProrrogarReservaStockRequest)

CampoTipoObrigatório
prazoMinutosnúmero inteiro ou nulo
expiraEmUtcdata e hora (ISO 8601) ou nulo

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas-stock/<id>/prorrogar' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{}'
POST/api/estoque/reservas-stock/{id}/cancelar#

Cancela um pedido de reserva de stock (com um motivo, opcional): o stock volta a ficar livre.

  • Permissão Estoque.ReservasClienteGerir
  • Idempotência aceita Idempotency-Key

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON)

CampoTipoObrigatório
motivotexto ou nulo

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas-stock/<id>/cancelar' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{}'
GET/api/estoque/reservas/disponibilidade#

Onde um artigo tem stock disponível, em toda a empresa.

  • Permissão Estoque.ReservasLer

produtoId obrigatório. Serve para pedir stock a outro estabelecimento.

Parâmetros

NomeOndeTipoObrigatório
produtoIdna pesquisaidentificador (UUID)sim

Resposta (200 · JSON)

CampoTipoSignificado
[].lojaIdidentificador (UUID)O estabelecimento.
[].lojaNometexto
[].lojaCodigotexto
[].armazemIdidentificador (UUID)O armazém de onde saiu (ou para onde voltou) o stock.
[].armazemDescricaotextoO nome do armazém.
[].quantidadeDisponivelnúmero

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas/disponibilidade' \
  -H 'X-Api-Key: <a-sua-chave>'
GET/api/estoque/reservas#

Lista as reservas de stock entre estabelecimentos.

  • Permissão Estoque.ReservasLer

lojaId e estado filtram.

Parâmetros

NomeOndeTipoObrigatório
lojaIdna pesquisaidentificador (UUID)
estadona pesquisatexto

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].produtoIdidentificador (UUID)O artigo.
[].produtoNometexto
[].armazemOrigemIdidentificador (UUID)
[].armazemOrigemDescricaotexto
[].lojaOrigemIdidentificador (UUID)
[].lojaOrigemNometexto
[].armazemDestinoIdidentificador (UUID)
[].armazemDestinoDescricaotexto
[].lojaDestinoIdidentificador (UUID)
[].lojaDestinoNometexto
[].quantidadenúmeroA quantidade.
[].estadotextoO estado actual.
[].usuarioSolicitanteIdidentificador (UUID)
[].usuarioConfirmadorIdidentificador (UUID) ou nulo
[].criadaEmUtcdata e hora (ISO 8601)
[].expiraEmUtcdata e hora (ISO 8601)
[].resolvidaEmUtcdata e hora (ISO 8601) ou nulo
[].observacaotexto ou nuloO texto livre.
[].motivoRecusatexto ou nulo
[].transferenciaEstoqueIdidentificador (UUID) ou nulo
[].clienteIdidentificador (UUID) ou nuloO cliente do documento.
[].clienteNometexto ou nuloO nome do cliente tal como estava na emissão.
[].clienteTelefonetexto ou nulo

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/reservas' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/reservas#

Pede stock a outro estabelecimento (uma reserva entre estabelecimentos).

  • Permissão Estoque.ReservasCriar
  • Idempotência aceita Idempotency-Key

Precisa de confirmação do estabelecimento de origem. Devolve o id.

Corpo do pedido (JSON · SolicitarReservaEstoqueCommand)

CampoTipoObrigatórioSignificado
produtoIdidentificador (UUID)simO artigo.
armazemOrigemIdidentificador (UUID)sim
armazemDestinoIdidentificador (UUID)sim
quantidadenúmerosimA quantidade.
observacaotexto ou nuloO texto livre.
lojaDestinoIdidentificador (UUID) ou nulo
clienteIdidentificador (UUID) ou nuloO cliente do documento.

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{
  "produtoId": "00000000-0000-0000-0000-000000000000",
  "armazemOrigemId": "00000000-0000-0000-0000-000000000000",
  "armazemDestinoId": "00000000-0000-0000-0000-000000000000",
  "quantidade": 0
}'
POST/api/estoque/reservas/{id}/confirmar#

O estabelecimento de origem confirma uma reserva de stock.

  • Permissão Estoque.ReservasConfirmar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas/<id>/confirmar' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/reservas/{id}/recusar#

O estabelecimento de origem recusa uma reserva de stock (com um motivo, opcional).

  • Permissão Estoque.ReservasConfirmar
  • Idempotência aceita Idempotency-Key

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Corpo do pedido (JSON)

CampoTipoObrigatório
motivotexto ou nulo

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/reservas/<id>/recusar' \
  -H 'X-Api-Key: <a-sua-chave>' \
  -H 'Idempotency-Key: <um-GUID-novo>' \
  -H 'Content-Type: application/json' \
  -d '{}'
GET/api/estoque/guias-transferencia#

As guias de transferência interna: o documento interno que acompanha cada transferência.

  • Permissão Estoque.ReservasLer

Emitem-se sozinhas ao confirmar a transferência; não há um pedido para as criar. lojaId filtra.

Parâmetros

NomeOndeTipoObrigatório
lojaIdna pesquisaidentificador (UUID)

Resposta (200 · JSON)

CampoTipoSignificado
[].ididentificador (UUID)Identificador único (UUID).
[].produtoIdidentificador (UUID) ou nuloO artigo.
[].produtoNometexto ou nulo
[].quantidadenúmeroA quantidade.
[].lojaOrigemIdidentificador (UUID)
[].lojaOrigemNometexto
[].lojaDestinoIdidentificador (UUID)
[].lojaDestinoNometexto
[].numerotextoO número legível, atribuído pelo servidor («FR LC2026/25»).
[].datadata e hora (ISO 8601)A data e hora (UTC).
[].estadotextoO estado actual.
[].usuarioAutorizadorIdidentificador (UUID)
[].usuarioReceptorIdidentificador (UUID) ou nulo
[].dataRecepcaodata e hora (ISO 8601) ou nulo
[].hashtextoA assinatura digital do documento (em Base64).
[].hashControlotextoOs 4 caracteres da assinatura que se imprimem no documento.
[].transferenciaEstoqueIdidentificador (UUID)
[].reservaEstoqueIdidentificador (UUID) ou nulo

Pedido

curl
curl 'https://<endereço-da-API>/api/estoque/guias-transferencia' \
  -H 'X-Api-Key: <a-sua-chave>'
POST/api/estoque/guias-transferencia/{id}/confirmar-recepcao#

Confirma a recepção da mercadoria de uma guia de transferência interna.

  • Permissão Estoque.ReservasConfirmar

Parâmetros

NomeOndeTipoObrigatório
idno caminhoidentificador (UUID)sim

Pedido

curl
curl -X POST 'https://<endereço-da-API>/api/estoque/guias-transferencia/<id>/confirmar-recepcao' \
  -H 'X-Api-Key: <a-sua-chave>'