Pular para o conteúdo

Referência da API · versão 1.0.0

API do Prodio

Leia e grave os dados da sua fábrica a partir do sistema da sua empresa.

Endereço

  • https://api.prodio.com.br — Produção. Os caminhos já levam o /v1.

A API do Prodio deixa o sistema da sua empresa (ERP, loja, planilha automatizada, BI) ler e gravar os mesmos dados que você vê nas telas. O endereço é https://api.prodio.com.br/v1, as respostas são JSON UTF-8 em português e o acesso é por um token da empresa, criado em Configurações › API por um administrador.

Versão. A versão 1.0.0 deste documento acompanha a rota /v1. Mudança aditiva (campo novo, rota nova, valor novo num enum) não muda a versão da API: ignore os campos que não conhece. Quebra de compatibilidade vira /v2.

Autenticação. Cabeçalho Authorization: Bearer prodio_live_… (token de 55 caracteres). Token na URL é recusado com 400 token_na_url. Cada rota exige o escopo indicado em x-prodio-escopo (qualquer = qualquer token); :escrever inclui :ler do mesmo recurso. custos:ler libera os campos em reais; sem ele eles vêm null e o resto da resposta continua igual.

Limites. 120 chamadas por minuto por token e 300 por minuto por empresa, em janela fixa de 1 minuto. Acima disso 429 limite_excedido com Retry-After (segundos). Toda resposta autenticada traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset (instante Unix em segundos). Toda resposta traz X-Request-Id: cite-o ao pedir suporte.

Paginação e leitura incremental. Toda lista devolve { "dados": [ … ], "proximo_cursor": "…" }. limite padrão 50, máximo 200; ordem estável crescente por atualizado_em (ou criado_em nos movimentos) com desempate por id. Repita exatamente o proximo_cursor recebido no parâmetro cursor; null = acabou; cursor adulterado → 400 cursor_invalido. atualizado_desde e desde são inclusivos (a última linha da carga anterior volta: trate-a como atualização). Há uma janela de estabilização de 30 segundos: a lista só devolve linhas alteradas há mais de meio minuto, para uma gravação longa nunca ficar para trás. GET …/{id} não tem janela.

Datas e instantes. Datas AAAA-MM-DD. A API devolve instantes em UTC (2026-10-03T17:05:00+00:00). Nos filtros você pode enviar com qualquer fuso (-03:00, Z, frações de segundo); sem fuso → 400 parametro_invalido. Na query string, o sinal + de um fuso positivo tem de ir codificado como %2B (atualizado_desde=2026-10-01T05:30:00%2B02:00): + cru chega como espaço e a API recusa com 400.

Erros. Sempre JSON { "erro": { "codigo", "mensagem", "campo"?, "id_requisicao" } }, em português, com código estável em snake_case (esquema Erro). Além dos documentados em cada operação: 405 metodo_nao_permitido (com Allow), 413 corpo_grande_demais, 415 tipo_nao_suportado, 409 conflito/chave_idempotencia_reutilizada, 422 validacao, 500 erro_interno e 503 banco_indisponivel (repita com espera exponencial).

CORS fechado. A API é servidor-a-servidor: nenhuma resposta traz Access-Control-*; não a chame do navegador. Guarde o token num cofre de segredos, um token por sistema, e revogue em Configurações › API quando o sistema sair do ar. Quem criou o token deixou de ser admin da empresa → 403 token_sem_dono.

Dúvidas: Central de ajuda do Prodio.

Autenticação

Authorization: Bearer prodio_live_… (55 caracteres)

Token da empresa criado em Configurações › API. Só no cabeçalho Authorization; nunca na URL.

Primeiro teste

Com o token criado em Configurações › API, confirme o acesso pelo terminal:

curl -sS https://api.prodio.com.br/v1/eu -H "Authorization: Bearer prodio_live_SEU_TOKEN"

A resposta é a de GET /v1/eu.

Empresa e token

Quem sou eu — a empresa do token e o próprio token. Funciona com qualquer token.

GET /v1/eu

Empresa e token da chamada

Escopo: qualquer (qualquer token da empresa)

Use para confirmar que o token está certo e descobrir a empresa, o fuso, a hora de virada do dia de produção e os escopos do token.

Respostas

