Pular para o conteúdo

Integração · API v1

Documentação da API

Crie seu Token API, faça a primeira chamada e consulte payloads, filtros, respostas e todos os endpoints. O console desta página executa chamadas reais na API de produção.

Endereço base

https://cloud.lecodaro.com.br/api/v1
Autenticação
Bearer Token
Formato
JSON UTF-8
Ritmo
Compartilhado pelo Espaço
Versão
v1 na URL
OpenAPI
3.1 por compatibilidade
Verificada
09/09/2026

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. 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. 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. 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. 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.

Primeira chamada com cURL
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.

Ambiente real: POST, PATCH e DELETE podem criar, alterar ou remover dados do Espaço. Comece por GET /context e use um Token API somente leitura até precisar testar escrita.

O console não repete automaticamente uma escrita. Confira o estado do recurso antes de reenviar após timeout.

Resposta

Aguardando teste
Escolha um endpoint e envie a chamada.

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 com weekly_api_quota_exceeded e error.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 com request_quota_exceeded no limite do mês.
  • As chamadas do Espaço compartilham limites por camada, somando todos os Tokens API. A leitura de GET /context mostra data.api.technical_limits, data.api.plan.api_requests_per_minute e a janela de franquia aplicável.
  • Ao receber 429, a IA deve parar a automação, respeitar Retry-After, error.resets_at ou a próxima janela informada em GET /context, e explicar ao cliente qual limite foi atingido.
  • Idempotency-Key evita 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ódigoSignificado
