Início rápido
Da conta à primeira resposta
A API está disponível nos planos Profissional e Empresarial. O Token API fica preso ao Espaço ativo no momento da criação, age como a pessoa que gerou a chave e não acompanha uma troca posterior de Espaço na interface.
-
1
Confirme o Espaço
Entre na Lecodaro Cloud, selecione o Espaço correto e leia o plano, a franquia e as permissões em GET /context.
-
2
Abra Integração no menu
Dentro da plataforma, informe um nome claro para a integração e escolha somente leitura ou leitura e escrita. A mesma tela mostra o bloco MCP para agentes.
-
3
Copie o Token API
O valor completo aparece uma única vez. Guarde-o num gerenciador de credenciais do servidor que fará a integração.
-
4
Teste o contexto
Use GET /context para validar o Token API, o Espaço, a participação e o nível de acesso antes de chamar outro recurso.
curl https://cloud.lecodaro.com.br/api/v1/context \
-H"Authorization: Bearer SEU_TOKEN_API" \
-H"Accept: application/json"
Token API
Autenticação e acesso
Como enviar
Inclua o Token API em todas as chamadas HTTPS. Não o envie na URL, no corpo, em parâmetro de consulta ou em captura de tela.
Authorization: Bearer SEU_TOKEN_API
Como o acesso é decidido
O nível read permite consultas. write habilita alterações, mas a permissão real ainda depende do perfil da pessoa, do Espaço, do plano, das cotas e do estado de pagamento.
- Cada pessoa mantém no máximo 2 Tokens API ativos por Espaço.
- Remover a pessoa do Espaço corta o acesso do Token API na chamada seguinte.
- Tokens API não expiram automaticamente nesta versão. Revogue os que não estiverem mais em uso.
- Recurso de outro Espaço responde 404 para não confirmar que existe.
Console interativo
Teste a API nesta página
A chamada sai do seu navegador diretamente para https://cloud.lecodaro.com.br/api/v1. O Token API não é salvo pela página, não entra em cookie e desaparece quando a aba é fechada ou recarregada. Cada teste consome o limite real do seu Espaço.
Contrato HTTP
Como montar as requisições
Versão
Use sempre /api/v1. Campos novos podem entrar na v1, mas uma mudança incompatível exige outra versão.
Formato
Envie Accept: application/json. Escritas comuns usam Content-Type: application/json; uploads usam multipart/form-data.
Datas e dinheiro
Datas seguem ISO 8601 no horário de Brasília, com o deslocamento explícito (-03:00). Data enviada sem deslocamento é lida como horário de Brasília. Valores monetários são inteiros em centavos, nunca ponto flutuante.
Paginação
Coleções aceitam per_page. O padrão é 25; o máximo é 100. A resposta inclui links e metadados de página.
Limites e repetição
- A API existe nos planos Profissional e Empresarial. No Grátis e no Individual, toda chamada responde 403 com
api_not_in_plan. O Profissional tem 3.000 solicitações por semana ISO, no horário de Brasília, e ao esgotar responde 429 comweekly_api_quota_exceededeerror.resets_at. O Empresarial não tem franquia própria além dos limites técnicos. Download de arquivo também é solicitação Classe B do plano e responde 429 comrequest_quota_exceededno limite do mês. - As chamadas do Espaço compartilham limites por camada, somando todos os Tokens API. A leitura de
GET /contextmostradata.api.technical_limits,data.api.plan.api_requests_per_minutee a janela de franquia aplicável. - Ao receber 429, a IA deve parar a automação, respeitar
Retry-After,error.resets_atou a próxima janela informada emGET /context, e explicar ao cliente qual limite foi atingido. Idempotency-Keyevita contar a mesma tentativa duas vezes na franquia semanal quando a API aceitar idempotência, mas não garante que toda escrita seja executada uma única vez. Consulte o recurso antes de repetir uma criação.
Respostas e erros
O que a API devolve
Sucesso devolve o recurso em data. Coleções acrescentam paginação. Erros trazem message e podem incluir error.code ou errors por campo. Toda resposta recebe X-Request-Id.
| Código | Significado |
|---|---|
| 200 | Consulta ou alteração concluída. |
| 201 | Recurso criado. |
| 204 | Ação concluída sem corpo de resposta. |
| 401 | Token API ausente, inválido ou revogado. |
| 403 | Acesso, perfil, plano ou situação do Espaço não permite a operação. |
| 404 | Recurso não encontrado dentro do Espaço do Token API. |
| 409 | O estado atual do recurso impede a operação. |
| 422 | Um ou mais campos não passaram pela validação. |
| 429 | Limite por minuto, franquia semanal do Profissional ou limite mensal de downloads do plano excedidos. |
| 500 a 504 | Falha temporária do serviço. Guarde o X-Request-Id antes de procurar suporte. |
Sucesso
{"data": {"space": {"id": 123,"name":"Empresa exemplo"},"member": {"id": 456,"role":"owner"},"token": {"name":"Catálogo","abilities": ["read"]},"product_tree": {"levels": [{"id": 1,"position": 1,"name":"Marca"}, {"id": 2,"position": 2,"name":"Linha"}],"product_level":"Produto"},"brands": [{"id": 789,"name":"Marca exemplo"}]
}
}
Validação
{"message":"Os dados informados são inválidos.","errors": {"title": ["O campo título é obrigatório."]
}
}
Referência de payloads
Campos e regras por recurso
Os exemplos do console já carregam um corpo inicial para as principais escritas. Esta referência mostra os campos que mais afetam validação e comportamento.
Tags Organizam os recursos do Espaço. A API lista, cria, renomeia e remove tags sem vínculo.
| Campo | Tipo | Regra |
|---|---|---|
name | string | Obrigatório na criação e alteração. Até 40 caracteres. O nome é normalizado e não pode repetir o mesmo identificador no Espaço. |
per_page | integer | Opcional na listagem. Padrão 25, mínimo 1 e máximo 100. |
Links curtos Criam endereços controlados, com destino seguro, período de validade, proteção opcional e lixeira.
| Campo | Tipo | Regra |
|---|---|---|
title | string | Obrigatório. Até 120 caracteres. |
destination_url | URL | Obrigatório. HTTP ou HTTPS seguro, até 2.048 caracteres. |
context | enum | Obrigatório: product, campaign, packaging ou other. |
slug | string | Opcional. De 3 a 64 caracteres, letras minúsculas, números e hífen. |
tag_id ou tag_name | integer ou string | Associe uma tag existente ou crie uma pelo nome. |
password | string | Opcional, de 4 a 120 caracteres. Nunca aparece na resposta. |
clear_password | boolean | Somente na alteração. Envie true para remover a senha atual sem definir outra. |
starts_at e ends_at | datetime | Opcionais. ends_at não pode ser anterior a starts_at. |
internal_description | string | Opcional. Até 500 caracteres, visível apenas na operação. |
QR Codes Aceitam URL, texto, WhatsApp, Pix, Wi-Fi, vCard, Base64, arquivo, localização, e-mail e telefone.
| Campo | Tipo | Regra |
|---|---|---|
title | string | Obrigatório. Até 120 caracteres. |
mode | enum | dynamic ou static. O modo dinâmico permite atualizar o destino. |
type | enum | url, text, whatsapp, pix, wifi, vcard, base64, file, location, email ou phone. |
destination_url | URL | Obrigatório para type=url. HTTP ou HTTPS seguro, até 2.048 caracteres. |
text_content | string | Obrigatório para type=text estático. Até 1.200 caracteres. |
whatsapp_number e whatsapp_message | string | Número obrigatório para WhatsApp estático; mensagem opcional até 500 caracteres. |
pix_key, pix_merchant_name e pix_merchant_city | string | Obrigatórios para Pix estático. Nome até 25 e cidade até 15 caracteres. |
pix_amount e pix_txid | number e string | Opcionais no Pix. Valor de 0,01 a 999.999,99; txid alfanumérico até 25 caracteres. |
wifi_ssid, wifi_encryption e wifi_password | string | Wi-Fi estático exige SSID; segurança WPA, WEP ou nopass. Senha é obrigatória salvo em nopass. |
wifi_hidden | boolean | Opcional. Indica uma rede Wi-Fi oculta. |
vcard_full_name | string | Obrigatório para vCard estático, até 120 caracteres. Telefone, e-mail, organização, cargo e URL são opcionais. |
base64_content | string | Obrigatório para Base64 estático. Base64 válido, sem espaços, até 2.048 caracteres. |
file_upload | file | Arquivo exige mode=dynamic e multipart/form-data. PDF, JPG, JPEG, PNG, WebP, TXT ou CSV, até 5 MB. |
location_latitude e location_longitude | number | Obrigatórias para localização. Latitude entre -90 e 90; longitude entre -180 e 180. |
location_label | string | Nome opcional da localização, até 120 caracteres. |
email_address | Obrigatório para e-mail estático. Assunto até 120 e corpo até 500 caracteres são opcionais. | |
phone_number | string | Obrigatório para telefone estático, de 7 a 31 caracteres úteis e com DDI opcional. |
context | enum | product, campaign, packaging ou other. |
color_preset | enum | black, indigo, blue, green ou custom. |
module_shape | enum | square, rounded ou dot. |
eye_shape | enum | square, rounded ou circle. |
logo_upload | file | Opcional via multipart/form-data. JPG, PNG ou WebP, até 2 MB. |
download | path | svg, png, jpg ou pdf. A resposta binária não vem em JSON. |
Códigos de barras Validam o valor conforme o padrão e podem calcular o dígito verificador quando o formato permitir.
| Campo | Tipo | Regra |
|---|---|---|
type | enum | code128, gs1_128, datamatrix, pdf417, code39, ean13, ean8, upca, upce, itf14 ou codabar. |
value | string | Obrigatório. O formato escolhido determina caracteres, tamanho e dígito. |
auto_check_digit | boolean | Opcional. Solicita cálculo quando compatível. |
context | enum | product, campaign, packaging ou other. |
color_preset | enum | black, blue, green ou custom. |
preview | query | GET /barcodes/preview aceita type, value, auto_check_digit, color_preset e custom_color para retornar SVG sem gravar. |
bulk_values | string | POST /barcodes/bulk cria um código por linha. Planos fora do Empresarial criam até 5 por lote. |
bulk_file | file | Opcional no lote: CSV, TXT ou XLSX com até 1 MB. A API recusa fórmulas em XLSX. |
bulk_title_prefix | string | Obrigatório no lote. Serve de base para o título de cada código criado. |
print_width_mm e print_height_mm | number | Opcionais no download para definir o tamanho de impressão. |
Páginas de links Publicam categorias e itens na ordem enviada. Também geram um QR Code ou link curto da página.
| Campo | Tipo | Regra |
|---|---|---|
title e slug | string | Obrigatórios. Slug entre 3 e 64 caracteres. |
categories | array | De 1 a 20 categorias. Cada categoria recebe name e items. |
categories.*.items | array | De 1 a 20 itens com title, url e campos opcionais description, icon e is_active. |
context | enum | product, campaign, packaging, social ou other. |
color_preset | enum | indigo, emerald, rose ou custom. |
logo e banner | file | Opcionais via multipart/form-data. JPG, PNG ou WebP, até 10 MB cada. |
password | string | Opcional, de 4 a 120 caracteres. A resposta informa apenas password_enabled. |
Produtos e materiais Recebem materiais privados, passam por validação e antivírus e só ficam disponíveis depois do processamento.
| Campo | Tipo | Regra |
|---|---|---|
file | file | Envio simples por multipart/form-data. O limite é a cota do Espaço e a lista de formatos aceitos. |
formatos aceitos | extensions | Imagens: png, jpg, jpeg, webp, gif, bmp, tif, tiff, heic, heif, avif, svg e eps. Documentos/dados: pdf, txt, md, csv, json, xml, yaml, yml, html, htm, js, ts, py, java, php e css. Escritório: docx, xlsx, pptx, odt, ods e odp. |
formatos aceitos (continuação) | extensions | Mídia: mp4, webm, mov, mkv, avi, flv, mp3, wav, ogg, flac, aac e m4a. 3D/CAD: glb, gltf, obj, step, stp, stl, fbx, dxf, dwg, iges, igs, dcm e dicom. Design/fontes: psd, ai, xd, sketch, figma, ttf, otf, woff, woff2 e eot. Outros: exe, dmg, apk, msi, bat, sh, ps1 e com. |
tree_path | array | Onde o produto fica: um nome por nível da árvore do Espaço, na ordem de GET /product-tree. O que não existe é criado. Alternativa: product_tree_node_id, a pasta do último nível. |
brand_name, product_line_name, product_subline_name | string | Descontinuados: ocupam os níveis 1, 2 e 3 enquanto a árvore tem essa quantidade de níveis, e a resposta avisa. Use product_tree_node_id ou tree_path. |
product_name | string | Obrigatório. Até 160 caracteres. |
product_code | string | Opcional. Quando informado, identifica o produto por SKU dentro do Espaço. |
category_name | string | Obrigatório. Até 80 caracteres. |
product_family_code, product_model, product_description, internal_description | string | Opcionais. Completam o contexto do material dentro do catálogo do Espaço. |
ai_rename | boolean | Opcional. A renomeação por IA vem ligada; envie 0 para desligá-la neste envio. |
files, upload_method | multipart | Envio de vários arquivos avulsos em uma chamada: files aceita até 50. Pasta, caminho relativo e pacote compactado não são aceitos. |
uploads | flow | Para arquivos grandes: POST /files/uploads informa name, size, mime e contexto; a resposta traz id, part_size e direct_upload. |
parte direta | flow | Com direct_upload=true, peça a assinatura com part_number e checksum_sha256 Base64 de 44 caracteres; envie o byte range à URL temporária e confira o estado. |
parte intermediada | flow | Com direct_upload=false, envie chunk e part_number em multipart/form-data para /part, sempre na ordem indicada por next_part. |
complete/abort | flow | Conclua somente após todas as partes e tamanhos coincidirem. DELETE aborta a sessão pendente; ambos exigem o mesmo Token API. |
download | binary | Exige o mesmo Token API, conta o acesso e nunca revela caminho interno de armazenamento. |
status | query | GET /files/status recebe até 100 ids e devolve scan_status, preview_status, ready, retained e processing_status. |
document | binary | GET /files/{file}/document entrega bytes para visualização segura, exige permissão de download e não conta download. Arquivo em quarentena retorna 409. |
preview | binary ou JSON | POST /files/{file}/preview pede a geração; GET /files/{file}/preview entrega a prévia pronta. |
foto de pasta | multipart | POST /product-tree/nodes/{node}/photo recebe photo JPG, PNG ou WebP até 5 MB. GET aceita size=thumbnail. DELETE remove. /material-brands/{brand}/photo continua respondendo, descontinuado. |
Árvore de produtos Uma árvore por Espaço, com um a oito níveis nomeados antes de Produto. IDs informados sempre precisam pertencer ao mesmo Espaço.
| Campo | Tipo | Regra |
|---|---|---|
níveis | regra | GET /product-tree devolve os níveis na ordem. Produto é a folha fixa: não é renomeado, removido nem reposicionado, e só pasta do último nível recebe produto. |
parent_id | integer | Em POST /product-tree/nodes, a pasta de cima. Sem parent_id, a pasta nasce no primeiro nível. A pasta nova fica sempre no nível seguinte ao do pai. |
limite | regra | Até 10.000 pastas ativas por Espaço. Produto e pasta na lixeira não contam. |
navegação | query | GET /product-tree/nodes devolve uma página: filhas de parent_id, raízes sem parent_id, ou busca por q (dentro de parent_id quando informado). |
prévia | fluxo | Toda alteração estrutural começa em .../preview com operation. A resposta traz counts (pastas e produtos afetados), blockers, collisions e impact_token. A execução exige o impact_token; se a árvore mudou, a resposta é 409 com o impacto novo. |
pasta em uso | regra | DELETE recusa pasta com pasta ou produto, inclusive na lixeira. Mova o conteúdo por POST /product-tree/nodes/{node}/migrate com delete_source=true. |
dissolver nível | regra | DELETE /product-tree/levels/{level} sobe o conteúdo de cada pasta do nível para a pasta de cima e recusa quando nomes colidiriam. |
identificador | regra | Nível e pasta pelo id, que não muda ao renomear, mover ou reordenar. Toda alteração publica um evento product_tree.* com structure_version e contagens. |
Produtos e modelos Produto pende de uma pasta do último nível da árvore.
| Campo | Tipo | Regra |
|---|---|---|
tree_node_id | integer | Obrigatório no produto, ou tree_path com um nome por nível. Pasta de outro nível ou na lixeira responde 422. Mover produto de pasta pede materials.delete. brand_id e line_id continuam aceitos, descontinuados. |
family_code | string | Padrão de ficha, obrigatório no produto novo. O code do padrão e do campo não muda depois de criado. |
tree e completeness | resposta | tree traz node_id, level_id e path com level_id, node_id e name de cada nível. completeness traz percent, filled, total e missing_attribute_codes. |
values | JSON | attribute_code precisa estar no padrão do produto. locale só em campo is_localizable, channel só em campo is_scopable. |
code | string | Opcional. Único por Espaço quando preenchido. |
name | string | Obrigatório. Até 120 caracteres em linhas e modelos, 160 em produtos. |
status | enum | active ou archived em produtos e modelos. |
q e code | query | Busca opcional por nome ou SKU na listagem de produtos. |
bulk-values | JSON | PATCH /products/bulk-values recebe product_public_ids, attribute_code e value para até 100 produtos do Espaço. product_ids continua aceito como compatibilidade. |
bulk undo | path | POST /products/bulk-values/{batch}/undo desfaz o lote auditado e informa quantos valores voltaram. |
import mapping | array | POST /product-imports/dry-run aceita product.name, product.code, product.tree_node_id (pasta do último nível por id), tree.level_1 a tree.level_8 (uma coluna por nível), product.tree_path (nomes separados por >), product.family_code, product.model, product.status, product.description, identifier.<kind> e attribute.<code>. product.brand_name, product.line_name e product.subline_name continuam valendo, descontinuados, com aviso em warnings. Alvo desconhecido retorna 422. |
prévia da importação | JSON | Cada linha traz em preview o tree_node_id, o tree_path e o family_code que o commit vai usar. tree_node_id é nulo quando o caminho por nomes ainda vai criar pasta. |
eventos | query | GET /product-events sem types devolve os tipos que já existiam. Tipos de árvore, padrão, campos, posição e porcentagem se pedem pelo nome, por prefixo (product_tree.*) ou com *. Cada evento traz subject, origin e data. |
feed de canal | JSON | Cada produto traz tree e completeness_percent. mappings aceita product:tree_node_id, product:tree_path, product:family_code, product:completeness_percent e product:model. |
identidade na importação | regra | O SKU em product.code é a identidade: SKU existente atualiza, SKU novo cria. Dentro de uma pasta, nome e modelo são únicos; duas linhas com o mesmo par são recusadas e contadas em summary.name_collisions. Para variantes com o mesmo nome, preencha product.model. |
import status | JSON | GET /product-imports/{id} acompanha status, progresso, linhas e erros do dry-run ou commit dentro do Espaço do Token API. |
webhook de entrada | JSON | POST /product-inbound-webhooks devolve meta.url uma única vez. Outro sistema envia produtos nesse endereço, sem Token API, com um produto no corpo ou até 100 em products; com require_signature, cada envio leva X-Lecodaro-Signature com o HMAC SHA-256 do corpo. Use tree_node_id ou tree_path; marca e linha seguem gravando com aviso em warnings. |
Analytics Entrega somente agregados. Não expõe eventos individuais, IP, user-agent nem endereço de origem completo.
| Campo | Tipo | Regra |
|---|---|---|
period | enum | today, 7d, 30d, current_month, previous_month ou custom. |
start_date e end_date | date | Obrigatórios em custom. Intervalo máximo de 366 dias. |
module | enum | short_link, qr_code, link_page ou barcode. |
item | string | Formato tipo:id, por exemplo qr_code:123. |
tag_id, context e country | filters | País usa código de duas letras. |
device, browser, os e referrer | filters | Origem aceita domínio, __direct ou __other. |
Equipe e permissões Lista membros, cria convites, altera perfis e cancela acessos conforme a permissão da pessoa dona do Token API.
| Campo | Tipo | Regra |
|---|---|---|
profile ou role | enum | Perfil fixo ou personalizado disponível em GET /roles. O dono não pode ser rebaixado pela própria chave. |
email | Obrigatório no convite. Normalizado em minúsculas e recusado quando já pertence ao Espaço. | |
send_email | boolean | Opcional no convite. Quando false, a API devolve invitation_url para entrega pelo integrador autorizado. |
status | enum | Convites retornam pending, accepted, canceled ou expired. Convite cancelado não pode ser usado. |
permissions | array | GET /roles mostra as permissões efetivas para a IA saber se pode convidar, alterar, remover ou apenas ler. |
name | string | Obrigatório em POST /roles e opcional em PATCH /roles/{role}. De 2 a 80 caracteres, único no Espaço sem diferenciar maiúsculas. |
base_role | enum | Perfil fixo usado como base do perfil personalizado: admin, finance, creator ou viewer. Dono é recusado. |
permissions | object | Decisões explícitas do perfil personalizado. Chaves omitidas seguem o perfil-base; chaves desconhecidas são recusadas. |
Espaço, lixeira e histórico Rotas restritas para configuração pública do Espaço, itens apagados e histórico sanitizado da organização.
| Campo | Tipo | Regra |
|---|---|---|
GET /space/public-address | JSON | Mostra identificador atual, host utilizável, sugestões, limite de domínios e instruções dos domínios cadastrados para quem gerencia o Espaço. |
public_slug | string | PATCH /space/public-address/slug normaliza para letras e números, recusa reservado ou repetido e preserva alias anterior. |
host | domain | POST /space/public-address/domains cadastra domínio próprio quando o plano permite e devolve registros A e TXT para configuração. |
verify | action | POST /space/public-address/domains/{domain}/verify verifica apontamento e posse; se aprovado vira domínio principal. |
trash | JSON | GET /trash lista lixeira central de links curtos, QR Codes, códigos de barras, páginas, pastas da árvore, produtos e arquivos, com URLs de restauração e exclusão definitiva. |
audit-logs | query | GET /audit-logs aceita entity, action, search e per_page 10 ou 50. Destinos, cupons e descrições vêm ocultados. |
X-RateLimit-Limit | header | Mostra a janela mais curta que está valendo, o teto de rajada de 30 por segundo. As franquias por minuto são as de technical_limits em GET /context, e leitura e escrita têm franquias separadas. |
preço e estoque | fora de escopo | O módulo guarda o conteúdo do produto: ficha, materiais, identificadores e canais. Preço e estoque ficam no sistema de gestão da empresa, que é onde eles nascem e mudam. |
Contratos para agentes Endpoints de descoberta para MCP, SDKs e clientes HTTP gerados sem acesso ao código da Lecodaro.
| Campo | Tipo | Regra |
|---|---|---|
GET /context | JSON | Primeira chamada obrigatória. Retorna Espaço, token, plano, cotas, permissões, URLs de contrato, níveis da árvore e pastas do primeiro nível. |
GET /vocabularies | JSON | Enums, alvos do importador, eventos, papéis, limites estruturais e identificadores usados por cada recurso. |
GET /openapi.json | OpenAPI 3.1 | Contrato de métodos, caminhos, parâmetros, segurança e respostas padrão da API v1. |
GET /mcp | MCP manifest | Lista tools, resources, prompts, cacheScope, ttlMs, política de erro e transporte HTTPS REST com Bearer Token. Não executa JSON-RPC. |
Árvore e padrões de ficha
Migração para a árvore configurável
Desde 13/09/2026 cada Espaço organiza produtos numa árvore própria, de um a oito níveis, e todo produto tem padrão de ficha. A v1 continua valendo. Nível e pasta se identificam pelo id, padrão e campo pelo code, e produto pelo public_id. O nome aparece para leitura e nunca serve de chave.
O que continua
Marca, linha e sublinha seguem aceitas e são traduzidas para os três primeiros níveis da árvore. Nada da estrutura anterior deixa de responder antes de 13/03/2027.
Como a API avisa
Toda resposta que usa a estrutura anterior traz Deprecation, Sunset, Link e X-Lecodaro-Deprecated. GET /context lista em deprecations o que a chave e o Espaço ainda usam, e o OpenAPI marca deprecated: true.
Até quando
A partir de 13/03/2027 a estrutura anterior pode ser desligada. Antes disso, a equipe confere quem ainda usa. A lista completa, com o substituto de cada item, está em deprecations de GET /vocabularies.
| Antes | Agora |
|---|---|
GET /brands e /brands/{brand} | GET /product-tree/nodes (sem parent_id) e /product-tree/nodes/{node} |
POST, PATCH e DELETE /brands | POST /product-tree/nodes, PATCH /product-tree/nodes/{node} e DELETE /product-tree/nodes/{node}, com prévia e impact_token |
/product-lines e suas ações | /product-tree/nodes com parent_id; mover por /move, restaurar por /restore, excluir em definitivo por /permanent |
/material-brands/{brand}/photo | /product-tree/nodes/{node}/photo |
brand_id e line_id no corpo de /products | tree_node_id (pasta do último nível) ou tree_path (um nome por nível) |
brand_id, line_id, product_node_id e material_product_node_id em GET /products | tree_node_id, que desce na subárvore da pasta |
brand_name, product_line_name e product_subline_name em /files | product_tree_node_id ou tree_path |
product.brand_name, product.line_name e product.subline_name na importação | tree.level_1 a tree.level_8, ou product.tree_node_id |
brand_name, brand_id, line_name, line_id e subline_name no endereço de entrada | tree_node_id ou tree_path |
brand_id, line_id, subline_id e product_node_id na resposta do produto | tree.node_id e tree.path |
brand_name e product_line_name na resposta do arquivo | product_path |
Antes: criar produto por marca e linha
POST /products
{
"brand_id": 12,
"line_id": 45,
"name": "Aquecedor digital",
"code": "AQ-2026",
"family_code": "aquecedores"
}
Agora: pasta do último nível e padrão de ficha
GET /product-tree
GET /product-tree/nodes?q=Digital
POST /products
{
"tree_node_id": 45,
"name": "Aquecedor digital",
"code": "AQ-2026",
"family_code": "aquecedores"
}
Antes: onde o produto fica, na resposta
{
"brand_id": 12,
"line_id": 45,
"subline_id": null,
"completeness_percent": 50
}
Agora: caminho por id e ficha por código
{
"family_code": "aquecedores",
"tree": {
"node_id": 45,
"level_id": 2,
"path": [
{"level_id": 1, "node_id": 12, "name": "Marca Exemplo"},
{"level_id": 2, "node_id": 45, "name": "Digital"}
]
},
"completeness": {
"percent": 50,
"filled": 1,
"total": 2,
"missing_attribute_codes": ["potencia"]
}
}
Importação: coluna de pasta por id
"mapping": [
{"column": "SKU", "target": "product.code"},
{"column": "Produto", "target": "product.name"},
{"column": "Pasta", "target": "product.tree_node_id"}
]
rows[].preview: tree_node_id, tree_path e family_code
warnings[]: alvo da estrutura anterior no mapeamento
Resposta com aviso de estrutura anterior
Deprecation: @1789268400
Sunset: Sat, 13 Mar 2027 03:00:00 GMT
Link: <.../documentacao-api#migracao-arvore>; rel="deprecation"
X-Lecodaro-Deprecated: products.body.brand_id
"warnings": [{
"code": "deprecated",
"id": "inbound.brand_name",
"sunset_at": "2027-03-13T00:00:00-03:00"
}]
Eventos da árvore, dos padrões e da ficha
GET /product-events sem types devolve só os tipos que já existiam. Os novos se pedem pelo nome, por prefixo (types=product_tree.*) ou todos com types=*, e o webhook de saída assina cada tipo pelo nome. product.updated continua saindo junto. Mudança de estrutura é um evento por operação, com contagens: quando counts.products_affected for maior que zero, releia os produtos por GET /products?tree_node_id= ou ?family_code=. O evento nunca traz dado de pessoa nem id interno.
| Tipo | subject | O que vem em data |
|---|---|---|
product.moved | produto (public_id) | data.tree.from_node_id, to_node_id e path com level_id e node_id de cada nível |
product.family.changed | produto | data.family.from_code e to_code, e completeness_percent já recalculada |
product.values.changed | produto | data.attribute_codes que mudaram e family_code |
product.completeness.changed | produto | data.completeness com from_percent, percent, filled, total e missing_attribute_codes |
product_tree.level.created, renamed, removed e levels.reordered | nível (id) | data.level, levels na ordem nova, structure_version e counts |
product_tree.node.created, renamed, reordered, moved, migrated, deleted, restored e purged | pasta (id) | data.node com id, level_id, parent_id e path; destination na migração; structure_version e counts |
product_family.created, updated, attributes.changed e deleted | padrão de ficha (code) | campos por código, added_attribute_codes, removed_attribute_codes, requirement_changed_attribute_codes e counts.products_affected |
product_family.completeness.recalculated | padrão de ficha (code) | counts.products_recalculated e products_changed, com até 100 public_id que mudaram |
product_attribute.created, updated e deleted | campo (code) | tipo, unidade, opções, changed, options_added, options_removed e family_codes |
Corpo do evento, igual na listagem e no webhook assinado
{
"id": "981",
"sequence": 42,
"type": "product.moved",
"occurred_at": "2026-09-13T10:15:00-03:00",
"origin": "api",
"subject": {"type": "product", "id": "00000000-0000-4000-8000-000000000001"},
"product": {"public_id": "00000000-0000-4000-8000-000000000001", "code": "AQ-2026"},
"changed_fields": ["tree_node_id"],
"data": {
"tree": {
"from_node_id": 45,
"to_node_id": 51,
"path": [{"level_id": 1, "node_id": 12}, {"level_id": 2, "node_id": 51}]
}
}
}
Regras de uso dos campos e respostas de erro
| Resposta | Quando |
|---|---|
422 code | PATCH de campo ou padrão com outro code. O code é o identificador estável e não muda. |
422 type | Troca de tipo de campo que já tem valor gravado em produto. |
422 options | Opção de lista que algum produto usa saindo da lista. A mensagem diz em quantos produtos. |
422 is_localizable ou is_scopable | Desligar idioma ou canal de campo com valor gravado por idioma ou canal. |
422 values.N.locale ou values.N.channel | Valor com idioma em campo sem is_localizable, ou com canal em campo sem is_scopable. |
422 values.N.attribute_code | Campo que não está no padrão de ficha do produto. |
422 tree_node_id | Pasta que não é do último nível, que está na lixeira ou que é de outro Espaço. |
422 family_code | Produto novo sem padrão de ficha, ou código de padrão que não existe no Espaço. |
422 types | Tipo de evento que não existe em GET /vocabularies. |
403 permission_denied | O perfil da pessoa dona da chave não tem a permissão da mesma ação na tela. Mover produto de pasta pede materials.delete. |
409 | A árvore mudou entre a prévia e a execução. A resposta traz o impacto novo, e nada foi gravado. |
Permissões
- A chave herda o perfil da pessoa que a criou, e cada ação pede a mesma permissão da tela.
- Criar pasta:
materials.upload. Renomear, mover, migrar e excluir pasta ou nível, mover produto de pasta e criar ou alterar campo e padrão:materials.delete. - Editar produto, trocar padrão e preencher ficha:
products.values.edit. Importar:products.import. Webhooks e canais:products.publisheproducts.channels.update.
Limites
- De um a oito níveis e até 10.000 pastas ativas por Espaço.
- Até 120 campos por padrão de ficha e 200 opções por campo de lista.
- Até 100 eventos por página em
/product-events, 100 produtos por chamada no endereço de entrada e 100 produtos por ação em lote. - Um evento de recálculo por padrão, com até 100
public_idde exemplo.
Referência completa
Todos os endpoints
A lista é comparada automaticamente com as rotas registradas. Endpoint novo sem documentação e documentação de endpoint inexistente fazem o teste falhar.
Contexto
Confirma que o Token API funciona e mostra Espaço, plano, franquia, permissões e contratos legíveis por máquina. É a primeira chamada de qualquer integração.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/context |
read | Espaço, participação, acesso do Token API, plano, limites, níveis da árvore de produtos e pastas do primeiro nível. | |
GET |
/openapi.json |
read | Contrato OpenAPI 3.1 para ferramentas e SDKs. | |
GET |
/mcp |
read | Manifesto MCP para agentes descobrirem ferramentas, recursos e prompts da API. | |
POST |
/mcp |
read | Responde ao handshake JSON-RPC de um cliente MCP explicando que aqui se publica manifesto e a execução é REST. | |
GET |
/vocabularies |
read | Vocabulários estáveis de status, tipos, identificadores, alvos de importação, eventos e limites estruturais. |
Tags
Rótulos usados para organizar os demais módulos. Tag sem vínculo pode ser excluída; tag já aplicada é preservada.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/tags |
read | Lista as tags do Espaço. | |
POST |
/tags |
write | Cria uma tag. | |
PATCH |
/tags/{tag} |
write | Renomeia uma tag. | |
DELETE |
/tags/{tag} |
write | Exclui uma tag sem vínculos. |
Links curtos
Endereços curtos com destino editável, contagem de acessos e lixeira.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/short-links |
read | Lista os links curtos. | |
GET |
/short-links/{shortLink} |
read | Detalhe de um link curto. | |
POST |
/short-links |
write | Cria um link curto. | |
PATCH |
/short-links/{shortLink} |
write | Edita título, destino, contexto ou tag. | |
POST |
/short-links/{shortLink}/pause |
write | Pausa o link, que passa a não redirecionar. | |
POST |
/short-links/{shortLink}/activate |
write | Reativa um link pausado. | |
DELETE |
/short-links/{shortLink} |
write | Move para a lixeira. | |
POST |
/short-links/{shortLink}/restore |
write | Restaura da lixeira. | |
DELETE |
/short-links/{shortLink}/permanent |
write | Exclui definitivamente. Não há volta. |
QR Codes
QR Codes dinâmicos: o destino muda depois de impresso, sem gerar código novo.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/qr-codes |
read | Lista os QR Codes. | |
GET |
/qr-codes/{qrCode} |
read | Detalhe de um QR Code. | |
GET |
/qr-codes/{qrCode}/svg |
read | Imagem do QR Code em SVG. | |
GET |
/qr-codes/{qrCode}/download/{format} |
read | Baixa a imagem no formato pedido. | |
POST |
/qr-codes |
write | Cria um QR Code. | |
PATCH |
/qr-codes/{qrCode} |
write | Edita destino, cor, marca ou tag. | |
POST |
/qr-codes/{qrCode}/pause |
write | Pausa o QR Code. | |
POST |
/qr-codes/{qrCode}/activate |
write | Reativa um QR Code pausado. | |
DELETE |
/qr-codes/{qrCode} |
write | Move para a lixeira. | |
POST |
/qr-codes/{qrCode}/restore |
write | Restaura da lixeira. | |
DELETE |
/qr-codes/{qrCode}/permanent |
write | Exclui definitivamente. |
Códigos de barras
Códigos de barras dos produtos, com imagem pronta para arte e embalagem.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/barcodes |
read | Lista os códigos de barras. | |
GET |
/barcodes/{barcode} |
read | Detalhe de um código. | |
GET |
/barcodes/preview |
read | Pré-visualiza um código de barras antes de gravar. | |
GET |
/barcodes/{barcode}/svg |
read | Imagem do código em SVG. | |
GET |
/barcodes/{barcode}/download/{format} |
read | Baixa a imagem no formato pedido. | |
POST |
/barcodes |
write | Cria um código de barras. | |
POST |
/barcodes/bulk |
write | Cria um lote de códigos de barras respeitando o limite do plano. | |
PATCH |
/barcodes/{barcode} |
write | Edita os dados do código. | |
DELETE |
/barcodes/{barcode} |
write | Move para a lixeira. | |
POST |
/barcodes/{barcode}/restore |
write | Restaura da lixeira. | |
DELETE |
/barcodes/{barcode}/permanent |
write | Exclui definitivamente. |
Páginas de links
Páginas públicas com categorias e itens ordenados, e geração de QR Code ou link curto da própria página.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/link-pages |
read | Lista as páginas. | |
GET |
/link-pages/{linkPage} |
read | Detalhe da página com categorias e itens. | |
POST |
/link-pages |
write | Cria uma página com suas categorias e itens. | |
PATCH |
/link-pages/{linkPage} |
write | Edita a página e reordena categorias e itens. | |
POST |
/link-pages/{linkPage}/pause |
write | Tira a página do ar. | |
POST |
/link-pages/{linkPage}/activate |
write | Coloca a página no ar. | |
POST |
/link-pages/{linkPage}/qr-code |
write | Gera um QR Code da página. Exige também poder criar QR Code. | |
POST |
/link-pages/{linkPage}/short-link |
write | Gera um link curto da página. Exige também poder criar link curto. | |
DELETE |
/link-pages/{linkPage} |
write | Move para a lixeira. | |
POST |
/link-pages/{linkPage}/restore |
write | Restaura da lixeira. | |
DELETE |
/link-pages/{linkPage}/permanent |
write | Exclui definitivamente. |
Produtos e materiais
Materiais do produto. Arquivo grande sobe em partes, para que a conexão cair no meio não perca o envio inteiro.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/files |
read | Lista os arquivos. | |
GET |
/files/status |
read | Consulta status de varredura e prévia de até 100 arquivos. | |
GET |
/files/{file} |
read | Detalhe de um arquivo. | |
GET |
/files/{file}/download |
read | Baixa o arquivo e conta o download. | |
GET |
/files/{file}/document |
read | Entrega bytes seguros para visualização no navegador e exige permissão de download. | |
GET |
/files/{file}/preview |
read | Entrega a prévia gerada de um arquivo. | |
POST |
/files |
write | Envia um ou mais arquivos avulsos, em uma requisição. Pasta, caminho relativo e pacote compactado não são aceitos. | |
POST |
/files/{file}/preview |
write | Solicita geração de prévia e devolve o status atual. | |
POST |
/files/uploads |
write | Inicia um envio em partes e devolve o tamanho de cada parte. | |
GET |
/files/uploads/{upload} |
write | Retoma um envio e lista as partes já confirmadas. | |
POST |
/files/uploads/{upload}/parts/sign |
write | Assina por poucos minutos uma parte para envio direto ao R2. | |
POST |
/files/uploads/{upload}/part |
write | Envia uma parte, em ordem. | |
POST |
/files/uploads/{upload}/complete |
write | Fecha o envio. O conteúdo é verificado antes de virar arquivo. | |
DELETE |
/files/uploads/{upload} |
write | Aborta um envio em andamento. | |
PATCH |
/files/{file} |
write | Altera somente o nome lógico, preservando extensão e objeto. | |
DELETE |
/files/{file} |
write | Move para a lixeira. | |
POST |
/files/{file}/restore |
write | Restaura da lixeira. | |
DELETE |
/files/{file}/permanent |
write | Exclui definitivamente e libera a cota. | |
GET |
/material-brands/{brand}/photo |
read | Descontinuado: use GET /product-tree/nodes/{node}/photo. Entrega foto ou miniatura privada de uma pasta da árvore. | |
POST |
/material-brands/{brand}/photo |
write | Descontinuado: use POST /product-tree/nodes/{node}/photo. Envia ou troca a foto privada de uma pasta, consumindo cota do Espaço. | |
DELETE |
/material-brands/{brand}/photo |
write | Descontinuado: use DELETE /product-tree/nodes/{node}/photo. Remove a foto privada de uma pasta. |
Árvore de produtos
Árvore única e configurável do Espaço: de um a oito níveis nomeados antes do último, que recebe os produtos e vem com o nome Produtos. Nível e pasta se identificam pelo id, que não muda ao renomear, mover ou reordenar. Navegação sob demanda, uma página por vez. Toda alteração estrutural pede prévia, confirma com o impact_token dela e publica um evento product_tree.*.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/product-tree |
read | Níveis da árvore na ordem, o nível fixo Produto, limites e quantidade de pastas ativas. | |
GET |
/product-tree/nodes |
read | Uma página de pastas: filhas de parent_id (sem parent_id, as raízes), ou resultado de busca por q. Cada pasta traz nível, caminho e contagens. | |
GET |
/product-tree/nodes/{node} |
read | Detalha uma pasta, com caminho e contagens de pastas e produtos abaixo dela. | |
POST |
/product-tree/levels/preview |
write | Prévia de alteração de nível (add, rename, remove, reorder, rename_product): quantas pastas e produtos serão afetados, bloqueios, colisões e impact_token. | |
POST |
/product-tree/levels |
write | Insere um nível na posição. Grupos de pastas abaixo ganham uma pasta intermediária com filler_name. Exige impact_token. | |
PUT |
/product-tree/levels/order |
write | Reordena os níveis. Só nível sem pasta muda de posição. Exige impact_token. | |
PATCH |
/product-tree/levels/{level} |
write | Renomeia um nível. Exige impact_token. | |
PATCH |
/product-tree/product-level |
write | Renomeia o último nível, o que recebe os produtos. Ele não tem id porque não é nível configurável: continua último, não é removido e não recebe pasta. Exige impact_token. | |
DELETE |
/product-tree/levels/{level} |
write | Dissolve um nível: o conteúdo de cada pasta dele sobe para a pasta de cima. Recusa quando nomes colidiriam. Exige impact_token. | |
POST |
/product-tree/nodes |
write | Cria uma pasta sob parent_id, no nível seguinte ao dele. Pasta do último nível não recebe pasta, recebe produto. Limite de 10.000 pastas ativas. | |
POST |
/product-tree/nodes/{node}/preview |
write | Prévia de alteração de pasta (rename, move, delete, migrate, force_delete) com contagens, bloqueios, colisões e impact_token. | |
PATCH |
/product-tree/nodes/{node} |
write | Renomeia (com impact_token) ou muda a ordem entre irmãs (position). | |
POST |
/product-tree/nodes/{node}/move |
write | Move a pasta para outra pasta do nível de cima, com tudo o que há abaixo dela. Exige impact_token. | |
POST |
/product-tree/nodes/{node}/migrate |
write | Move todo o conteúdo da pasta para outra do mesmo nível e, com delete_source, envia a pasta vazia para a lixeira. Exige impact_token. | |
DELETE |
/product-tree/nodes/{node} |
write | Envia pasta vazia para a lixeira. Pasta com pasta ou produto, mesmo na lixeira, é recusada até o conteúdo ser migrado. Exige impact_token. | |
POST |
/product-tree/nodes/{node}/restore |
write | Restaura a pasta da lixeira, se a pasta de cima estiver ativa e houver vaga no limite. | |
DELETE |
/product-tree/nodes/{node}/permanent |
write | Exclui em definitivo pasta vazia que está na lixeira. Exige impact_token. | |
GET |
/product-tree/nodes/{node}/photo |
read | Entrega a foto privada da pasta, ou a miniatura com size=thumbnail. | |
POST |
/product-tree/nodes/{node}/photo |
write | Envia ou troca a foto privada da pasta (JPG, PNG ou WebP, até 5 MB), consumindo cota do Espaço. | |
DELETE |
/product-tree/nodes/{node}/photo |
write | Remove a foto privada da pasta. |
Marcas e linhas (v1, descontinuado)
Descontinuado desde 13/09/2026, com desligamento previsto a partir de 13/03/2027. Continua funcionando sobre a árvore configurável (marca é a pasta do primeiro nível, linha é pasta a partir do segundo) e toda resposta traz os cabeçalhos Deprecation, Sunset e Link. Integração nova usa /product-tree.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/brands |
read | Lista as pastas do primeiro nível da árvore. | |
GET |
/brands/{brand} |
read | Detalha uma pasta do primeiro nível. | |
POST |
/brands |
write | Cria uma pasta do primeiro nível. | |
PATCH |
/brands/{brand} |
write | Renomeia uma pasta do primeiro nível. | |
DELETE |
/brands/{brand} |
write | Envia pasta vazia do primeiro nível para a lixeira. Pasta em uso, ou cascade=true, recebe 409 com o impacto: mova o conteúdo antes por /product-tree/nodes/{node}/migrate. | |
GET |
/product-lines |
read | Lista pastas a partir do segundo nível. Use status=deleted para a lixeira e status=all para as duas. | |
GET |
/product-lines/{productLine} |
read | Detalha uma pasta a partir do segundo nível. | |
POST |
/product-lines |
write | Cria pasta sob a marca (parent_id vazio) ou sob outra pasta da marca. | |
PATCH |
/product-lines/{productLine} |
write | Renomeia ou move a pasta para outro pai do nível de cima, no mesmo Espaço. | |
DELETE |
/product-lines/{productLine} |
write | Envia pasta vazia para a lixeira. Pasta em uso recebe 409. | |
POST |
/product-lines/{productLine}/restore |
write | Restaura a pasta. | |
DELETE |
/product-lines/{productLine}/permanent |
write | Exclui em definitivo pasta vazia que está na lixeira. |
Produtos e modelos
PIM normalizado de produtos, identificadores, ficha técnica, eventos, importação, canais e materiais vinculados.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/product-attributes |
read | Lista os campos tipados do Espaço, pelo code, que é o identificador estável. | |
POST |
/product-attributes |
write | Cria um campo tipado. O code não muda depois de criado. | |
PATCH |
/product-attributes/{attribute} |
write | Atualiza um campo pelo code. Code não muda; tipo só muda sem valor gravado; opção em uso não sai da lista; is_localizable e is_scopable não desligam com valor por idioma ou canal. | |
DELETE |
/product-attributes/{attribute} |
write | Exclui um campo sem valor em produto. Os padrões que o usam perdem o campo junto. | |
GET |
/product-families |
read | Lista os padrões de ficha (famílias) com os campos, pelo code, que é o identificador estável. | |
POST |
/product-families |
write | Cria um padrão de ficha e define os campos. O code não muda depois de criado. | |
PATCH |
/product-families/{family} |
write | Atualiza nome, descrição e campos do padrão pelo code. Campo que sai do padrão não apaga valor; a porcentagem dos produtos é recalculada na fila. | |
DELETE |
/product-families/{family} |
write | Exclui um padrão de ficha sem produtos. | |
GET |
/product-schemas/families/{family} |
read | Detalha o contrato de atributos de uma família pelo código. | |
GET |
/product-schemas/channels/{channel} |
read | Detalha seleção, mapeamento e regra de prontidão de um canal. | |
GET |
/product-events |
read | Lista mudanças por cursor incremental. Sem types, só os tipos da v1; peça os tipos de árvore, padrão, campo, posição e porcentagem pelo nome, por prefixo (product_tree.*) ou com *. | |
POST |
/product-imports/dry-run |
write | Analisa CSV, TXT ou XLSX e mostra o impacto antes de gravar. | |
GET |
/product-imports/{importRun} |
read | Consulta status, progresso, erros e linhas de uma importação pelo id. | |
POST |
/product-imports/{importRun}/commit |
write | Enfileira a aplicação idempotente de uma importação analisada. | |
POST |
/product-imports/{importRun}/undo |
write | Desfaz uma importação aplicada pelo lote auditado. | |
GET |
/product-channels |
read | Lista canais de distribuição de produto. | |
POST |
/product-channels |
write | Cria canal com seleção, mapeamento, regra e token assinado opcional. | |
PATCH |
/product-channels/{channel} |
write | Atualiza canal pelo código. | |
DELETE |
/product-channels/{channel} |
write | Exclui um canal de distribuição. | |
GET |
/product-channels/{channel}/feed |
read | Entrega feed autenticado do canal, com ETag, pasta, padrão e porcentagem de cada produto. | |
GET |
/product-channels/{channel}/signed-feed |
signed-token | Entrega feed por URL assinada revogável do canal. | |
GET |
/product-webhooks |
read | Lista webhooks de produto sem revelar segredo. | |
POST |
/product-webhooks |
write | Cria webhook com assinatura HMAC. O segredo aparece só nesta resposta. | |
PATCH |
/product-webhooks/{webhook} |
write | Atualiza webhook ou gira o segredo. | |
DELETE |
/product-webhooks/{webhook} |
write | Remove webhook. | |
GET |
/product-inbound-webhooks |
read | Lista os endereços de entrada por onde outro sistema envia produtos. | |
POST |
/product-inbound-webhooks |
write | Cria um endereço de entrada e devolve a URL uma única vez. | |
PATCH |
/product-inbound-webhooks/{webhook} |
write | Renomeia, ativa, desativa ou rotaciona o endereço de entrada. | |
DELETE |
/product-inbound-webhooks/{webhook} |
write | Remove um endereço de entrada. | |
GET |
/products |
read | Lista produtos por nome, SKU, public_id, identificador técnico, pasta (tree_node_id), padrão (family_code) e situação da ficha (completeness). | |
GET |
/products/{product} |
read | Detalha um produto pelo public_id. | |
POST |
/products |
write | Cria um produto numa pasta do último nível (tree_node_id) com padrão de ficha (family_code). | |
POST |
/products/purge |
write | Esvazia o módulo Produtos do Espaço. Ensaia por padrão; só apaga com confirm e o inventory_hash do ensaio. | |
PATCH |
/products/{product} |
write | Atualiza dados e status do produto pelo public_id. | |
GET |
/products/{product}/values |
read | Lista valores da ficha técnica do produto pelo public_id. | |
PATCH |
/products/{product}/values |
write | Atualiza valores tipados da ficha técnica pelo public_id. | |
PATCH |
/products/bulk-values |
write | Aplica um valor de atributo a até 100 produtos no mesmo lote auditável. | |
POST |
/products/bulk-values/{batch}/undo |
write | Desfaz uma atualização em massa de ficha técnica pelo lote auditado. | |
DELETE |
/products/{product} |
write | Move o produto para a lixeira pelo public_id. | |
POST |
/products/{product}/restore |
write | Restaura o produto pelo public_id. | |
DELETE |
/products/{product}/permanent |
write | Exclui definitivamente pelo public_id um produto da lixeira, com os arquivos vinculados, liberando armazenamento. Idempotente: produto que já saiu devolve 204. | |
GET |
/products/{product}/files |
read | Lista materiais limpos vinculados ao produto pelo public_id. | |
GET |
/products/{product}/models |
read | Lista os modelos do produto pelo public_id. | |
POST |
/products/{product}/models |
write | Cria um modelo do produto pelo public_id. | |
PATCH |
/models/{model} |
write | Renomeia um modelo. | |
DELETE |
/models/{model} |
write | Move o modelo para a lixeira. | |
POST |
/models/{model}/restore |
write | Restaura o modelo. | |
DELETE |
/models/{model}/permanent |
write | Exclui definitivamente um modelo sem materiais. |
Analytics
Números agregados de uso. Nunca devolve evento individual, IP, navegador nem origem bruta.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/analytics/summary |
read | Totais, série diária, módulos, segmentos e rankings do período. |
Espaço, lixeira e histórico
Configura endereço público do Espaço, lista itens apagados e consulta histórico sanitizado. São endpoints restritos porque expõem operação da organização.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/space/public-address |
read | Mostra identificador público, host utilizável, sugestões, domínios e instruções de verificação para quem gerencia o Espaço. | |
PATCH |
/space/public-address/slug |
write | Define ou troca o identificador público do Espaço preservando alias anterior. | |
POST |
/space/public-address/domains |
write | Cadastra domínio próprio quando o plano permite e devolve os registros necessários. | |
POST |
/space/public-address/domains/{domain}/verify |
write | Executa verificação de apontamento e posse do domínio. | |
DELETE |
/space/public-address/domains/{domain} |
write | Remove domínio próprio do Espaço. | |
GET |
/trash |
read | Lista a lixeira do Espaço: links curtos, QR Codes, códigos de barras, páginas de links, produtos, linhas e arquivos. | |
POST |
/trash/empty |
write | Esvazia a lixeira do Espaço em definitivo. Exige confirm e roda em segundo plano: devolve 202 com purge_id para acompanhar. | |
GET |
/catalog-purges/{purge} |
read | Acompanha uma exclusão em segundo plano: status, mensagem operacional, totais, progresso e o que ficou preservado. | |
GET |
/audit-logs |
read | Lista histórico do Espaço com alterações sensíveis ocultadas. |
Equipe e permissões
Membros, convites e perfis do Espaço. A chave age como a pessoa que a criou, então convite, alteração e remoção obedecem ao mesmo perfil da interface.
| Método | Caminho | Acesso | Operação | Teste |
|---|---|---|---|---|
GET |
/members |
read | Lista usuários ativos do Espaço. | |
PATCH |
/members/{member} |
write | Altera o perfil de um membro permitido. | |
DELETE |
/members/{member} |
write | Remove um membro permitido do Espaço. | |
GET |
/invitations |
read | Lista convites do Espaço. | |
POST |
/invitations |
write | Cria convite de acesso e pode enviar o e-mail. Quando não sobra usuário pago, exige confirm_seat_charge=true. | |
DELETE |
/invitations/{invitation} |
write | Cancela convite pendente do Espaço. | |
GET |
/roles |
read | Lista perfis fixos e personalizados disponíveis para convite. | |
POST |
/roles |
write | Cria perfil personalizado do Espaço quando o plano permite. | |
PATCH |
/roles/{role} |
write | Atualiza nome, perfil-base e decisões de um perfil personalizado. | |
DELETE |
/roles/{role} |
write | Arquiva um perfil personalizado sem remover atribuições existentes. |
Agentes e MCP
Como outra IA deve operar
1. Ler contexto
Comece por GET /context. A resposta informa Espaço, pessoa dona da chave, habilidades, plano, cotas, permissões e URLs dos contratos.
2. Descobrir ferramentas
Use GET /vocabularies, GET /mcp e GET /openapi.json para mapear campos, ferramentas e payloads.
3. Respeitar limites
Antes de escritas em lote, confira data.api.quota. Em 403 ou 429, pare e devolva ao cliente o motivo e a data de liberação quando existir.
O contrato é estrito
Parâmetro de consulta ou campo de corpo que a documentação não declara recebe 422, com a lista do que foi recusado em errors.query ou errors.body. Filtro escrito errado avisa na hora, em vez de devolver a coleção inteira como se nada tivesse acontecido. O que está documentado é exatamente o que cada endpoint aceita.
Fluxo recomendado para catálogo
- Leia
GET /contexte confirme se a chave temwritee permissão de criação. - Consulte
GET /vocabularies,GET /mcpeGET /openapi.jsonpara montar as chamadas sem depender de acesso ao código da Lecodaro. - Confira os níveis em
GET /product-tree, crie ou encontre as pastas em/product-tree/nodese crie atributos e famílias com/product-attributese/product-families. Alteração estrutural pede prévia e confirma com oimpact_token. - Valide o lote por
POST /product-imports/dry-rune só confirme comPOST /product-imports/{id}/commitdepois de revisar erros e avisos. - Acompanhe o processamento por
GET /product-imports/{id}e as novidades porGET /product-events?cursor=0, ou configure/product-webhooksquando o cliente precisar receber eventos automaticamente.
Configuração mínima para outra IA
{
"base_url": "https://cloud.lecodaro.com.br/api/v1",
"authentication": "Authorization: Bearer SEU_TOKEN_API",
"first_call": "GET /context",
"discovery": ["GET /mcp", "GET /openapi.json"],
"quota_rule": "Se receber 429, pare e use Retry-After ou error.resets_at antes de tentar de novo."
}
Operação segura
Proteja a integração
- Guarde o Token API no servidor ou no gerenciador de credenciais da sua infraestrutura. Nunca o inclua em JavaScript entregue ao cliente, aplicativo distribuído, repositório ou log.
- Crie um Token API por integração e conceda somente o acesso necessário. Assim uma revogação não interrompe processos sem relação.
- Não envie Token API ao suporte. Informe horário, método, caminho sem dados privados, código HTTP e
X-Request-Id. - Revogue e substitua imediatamente diante de exposição, saída de fornecedor ou encerramento da integração.
Versão e mudanças
Contrato mantido junto do código
Estabilidade
A v1 fica no caminho da URL. Campo novo pode entrar sem trocar a versão; mudança incompatível exige nova versão.
Cobertura
A referência é gerada do catálogo de endpoints e comparada com as rotas reais nos testes automatizados.
Capacidades
Cada operação no OpenAPI publica x-capability-id, risco e política de repetição para revisão por agentes.