Locais

Locais de estoque (fábrica, terceiros, depósitos).

GET /v1/locais

Locais de estoque

Escopo: qualquer (qualquer token da empresa)

Todos os locais da empresa, ordenados por nome, no envelope de lista. Não há paginação aqui — proximo_cursor é sempre null.

Respostas

Produtos

Cadastro de produtos e kits, com custo da ficha.

GET /v1/produtos

Listar produtos

Escopo: produtos:ler

Produtos e kits da empresa, em ordem crescente de atualizado_em com desempate por id. Excluídos só com incluir_excluidos=true (vêm com excluido_em).

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
atualizado_desdequerytexto (date-time)Só linhas com atualizado_em a partir deste instante, inclusive. ISO 8601 com fuso (2026-10-01T00:00:00-03:00, 2026-10-01T03:00:00Z, frações de segundo aceitas); sem fuso, data impossível ou texto → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string (2026-10-01T05:30:00%2B02:00), senão ele chega como espaço.
skuquerytexto1 a 200 caracteresSKU exato (até 200 caracteres).
statusquerytexto: ativo · inativoSituação do produto.
familiaquerytexto1 a 200 caracteresFamília exata, como está no cadastro.
tipoquerytexto: produto · kitProduto simples ou kit.
incluir_excluidosquerybooleanopadrão falsetrue traz também os cadastros excluídos, com excluido_em preenchido, para o outro sistema apagar do lado dele. Excluir move o atualizado_em, então a exclusão aparece na leitura incremental.

Respostas

  • 200

    Página de produtos.

    Esquema: PaginaDeProdutos

    Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

    {
      "dados": [
        {
          "id": "0a7f1c2e-5d3b-4f8a-9e21-000000000101",
          "sku": "CAM-AZUL-M",
          "nome": "Camiseta básica azul M",
          "familia": "Camisetas",
          "atributos": {
            "cor": "Azul",
            "tamanho": "M"
          },
          "ean": "7891234567890",
          "ncm": "61091000",
          "status": "ativo",
          "tipo": "produto",
          "apelidos": [
            "CAMAZM-ML",
            "CAMAZM-SHOPEE"
          ],
          "tem_ficha": true,
          "peso_kg": 0.18,
          "peso_cubado_kg": 0.3,
          "largura_cm": 30,
          "altura_cm": 2,
          "comprimento_cm": 40,
          "ipi_pct": 0,
          "icms_pct": null,
          "importado": false,
          "variacao": {
            "grupo_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000100",
            "base": false,
            "eixos": [
              "cor",
              "tamanho"
            ]
          },
          "custo_ficha": 12.35,
          "custo_ficha_bruto": 13.1,
          "custo_manual": null,
          "criado_em": "2026-09-21T12:00:00+00:00",
          "atualizado_em": "2026-10-03T14:05:00+00:00",
          "excluido_em": null
        }
      ],
      "proximo_cursor": "eyJ1IjoiMjAyNi0xMC0wM1QxNDowNTowMC4wMDAwMDBaIiwiaSI6IjBhN2YxYzJlLTVkM2ItNGY4YS05ZTIxLTAwMDAwMDAwMDEwMSJ9"
    }
  • 400
  • 401
  • 403
  • 429

GET /v1/produtos/{id}

Obter um produto

Escopo: produtos:ler

O produto pelo id, inclusive excluído (com excluido_em). Id de outra empresa → 404, como id inexistente.

Parâmetros

NomeOndeTipoDescrição
idobrigatóriocaminhotexto (uuid)Id do registro (uuid). Id de outra empresa responde 404, igual a id inexistente.