200Consulta ou alteração concluída.
201Recurso criado.
204Ação concluída sem corpo de resposta.
401Token API ausente, inválido ou revogado.
403Acesso, perfil, plano ou situação do Espaço não permite a operação.
404Recurso não encontrado dentro do Espaço do Token API.
409O estado atual do recurso impede a operação.
422Um ou mais campos não passaram pela validação.
429Limite por minuto, franquia semanal do Profissional ou limite mensal de downloads do plano excedidos.
500 a 504Falha 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.
CampoTipoRegra
namestringObrigató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_pageintegerOpcional 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.
CampoTipoRegra
titlestringObrigatório. Até 120 caracteres.
destination_urlURLObrigatório. HTTP ou HTTPS seguro, até 2.048 caracteres.
contextenumObrigatório: product, campaign, packaging ou other.
slugstringOpcional. De 3 a 64 caracteres, letras minúsculas, números e hífen.
tag_id ou tag_nameinteger ou stringAssocie uma tag existente ou crie uma pelo nome.
passwordstringOpcional, de 4 a 120 caracteres. Nunca aparece na resposta.
clear_passwordbooleanSomente na alteração. Envie true para remover a senha atual sem definir outra.
starts_at e ends_atdatetimeOpcionais. ends_at não pode ser anterior a starts_at.
internal_descriptionstringOpcional. 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.
CampoTipoRegra
titlestringObrigatório. Até 120 caracteres.
modeenumdynamic ou static. O modo dinâmico permite atualizar o destino.
typeenumurl, text, whatsapp, pix, wifi, vcard, base64, file, location, email ou phone.
destination_urlURLObrigatório para type=url. HTTP ou HTTPS seguro, até 2.048 caracteres.
text_contentstringObrigatório para type=text estático. Até 1.200 caracteres.
whatsapp_number e whatsapp_messagestringNúmero obrigatório para WhatsApp estático; mensagem opcional até 500 caracteres.
pix_key, pix_merchant_name e pix_merchant_citystringObrigatórios para Pix estático. Nome até 25 e cidade até 15 caracteres.
pix_amount e pix_txidnumber e stringOpcionais no Pix. Valor de 0,01 a 999.999,99; txid alfanumérico até 25 caracteres.
wifi_ssid, wifi_encryption e wifi_passwordstringWi-Fi estático exige SSID; segurança WPA, WEP ou nopass. Senha é obrigatória salvo em nopass.
wifi_hiddenbooleanOpcional. Indica uma rede Wi-Fi oculta.
vcard_full_namestringObrigatório para vCard estático, até 120 caracteres. Telefone, e-mail, organização, cargo e URL são opcionais.
base64_contentstringObrigatório para Base64 estático. Base64 válido, sem espaços, até 2.048 caracteres.
file_uploadfileArquivo exige mode=dynamic e multipart/form-data. PDF, JPG, JPEG, PNG, WebP, TXT ou CSV, até 5 MB.
location_latitude e location_longitudenumberObrigatórias para localização. Latitude entre -90 e 90; longitude entre -180 e 180.
location_labelstringNome opcional da localização, até 120 caracteres.
email_addressemailObrigatório para e-mail estático. Assunto até 120 e corpo até 500 caracteres são opcionais.
phone_numberstringObrigatório para telefone estático, de 7 a 31 caracteres úteis e com DDI opcional.
contextenumproduct, campaign, packaging ou other.
color_presetenumblack, indigo, blue, green ou custom.
module_shapeenumsquare, rounded ou dot.
eye_shapeenumsquare, rounded ou circle.
logo_uploadfileOpcional via multipart/form-data. JPG, PNG ou WebP, até 2 MB.
downloadpathsvg, 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.
CampoTipoRegra
typeenumcode128, gs1_128, datamatrix, pdf417, code39, ean13, ean8, upca, upce, itf14 ou codabar.
valuestringObrigatório. O formato escolhido determina caracteres, tamanho e dígito.
auto_check_digitbooleanOpcional. Solicita cálculo quando compatível.
contextenumproduct, campaign, packaging ou other.
color_presetenumblack, blue, green ou custom.
previewqueryGET /barcodes/preview aceita type, value, auto_check_digit, color_preset e custom_color para retornar SVG sem gravar.
bulk_valuesstringPOST /barcodes/bulk cria um código por linha. Planos fora do Empresarial criam até 5 por lote.
bulk_filefileOpcional no lote: CSV, TXT ou XLSX com até 1 MB. A API recusa fórmulas em XLSX.
bulk_title_prefixstringObrigatório no lote. Serve de base para o título de cada código criado.
print_width_mm e print_height_mmnumberOpcionais 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.
CampoTipoRegra
title e slugstringObrigatórios. Slug entre 3 e 64 caracteres.
categoriesarrayDe 1 a 20 categorias. Cada categoria recebe name e items.
categories.*.itemsarrayDe 1 a 20 itens com title, url e campos opcionais description, icon e is_active.
contextenumproduct, campaign, packaging, social ou other.
color_presetenumindigo, emerald, rose ou custom.
logo e bannerfileOpcionais via multipart/form-data. JPG, PNG ou WebP, até 10 MB cada.
passwordstringOpcional, 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.
CampoTipoRegra
filefileEnvio simples por multipart/form-data. O limite é a cota do Espaço e a lista de formatos aceitos.
formatos aceitosextensionsImagens: 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)extensionsMí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_patharrayOnde 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_namestringDescontinuados: 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_namestringObrigatório. Até 160 caracteres.
product_codestringOpcional. Quando informado, identifica o produto por SKU dentro do Espaço.
category_namestringObrigatório. Até 80 caracteres.
product_family_code, product_model, product_description, internal_descriptionstringOpcionais. Completam o contexto do material dentro do catálogo do Espaço.
ai_renamebooleanOpcional. A renomeação por IA vem ligada; envie 0 para desligá-la neste envio.
files, upload_methodmultipartEnvio de vários arquivos avulsos em uma chamada: files aceita até 50. Pasta, caminho relativo e pacote compactado não são aceitos.
uploadsflowPara arquivos grandes: POST /files/uploads informa name, size, mime e contexto; a resposta traz id, part_size e direct_upload.
parte diretaflowCom 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 intermediadaflowCom direct_upload=false, envie chunk e part_number em multipart/form-data para /part, sempre na ordem indicada por next_part.
complete/abortflowConclua somente após todas as partes e tamanhos coincidirem. DELETE aborta a sessão pendente; ambos exigem o mesmo Token API.
downloadbinaryExige o mesmo Token API, conta o acesso e nunca revela caminho interno de armazenamento.
statusqueryGET /files/status recebe até 100 ids e devolve scan_status, preview_status, ready, retained e processing_status.
documentbinaryGET /files/{file}/document entrega bytes para visualização segura, exige permissão de download e não conta download. Arquivo em quarentena retorna 409.
previewbinary ou JSONPOST /files/{file}/preview pede a geração; GET /files/{file}/preview entrega a prévia pronta.
foto de pastamultipartPOST /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.
CampoTipoRegra
níveisregraGET /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_idintegerEm 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.
limiteregraAté 10.000 pastas ativas por Espaço. Produto e pasta na lixeira não contam.
navegaçãoqueryGET /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éviafluxoToda 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 usoregraDELETE 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ívelregraDELETE /product-tree/levels/{level} sobe o conteúdo de cada pasta do nível para a pasta de cima e recusa quando nomes colidiriam.
identificadorregraNí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.
CampoTipoRegra
tree_node_idintegerObrigató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_codestringPadrão de ficha, obrigatório no produto novo. O code do padrão e do campo não muda depois de criado.
tree e completenessrespostatree 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.
valuesJSONattribute_code precisa estar no padrão do produto. locale só em campo is_localizable, channel só em campo is_scopable.
codestringOpcional. Único por Espaço quando preenchido.
namestringObrigatório. Até 120 caracteres em linhas e modelos, 160 em produtos.
statusenumactive ou archived em produtos e modelos.
q e codequeryBusca opcional por nome ou SKU na listagem de produtos.
bulk-valuesJSONPATCH /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 undopathPOST /products/bulk-values/{batch}/undo desfaz o lote auditado e informa quantos valores voltaram.
import mappingarrayPOST /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çãoJSONCada 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.
eventosqueryGET /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 canalJSONCada 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çãoregraO 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 statusJSONGET /product-imports/{id} acompanha status, progresso, linhas e erros do dry-run ou commit dentro do Espaço do Token API.
webhook de entradaJSONPOST /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.
CampoTipoRegra
periodenumtoday, 7d, 30d, current_month, previous_month ou custom.
start_date e end_datedateObrigatórios em custom. Intervalo máximo de 366 dias.
moduleenumshort_link, qr_code, link_page ou barcode.
itemstringFormato tipo:id, por exemplo qr_code:123.
tag_id, context e countryfiltersPaís usa código de duas letras.
device, browser, os e referrerfiltersOrigem 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.
CampoTipoRegra
profile ou roleenumPerfil fixo ou personalizado disponível em GET /roles. O dono não pode ser rebaixado pela própria chave.
emailemailObrigatório no convite. Normalizado em minúsculas e recusado quando já pertence ao Espaço.
send_emailbooleanOpcional no convite. Quando false, a API devolve invitation_url para entrega pelo integrador autorizado.
statusenumConvites retornam pending, accepted, canceled ou expired. Convite cancelado não pode ser usado.
permissionsarrayGET /roles mostra as permissões efetivas para a IA saber se pode convidar, alterar, remover ou apenas ler.
namestringObrigatório em POST /roles e opcional em PATCH /roles/{role}. De 2 a 80 caracteres, único no Espaço sem diferenciar maiúsculas.
base_roleenumPerfil fixo usado como base do perfil personalizado: admin, finance, creator ou viewer. Dono é recusado.
permissionsobjectDecisõ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.
CampoTipoRegra
GET /space/public-addressJSONMostra 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_slugstringPATCH /space/public-address/slug normaliza para letras e números, recusa reservado ou repetido e preserva alias anterior.
hostdomainPOST /space/public-address/domains cadastra domínio próprio quando o plano permite e devolve registros A e TXT para configuração.
verifyactionPOST /space/public-address/domains/{domain}/verify verifica apontamento e posse; se aprovado vira domínio principal.
trashJSONGET /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-logsqueryGET /audit-logs aceita entity, action, search e per_page 10 ou 50. Destinos, cupons e descrições vêm ocultados.
X-RateLimit-LimitheaderMostra 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 estoquefora de escopoO 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.
CampoTipoRegra
GET /contextJSONPrimeira 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 /vocabulariesJSONEnums, alvos do importador, eventos, papéis, limites estruturais e identificadores usados por cada recurso.
GET /openapi.jsonOpenAPI 3.1Contrato de métodos, caminhos, parâmetros, segurança e respostas padrão da API v1.
GET /mcpMCP manifestLista 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.