Respostas

  • 200

    O produto.

    Esquema: Produto

    Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

    {
      "id": "0a7f1c2e-5d3b-4f8a-9e21-000000000101",
      "sku": "CAM-AZUL-M",
      "nome": "Camiseta básica azul M",
      "familia": "Camisetas",
      "atributos": {
        "cor": "Azul",
        "tamanho": "M"
      },
      "ean": "7891234567890",
      "ncm": "61091000",
      "status": "ativo",
      "tipo": "produto",
      "apelidos": [
        "CAMAZM-ML",
        "CAMAZM-SHOPEE"
      ],
      "tem_ficha": true,
      "peso_kg": 0.18,
      "peso_cubado_kg": 0.3,
      "largura_cm": 30,
      "altura_cm": 2,
      "comprimento_cm": 40,
      "ipi_pct": 0,
      "icms_pct": null,
      "importado": false,
      "variacao": {
        "grupo_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000100",
        "base": false,
        "eixos": [
          "cor",
          "tamanho"
        ]
      },
      "custo_ficha": 12.35,
      "custo_ficha_bruto": 13.1,
      "custo_manual": null,
      "criado_em": "2026-09-21T12:00:00+00:00",
      "atualizado_em": "2026-10-03T14:05:00+00:00",
      "excluido_em": null
    }
  • 400
  • 401
  • 403
  • 404
  • 429

Insumos

Cadastro de insumos (matéria-prima), com saldo e custo médio.

GET /v1/insumos

Listar insumos

Escopo: insumos:ler

Insumos da empresa, em ordem crescente de atualizado_em com desempate por id. saldo é a soma de todos os locais; por local use /v1/estoque/saldos.

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
atualizado_desdequerytexto (date-time)Só linhas com atualizado_em a partir deste instante, inclusive. ISO 8601 com fuso (2026-10-01T00:00:00-03:00, 2026-10-01T03:00:00Z, frações de segundo aceitas); sem fuso, data impossível ou texto → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string (2026-10-01T05:30:00%2B02:00), senão ele chega como espaço.
skuquerytexto1 a 200 caracteresSKU exato (até 200 caracteres).
ativoquerybooleanoSó ativos (true) ou só inativos (false).
familiaquerytexto1 a 200 caracteresFamília exata, como está no cadastro.
incluir_excluidosquerybooleanopadrão falsetrue traz também os cadastros excluídos, com excluido_em preenchido, para o outro sistema apagar do lado dele. Excluir move o atualizado_em, então a exclusão aparece na leitura incremental.

Respostas

GET /v1/insumos/{id}

Obter um insumo

Escopo: insumos:ler

O insumo pelo id, inclusive excluído (com excluido_em). Id de outra empresa → 404.

Parâmetros

NomeOndeTipoDescrição
idobrigatóriocaminhotexto (uuid)Id do registro (uuid). Id de outra empresa responde 404, igual a id inexistente.

Respostas

Fornecedores

Cadastro de fornecedores. O contato (pessoa) não é exposto.

GET /v1/fornecedores

Listar fornecedores

Escopo: fornecedores:ler

Fornecedores da empresa, em ordem crescente de atualizado_em com desempate por id. O contato (nome e telefone de pessoa) e o e-mail de XML não são expostos.

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
atualizado_desdequerytexto (date-time)Só linhas com atualizado_em a partir deste instante, inclusive. ISO 8601 com fuso (2026-10-01T00:00:00-03:00, 2026-10-01T03:00:00Z, frações de segundo aceitas); sem fuso, data impossível ou texto → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string (2026-10-01T05:30:00%2B02:00), senão ele chega como espaço.
ativoquerybooleanoSó ativos (true) ou só inativos (false).
cnpjquerytexto1 a 200 caracteresCNPJ exato. Pontuação é ignorada (11.222.333/0001-81 acha 11222333000181); só casa 14 dígitos. Fornecedor pessoa física (CPF, 11 dígitos) nunca é achado por aqui.
incluir_excluidosquerybooleanopadrão falsetrue traz também os cadastros excluídos, com excluido_em preenchido, para o outro sistema apagar do lado dele. Excluir move o atualizado_em, então a exclusão aparece na leitura incremental.

Respostas

GET /v1/fornecedores/{id}

Obter um fornecedor

Escopo: fornecedores:ler

O fornecedor pelo id, inclusive excluído (com excluido_em). Id de outra empresa → 404.

Parâmetros

NomeOndeTipoDescrição
idobrigatóriocaminhotexto (uuid)Id do registro (uuid). Id de outra empresa responde 404, igual a id inexistente.

Respostas

Fichas técnicas

Ficha técnica ativa de cada produto.

GET /v1/fichas

Listar fichas técnicas ativas

Escopo: fichas:ler

A ficha ativa de cada produto, em ordem crescente de atualizado_em (o instante em que a versão foi criada) com desempate pelo id da versão. Produto sem ficha ativa não aparece.

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
atualizado_desdequerytexto (date-time)Só linhas com atualizado_em a partir deste instante, inclusive. ISO 8601 com fuso (2026-10-01T00:00:00-03:00, 2026-10-01T03:00:00Z, frações de segundo aceitas); sem fuso, data impossível ou texto → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string (2026-10-01T05:30:00%2B02:00), senão ele chega como espaço.
produto_idquerytexto (uuid)Só a ficha deste produto.

Respostas

GET /v1/fichas/{produto_id}

Obter a ficha técnica de um produto

Escopo: fichas:ler

A ficha ativa do produto. Produto inexistente, de outra empresa ou sem ficha ativa → 404 nao_encontrado.

Parâmetros

NomeOndeTipoDescrição
produto_idobrigatóriocaminhotexto (uuid)Id do produto (uuid).

Respostas

Estoque

Saldos por local e o ledger de movimentos.

GET /v1/estoque/saldos

Listar saldos por local

Escopo: estoque:ler

Uma linha por insumo e local com saldo, em ordem crescente de atualizado_em com desempate por insumo e local (o cursor carrega os três).

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
atualizado_desdequerytexto (date-time)Só linhas com atualizado_em a partir deste instante, inclusive. ISO 8601 com fuso (2026-10-01T00:00:00-03:00, 2026-10-01T03:00:00Z, frações de segundo aceitas); sem fuso, data impossível ou texto → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string (2026-10-01T05:30:00%2B02:00), senão ele chega como espaço.
insumo_idquerytexto (uuid)Só este insumo.
local_idquerytexto (uuid)Só este local de estoque.

Respostas

GET /v1/estoque/movimentos

Listar movimentos de estoque

Escopo: estoque:ler

O ledger de movimentos, em ordem crescente de criado_em com desempate por id; a janela de 30 s vale sobre criado_em. quantidade é o delta (negativo nas saídas). Quem fez o movimento não é exposto.

Parâmetros

NomeOndeTipoDescrição
limitequeryinteiropadrão 50 · de 1 a 200Linhas por página. Padrão 50, máximo 200. Fora de 1..200 → 400 parametro_invalido.
cursorquerytextoformato ^[A-Za-z0-9_-]{1,400}$Página seguinte — repita exatamente o proximo_cursor recebido. Opaco (base64url); adulterado ou de outra lista → 400 cursor_invalido.
desdequerytexto (date-time)Só linhas com criado_em a partir deste instante, inclusive. ISO 8601 com fuso (-03:00, Z); sem fuso → 400 parametro_invalido. Fuso positivo: codifique o + como %2B na query string.
insumo_idquerytexto (uuid)Só este insumo.
local_idquerytexto (uuid)Só este local de estoque.
tipoquerytexto: entrada_nfe · entrada_manual · baixa_producao · ajuste · perda · estorno · saldo_inicialTipo do movimento.

Respostas

  • 200

    Página de movimentos.

    Esquema: PaginaDeMovimentos

    Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

    {
      "dados": [
        {
          "id": "0a7f1c2e-5d3b-4f8a-9e21-000000000501",
          "insumo_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000201",
          "local_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000010",
          "tipo": "entrada_nfe",
          "quantidade": 160,
          "unidade": "m",
          "custo_unitario": 30.78,
          "referencia": "NF 1234",
          "motivo": null,
          "origem": "nfe",
          "criado_em": "2026-10-02T18:20:05+00:00"
        },
        {
          "id": "0a7f1c2e-5d3b-4f8a-9e21-000000000502",
          "insumo_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000201",
          "local_id": "0a7f1c2e-5d3b-4f8a-9e21-000000000010",
          "tipo": "ajuste",
          "quantidade": -3.5,
          "unidade": "m",
          "custo_unitario": 31.2,
          "referencia": null,
          "motivo": "Diferença de contagem",
          "origem": "api",
          "criado_em": "2026-10-03T13:40:12+00:00"
        }
      ],
      "proximo_cursor": null
    }
  • 400
  • 401
  • 403
  • 429

Erros

Todo erro responde JSON no esquema Erro, com código estável e mensagem em português.

400ErroRequisicao