AntesAgora
GET /brands e /brands/{brand}GET /product-tree/nodes (sem parent_id) e /product-tree/nodes/{node}
POST, PATCH e DELETE /brandsPOST /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 /productstree_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 /productstree_node_id, que desce na subárvore da pasta
brand_name, product_line_name e product_subline_name em /filesproduct_tree_node_id ou tree_path
product.brand_name, product.line_name e product.subline_name na importaçãotree.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 entradatree_node_id ou tree_path
brand_id, line_id, subline_id e product_node_id na resposta do produtotree.node_id e tree.path
brand_name e product_line_name na resposta do arquivoproduct_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.

TiposubjectO que vem em data
product.movedproduto (public_id)data.tree.from_node_id, to_node_id e path com level_id e node_id de cada nível
product.family.changedprodutodata.family.from_code e to_code, e completeness_percent já recalculada
product.values.changedprodutodata.attribute_codes que mudaram e family_code
product.completeness.changedprodutodata.completeness com from_percent, percent, filled, total e missing_attribute_codes
product_tree.level.created, renamed, removed e levels.reorderednível (id)data.level, levels na ordem nova, structure_version e counts
product_tree.node.created, renamed, reordered, moved, migrated, deleted, restored e purgedpasta (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 deletedpadrã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.recalculatedpadrão de ficha (code)counts.products_recalculated e products_changed, com até 100 public_id que mudaram
product_attribute.created, updated e deletedcampo (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

RespostaQuando
422 codePATCH de campo ou padrão com outro code. O code é o identificador estável e não muda.
422 typeTroca de tipo de campo que já tem valor gravado em produto.
422 optionsOpção de lista que algum produto usa saindo da lista. A mensagem diz em quantos produtos.
422 is_localizable ou is_scopableDesligar idioma ou canal de campo com valor gravado por idioma ou canal.
422 values.N.locale ou values.N.channelValor com idioma em campo sem is_localizable, ou com canal em campo sem is_scopable.
422 values.N.attribute_codeCampo que não está no padrão de ficha do produto.
422 tree_node_idPasta que não é do último nível, que está na lixeira ou que é de outro Espaço.
422 family_codeProduto novo sem padrão de ficha, ou código de padrão que não existe no Espaço.
422 typesTipo de evento que não existe em GET /vocabularies.
403 permission_deniedO 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.
409A á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.publish e products.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_id de 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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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étodoCaminhoAcessoOperaçãoTeste
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

  1. Leia GET /context e confirme se a chave tem write e permissão de criação.
  2. Consulte GET /vocabularies, GET /mcp e GET /openapi.json para montar as chamadas sem depender de acesso ao código da Lecodaro.
  3. Confira os níveis em GET /product-tree, crie ou encontre as pastas em /product-tree/nodes e crie atributos e famílias com /product-attributes e /product-families. Alteração estrutural pede prévia e confirma com o impact_token.
  4. Valide o lote por POST /product-imports/dry-run e só confirme com POST /product-imports/{id}/commit depois de revisar erros e avisos.
  5. Acompanhe o processamento por GET /product-imports/{id} e as novidades por GET /product-events?cursor=0, ou configure /product-webhooks quando 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.