Requisição malformada: parametro_invalido (parâmetro desconhecido, repetido, vazio ou fora do formato; campo diz qual), cursor_invalido, token_na_url ou corpo_invalido (escritas). Os parâmetros são lidos depois de autenticar, então a chamada conta no limite e a resposta traz os X-RateLimit-*; só token_na_url (recusado antes do token) sai sem eles.

Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

{
  "erro": {
    "codigo": "parametro_invalido",
    "mensagem": "Parâmetro atualizado_desde inválido: instante ISO 8601 com fuso, como 2026-10-01T00:00:00-03:00.",
    "campo": "atualizado_desde",
    "id_requisicao": "8c1e0d2f-7a4b-4c6d-9e8f-000000000999"
  }
}

401NaoAutenticado

Sem token válido: token_ausente, token_invalido (fora do formato ou desconhecido), token_revogado ou token_vencido. Token revogado ou vencido é um token que o banco achou: a primeira recusa conta no limite dele e traz os X-RateLimit-*; repetir o mesmo token nos 60 s seguintes é recusado pelo cache do servidor, sem contar e sem os X-RateLimit-*. token_ausente e token_invalido saem sempre sem eles (nada para contar).

Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

{
  "erro": {
    "codigo": "token_ausente",
    "mensagem": "Informe o token no cabeçalho Authorization: Bearer.",
    "id_requisicao": "8c1e0d2f-7a4b-4c6d-9e8f-000000000999"
  }
}

403SemPermissao

Token reconhecido, mas sem direito: escopo_insuficiente (falta o escopo da rota), empresa_suspensa, token_sem_dono (quem criou o token deixou de ser admin da empresa) ou sem_permissao. A chamada conta no limite.

Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

{
  "erro": {
    "codigo": "escopo_insuficiente",
    "mensagem": "O token não tem o escopo necessário para esta rota.",
    "id_requisicao": "8c1e0d2f-7a4b-4c6d-9e8f-000000000999"
  }
}

404NaoEncontrado

nao_encontrado: id inexistente ou de outra empresa (a API não revela qual). rota_inexistente para caminho que não existe.

Cabeçalhos: X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

{
  "erro": {
    "codigo": "nao_encontrado",
    "mensagem": "Não encontrado.",
    "id_requisicao": "8c1e0d2f-7a4b-4c6d-9e8f-000000000999"
  }
}

429LimiteExcedido

limite_excedido: mais de 120 chamadas no minuto com este token ou mais de 300 com a empresa. Espere o Retry-After e repita.

Cabeçalhos: X-Request-Id · Retry-After · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset

{
  "erro": {
    "codigo": "limite_excedido",
    "mensagem": "Limite de chamadas por minuto excedido. Espere o Retry-After.",
    "id_requisicao": "8c1e0d2f-7a4b-4c6d-9e8f-000000000999"
  }
}

Cabeçalhos de resposta

CabeçalhoTipoDescrição
X-Request-Idtexto (uuid)Id desta requisição (uuid). Vem em toda resposta; cite-o ao pedir suporte.
X-RateLimit-LimitinteiroLimite de chamadas por minuto do token (120).
X-RateLimit-RemaininginteiroChamadas que ainda cabem nesta janela de 1 minuto.
X-RateLimit-ResetinteiroInstante Unix (segundos) em que a janela reinicia.
Retry-AfterinteiroSegundos a esperar antes de repetir a chamada.
Idempotency-Replayedtexto: truetrue quando a resposta é a repetição de uma escrita anterior com a mesma Idempotency-Key e o mesmo corpo (nada foi gravado de novo). Ausente nas demais respostas.

Esquemas

Chave em negrito vem sempre na resposta (ou é obrigatória no corpo); as demais podem faltar.

Erro

Envelope de todo erro da API. codigo é estável; mensagem é em português e pode mudar; campo aponta o parâmetro, cabeçalho ou chave do corpo recusado.

ChaveTipoDescrição
erroobjeto
erro.codigotexto: corpo_invalido · cursor_invalido · parametro_invalido · token_na_url · token_ausente · token_invalido · token_revogado · token_vencido · escopo_insuficiente · empresa_suspensa · token_sem_dono · sem_permissao · nao_encontrado · rota_inexistente · metodo_nao_permitido · conflito · chave_idempotencia_reutilizada · corpo_grande_demais · tipo_nao_suportado · validacao · limite_excedido · erro_interno · banco_indisponivel
erro.mensagemtexto
erro.campotextoParâmetro, cabeçalho ou chave do corpo (itens[2].qtd) a que o erro se refere.
erro.id_requisicaotexto (uuid)O mesmo valor do cabeçalho X-Request-Id.

Eu

A empresa do token e o próprio token (GET /v1/eu).

ChaveTipoDescrição
empresaobjeto
empresa.idtexto (uuid)
empresa.nometexto
empresa.cnpjtextoSó dígitos.
empresa.fusotextoFuso IANA da empresa (America/Sao_Paulo). As respostas da API vêm em UTC; este é o fuso para interpretar o dia de produção.
empresa.hora_viradatextoHora (HH:MM) em que vira o dia de produção, no fuso da empresa.
empresa.sku_prefixotextoPrefixo do SKU automático e das etiquetas.
tokenobjeto
token.prefixotextoOs 20 primeiros caracteres do token (prodio_live_ + 8), como aparecem em Configurações › API.
token.nometexto
token.escoposlista de texto
token.expira_emtexto | nulo (date-time)null = sem validade.
token.limite_por_minutointeiroChamadas por minuto deste token (120).
token.limite_empresa_por_minutointeiroChamadas por minuto somando todos os tokens da empresa (300).

Local

ChaveTipoDescrição
idtexto (uuid)
nometexto
tipotexto: fabrica · terceiro · deposito
ativobooleano

Produto

Produto ou kit. Percentuais como fração (0.05 = 5 %). Campos em reais exigem custos:ler. Toda chave vem sempre (com null quando não há valor).

ChaveTipoDescrição
idtexto (uuid)
skutextoLetras, números e hífen, até 40.
nometexto
familiatexto | nulo
atributosobjetoAtributos livres do cadastro (cor, tamanho…).
eantexto | nulo
ncmtexto | nulo8 dígitos.
statustexto: ativo · inativo
tipotexto: produto · kit
apelidoslista de textoSKUs externos (De-Para dos hubs), em ordem alfabética.
tem_fichabooleanoExiste uma versão ativa da ficha técnica.
peso_kgnúmero | nulo
peso_cubado_kgnúmero | nulo
largura_cmnúmero | nulo
altura_cmnúmero | nulo
comprimento_cmnúmero | nulo
ipi_pctnúmero | nuloFração (0.05 = 5 %).
icms_pctnúmero | nuloFração (0.05 = 5 %).
importadobooleano
variacaoobjeto | nulonull em produto sem grupo de variação. base: true no produto que encabeça o grupo (grupo_id igual ao próprio id).
variacao.grupo_idtexto (uuid)
variacao.basebooleano
variacao.eixoslista de texto
custo_fichanúmero | nuloCusto calculado pela ficha ativa, em reais, arredondado a 2 casas (a mesma conta da tela de fichas). Exige custos:ler; null também quando não há ficha.
custo_ficha_brutonúmero | nuloCusto da ficha com os impostos de entrada, em reais, 2 casas. Exige custos:ler.
custo_manualnúmero | nuloCusto informado à mão, em reais. Exige custos:ler.
criado_emtexto (date-time)
atualizado_emtexto (date-time)Base da leitura incremental.
excluido_emtexto | nulo (date-time)Preenchido quando o produto foi excluído.

Insumo

Insumo (matéria-prima). saldo soma todos os locais; por local use /v1/estoque/saldos. Toda chave vem sempre.

ChaveTipoDescrição
idtexto (uuid)
skutexto
nometexto
familiatexto | nulo
ativobooleano
unidade_compratextoUnidade em que se compra (kg, rolo…), das Unidades da empresa.
unidade_consumotextoUnidade em que a ficha consome (m, un…).
fator_conversaonúmeroQuantas unidades de consumo há em uma de compra.
ncmtexto | nulo
minimonúmero | nuloEstoque mínimo, em unidade de consumo.
lead_time_diasinteiro | nulo
fornecedor_padrao_idtexto | nulo (uuid)
saldonúmeroSoma dos saldos de todos os locais, em unidade de consumo. Sempre visível (não exige custos:ler).
custo_medionúmero | nuloCusto médio ponderado dos saldos, em reais por unidade de consumo. Exige custos:ler.
custo_medio_brutonúmero | nuloCusto médio com os impostos de entrada, em reais. Exige custos:ler.
custo_referencianúmero | nuloCusto de referência do cadastro (usado quando não há saldo), em reais. Exige custos:ler.
criado_emtexto (date-time)
atualizado_emtexto (date-time)
excluido_emtexto | nulo (date-time)

Fornecedor

Fornecedor. O contato (nome e telefone de pessoa) e o e-mail de XML não são expostos. Toda chave vem sempre.

ChaveTipoDescrição
idtexto (uuid)
nometexto
cnpjtexto | nuloCNPJ só dígitos (14). Fornecedor pessoa física (cadastrado com CPF, 11 dígitos) vem null: CPF é dado pessoal e não sai pela API.
regimetexto | nulo: simples · normalRegime tributário.
uftexto | nuloUF de origem esperada nas compras.
lead_time_diasinteiro | nulo
condicao_pagamentolista de inteiro | nuloDias das parcelas ([30, 60]).
ativobooleano
criado_emtexto (date-time)
atualizado_emtexto (date-time)
excluido_emtexto | nulo (date-time)

LinhaDaFicha

Uma linha da ficha. tipo: insumo traz insumo_id; tipo: produto (componente de kit ou semiacabado) traz componente_id.

ChaveTipoDescrição
idtexto (uuid)
tipotexto: insumo · produto
insumo_idtexto (uuid)Só quando tipo é insumo.
componente_idtexto (uuid)Id do produto componente; só quando tipo é produto.
consumonúmeroQuantidade consumida por unidade produzida, na unidade.
unidadetexto
perda_pctnúmeroPerda como fração (0.03 = 3 %).

Ficha

A ficha técnica ativa de um produto. atualizado_em é o instante em que esta versão foi criada.

ChaveTipoDescrição
produto_idtexto (uuid)
versaointeiro
ativabooleano
atualizado_emtexto (date-time)
linhaslista de LinhaDaFicha
custonúmero | nuloCusto da ficha, em reais (4 casas). Exige custos:ler.

Saldo

Saldo de um insumo em um local. unidade é a unidade de consumo do insumo.

ChaveTipoDescrição
insumo_idtexto (uuid)
local_idtexto (uuid)
saldonúmero
unidadetexto
custo_medionúmero | nuloCusto médio neste local, em reais por unidade. Exige custos:ler.
valornúmero | nulosaldo × custo_medio, em reais. Exige custos:ler.
atualizado_emtexto (date-time)

Movimento

Um movimento do ledger de estoque (append-only). quantidade é o delta — negativo nas saídas.

ChaveTipoDescrição
idtexto (uuid)
insumo_idtexto (uuid)
local_idtexto (uuid)
tipotexto: entrada_nfe · entrada_manual · baixa_producao · ajuste · perda · estorno · saldo_inicial
quantidadenúmeroDelta na unidade de consumo (negativo nas saídas).
unidadetexto
custo_unitarionúmero | nuloCusto unitário do movimento, em reais. Exige custos:ler.
referenciatexto | nuloDocumento de origem: NF 1234, OC 1042 ou o serial da etiqueta; null quando não há.
motivotexto | nulo
origemtexto: tela · api · producao · nfe · inventarioPor onde o movimento entrou.
criado_emtexto (date-time)Base da ordem e do filtro desde.

PaginaDeLocais

ChaveTipoDescrição
dadoslista de Local
proximo_cursortexto | nuloSempre null nesta rota.

PaginaDeProdutos

ChaveTipoDescrição
dadoslista de Produto
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.

PaginaDeInsumos

ChaveTipoDescrição
dadoslista de Insumo
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.

PaginaDeFornecedores

ChaveTipoDescrição
dadoslista de Fornecedor
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.

PaginaDeFichas

ChaveTipoDescrição
dadoslista de Ficha
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.

PaginaDeSaldos

ChaveTipoDescrição
dadoslista de Saldo
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.

PaginaDeMovimentos

ChaveTipoDescrição
dadoslista de Movimento
proximo_cursortexto | nuloCursor da página seguinte; null = acabou.