Consulte seus dados.
Conecte seus fluxos.
Referência pública para clientes e integradores consultarem atendimento, CRM, catálogo e configurações comerciais com segurança de credenciais no servidor.
Esta primeira edição inclui somente métodos de consulta e validação selecionados. Operações de escrita, envio de mensagens, pagamentos e webhooks permanecem fora da referência REST pública até homologação específica.
Sua primeira requisição
Peça ao administrador o endereço da sua instância e um token autorizado apenas para os métodos necessários.
Obtenha o token
O administrador cria um token de API vinculado à sua empresa.
Limite os escopos
Para o exemplo, autorize somente products.list.
Use seu servidor
Não exponha o token no navegador, aplicativo móvel ou repositório.
POST https://SEU_HOST/api/v1/{TOKEN}/{metodo}# Configure no ambiente seguro do seu servidor:
# SYSLED_URL=https://endereco-informado-pelo-administrador
# SYSLED_TOKEN=token-da-sua-integracao
curl --request POST "$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.list" --header 'Content-Type: application/json' --data '{"offset":0,"limit":10}'// Node.js — execute no servidor.
const base = process.env.SYSLED_URL;
const token = process.env.SYSLED_TOKEN;
if (!base || !token) throw new Error('Configure URL e token');
const response = await fetch(base.replace(/\/$/, '') + '/api/v1/' + encodeURIComponent(token) + '/products.list', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({offset: 0, limit: 10})
});
const data = await response.json();
if (!response.ok) throw new Error(data.code || data.error);
console.log(data.result.items);# Python 3 — execute no servidor.
import os, json
from urllib.request import Request, urlopen
from urllib.parse import quote
base = os.environ['SYSLED_URL'].rstrip('/')
token = quote(os.environ['SYSLED_TOKEN'], safe='')
request = Request(
f'{base}/api/v1/{token}/products.list',
data=json.dumps({'offset': 0, 'limit': 10}).encode(),
headers={'Content-Type': 'application/json'}, method='POST')
with urlopen(request, timeout=30) as response:
print(json.load(response)['result']['items'])Os exemplos usam dados fictícios. Esta página não solicita credenciais e não chama sua API.
Autenticação e permissões
A API usa um token no caminho /api/v1/{TOKEN}/{metodo}. Use HTTPS, guarde o token no servidor e remova-o de logs, alertas e mensagens de erro.
| Escopo | Uso |
|---|---|
nome.do.metodo | Autoriza somente o método indicado; é a opção documentada e recomendada nesta edição. |
Escopos amplos podem conceder também operações que não fazem parte desta edição pública. Para integrações de consulta, use um escopo exato por método.
Não o inclua em HTML, JavaScript do navegador, links compartilhados, capturas de tela ou ferramentas de terceiros. Lista de IPs e escopos reduzem o risco, mas não substituem o armazenamento seguro.
Dados pessoais, finalidade e retenção
messages.list, leads.list e os métodos de tarefas podem retornar conteúdo de conversas, contatos, descrições e outros dados pessoais ou comerciais. A integração deve ter finalidade definida, base legal aplicável e acesso compatível com as regras de proteção de dados da sua empresa.
- Conceda somente o escopo exato e, quando possível, limite os IPs autorizados.
- Solicite apenas os campos e períodos necessários; aplique retenção e descarte seguros.
- Não registre tokens, URLs completas, conteúdo de mensagens ou payloads pessoais sem necessidade.
- O serviço mantém contadores e metadados operacionais das chamadas para segurança e limite de uso.
Os exemplos desta documentação são sintéticos e não representam pessoas ou empresas reais.
Respostas e paginação
O envelope de sucesso contém ok, method e result. HTTP 200 não significa necessariamente que um registro foi encontrado; alguns métodos retornam found:false.
{
"ok": true,
"method": "products.list",
"result": {
"items": [
{
"codigo": "SKU-EXEMPLO",
"nome": "Produto de exemplo",
"disponivel": true
}
],
"total": 1,
"next_cursor": null
}
}Não há paginação única: leia page/limit, offset/limit, limites e significado de total no método escolhido. As respostas podem conter campos adicionais aos exemplos.
Erros, limites e tentativas
| HTTP | Código | Como tratar |
|---|---|---|
| 401 | INVALID_TOKEN | Token não encontrado. |
| 403 | TOKEN_DISABLED | Token desativado. |
| 403 | IP_BLOCKED | IP não autorizado na lista do token. |
| 403 | SCOPE_DENIED | Escopo insuficiente. |
| 429 | RATE_LIMITED | Cota do token excedida. Aguarde antes de repetir. |
| 500 | INTERNAL_ERROR | Falha interna ou erro sem status específico. |
| 403 | NO_COMPANY | Token sem empresa associada. |
| 400 / 404 / 422 | Específico do método | Leia error, code e as observações do método. |
A cota padrão pode variar por instância. Ao receber 429, aguarde e aplique backoff. Não registre a URL completa porque ela contém o token.
Escopo desta edição REST pública
Foram selecionadas consultas e validações que não criam nem alteram dados de negócio, não enviam mensagens e não pagam ou cancelam registros. A existência de outros métodos no aplicativo não os torna parte desta referência REST pública.
Operações que criam, alteram, movem, arquivam ou excluem registros; Envio de mensagens, mídia e abertura de conversas; Criação, pagamento, reconciliação ou cancelamento de pedidos e checkouts; Listagens pendentes de homologação de isolamento por empresa; Consultas cujas respostas ainda não possuem um contrato público estável e restrito aos campos necessários; Consulta de pedido por identificador numérico; Webhooks e contratos administrativos autenticados por sessão. A liberação futura depende de correção, revisão de segurança e teste de contrato.
A documentação descreve o contrato revisado, mas não comprova que todas as instâncias tenham a mesma versão. Confirme o endereço, a disponibilidade e os escopos com o administrador antes de integrar.
Encontre o método certo
Busque por recurso, método ou parâmetro. Abra um item para ver exemplos, erros e limitações.
Nenhum método encontrado.
Mensagens
1POSTmessages.listListar mensagens
Obtém as mensagens mais recentes de uma conversa da empresa do token, excluindo linhas com deleted=true.
Parâmetros
| Campo | Descrição |
|---|---|
conversation_idstring (UUID)obrigatório | ID da conversa. |
limitintegeropcional | Máximo de mensagens. Padrão: 50; mínimo 1, máximo 200. |
beforestringopcional | Cursor opaco retornado em next_cursor para buscar a página seguinte. Por compatibilidade, também aceita o UUID de uma mensagem da mesma conversa. Máximo: 2048 caracteres. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/messages.list" \
--header 'Content-Type: application/json' \
--data '{"conversation_id":"22222222-2222-4222-8222-222222222222","limit":50,"before":"eyJ2IjoxLCJpZCI6IjU1NTU1NTU1LTU1NTUtNDU1NS04NTU1LTU1NTU1NTU1NTU1NSIsImF0IjoiMjAyNi0wOS0xOFQxMjowMDowMC4wMDBaIn0"}'{
"ok": true,
"method": "messages.list",
"result": {
"total": 1,
"total_count": 1,
"messages": [
{
"id": "55555555-5555-4555-8555-555555555555",
"sender_type": "system",
"content": "Nota de exemplo",
"message_type": "note",
"media_url": null,
"delivery_status": null,
"created_at": "2026-09-18T12:00:00.000Z",
"delivered_at": null,
"read_at": null
}
],
"hasMore": false,
"next_cursor": null
}
}Comportamento e observações
- Ordenação estável por created_at decrescente, com valores null primeiro, e id decrescente para desempate.
- total é o tamanho do lote retornado; total_count conta todo o histórico não excluído da conversa. hasMore indica continuação e next_cursor contém o cursor opaco da próxima página ou null.
- Reenvie next_cursor em before sem interpretar ou modificar seu conteúdo. O UUID legado de uma mensagem da mesma conversa também é aceito como âncora.
- Conversa inexistente/de outra empresa ou cursor ausente desse histórico retorna HTTP 404 NOT_FOUND. Cursor malformado, adulterado ou maior que 2048 caracteres retorna HTTP 400 BAD_REQUEST.
- Cada item inclui delivered_at e read_at; ambos podem ser null. Eles representam a primeira evidência persistida pelo SYSLED, não o instante físico exato no aparelho. Em linhas legadas/incompletas, até status delivered/read pode permanecer sem horário até surgir evidência correspondente.
- Resposta ilustrativa do campo result; IDs, nomes e valores são fictícios. Campos adicionais podem existir.
- Pode retornar conteúdo de conversas e URLs de mídia. Use escopo exclusivo, aplique as regras de proteção de dados da sua empresa e não registre o conteúdo sem necessidade.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400BAD_REQUEST | conversation_id ausente/inválido ou cursor before inválido. |
403NO_COMPANY | Token sem empresa associada. |
404NOT_FOUND | Conversa inexistente/de outra empresa, ou cursor que não pertence ao histórico consultado. |
Também se aplicam os erros globais de autenticação, permissão e limite.
Leads
1POSTleads.listListar leads
Lista leads com total real, contagem por status e paginação.
Parâmetros
| Campo | Descrição |
|---|---|
statusstringopcional | Status: new, converted ou junk. Sem filtro inclui todos. |
status_instring[] | string CSVopcional | Status aceitos; pode combinar com status. |
searchstringopcional | Busca parcial em nome, título, telefone e e-mail. |
assigned_tostring (uuid)opcional | ID do responsável. |
assigned_to_instring[] | string CSVopcional | IDs de responsáveis. |
source_id_ininteger[] | string CSVopcional | IDs de origens. |
created_fromstring (date/date-time)opcional | Data inicial inclusiva. |
created_tostring (date/date-time)opcional | Inclui até o dia final; implementação usa limite menor que data + 1 dia. |
junked_fromstring (date/date-time)opcional | Data inicial inclusiva. |
junked_tostring (date/date-time)opcional | Inclui até o dia final; implementação usa limite menor que data + 1 dia. |
converted_fromstring (date/date-time)opcional | Data inicial inclusiva. |
converted_tostring (date/date-time)opcional | Inclui até o dia final; implementação usa limite menor que data + 1 dia. |
opportunity_minnumberopcional | Valor mínimo inclusivo. |
opportunity_maxnumberopcional | Valor máximo inclusivo. |
has_conversationbooleanopcional | true com conversa; false sem conversa. |
pageintegeropcional | Página iniciada em 1; padrão 1. |
limitintegeropcional | Padrão 50; máximo 200. Use valores positivos; limite negativo não é validado corretamente. |
order_bystringopcional | created_at_desc (padrão), created_at_asc, opportunity_desc, opportunity_asc ou name_asc. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/leads.list" \
--header 'Content-Type: application/json' \
--data '{"status":"new","page":1,"limit":50}'{
"ok": true,
"method": "leads.list",
"result": {
"rows": [
{
"id": 101,
"name": "Pessoa Exemplo",
"status": "new",
"opportunity": "1500.00",
"phone": [
{
"value": "+5585000000000",
"type": "WORK"
}
],
"email": [
{
"value": "pessoa@example.com",
"type": "WORK"
}
]
}
],
"total": 1,
"by_status": {
"new": 1,
"converted": 0,
"junk": 0
},
"page": 1,
"limit": 50
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- total e by_status correspondem a todos os registros que atendem aos filtros, não só à página.
- Não existe parâmetro pipeline_id para lead.
- Pode retornar dados pessoais e comerciais. Restrinja o token ao método, limite a retenção e aplique as regras de proteção de dados da sua empresa.
Também se aplicam os erros globais de autenticação, permissão e limite.
Funis
2POSTpipelines.getObter funil
Obtém um funil ativo com etapas e agregados.
Parâmetros
| Campo | Descrição |
|---|---|
idintegerobrigatório | Identificador numérico do registro. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/pipelines.get" \
--header 'Content-Type: application/json' \
--data '{"id":10}'{
"ok": true,
"method": "pipelines.get",
"result": {
"found": true,
"pipeline": {
"id": 10,
"name": "Funil Exemplo",
"slug": "funil-exemplo",
"is_default": false,
"type": "sales",
"color": "#2684FF",
"sort_order": 100,
"total_deals": 1,
"total_value": 1500,
"stages": [
{
"id": 11,
"name": "Em andamento",
"slug": "em-andamento-exemplo",
"type": "process",
"color": "#3b82f6",
"sort_order": 10,
"deals_count": 1,
"open_count": 1,
"deals_value": 1500
}
]
}
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- Resposta singular {found,pipeline}, não {total,pipelines}.
- Ausente, inativo ou fora da empresa (exceto global): {found:false,pipeline:null}.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400PIPELINE_ID_REQUIRED | id ausente ou diferente de inteiro positivo. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTpipelines.listListar funis
Lista funis ativos da empresa e globais, com etapas e agregados dos negócios da empresa.
Parâmetros
| Campo | Descrição |
|---|---|
pipeline_idintegeropcional | Filtro opcional por um funil. Valor inválido é ignorado. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/pipelines.list" \
--header 'Content-Type: application/json' \
--data '{"pipeline_id":10}'{
"ok": true,
"method": "pipelines.list",
"result": {
"total": 1,
"pipelines": [
{
"id": 10,
"name": "Funil Exemplo",
"slug": "funil-exemplo",
"is_default": false,
"type": "sales",
"color": "#2684FF",
"sort_order": 100,
"total_deals": 1,
"total_value": 1500,
"stages": [
{
"id": 11,
"name": "Em andamento",
"slug": "em-andamento-exemplo",
"type": "process",
"color": "#3b82f6",
"sort_order": 10,
"deals_count": 1,
"open_count": 1,
"deals_value": 1500
}
]
}
]
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- Não possui paginação. total é a quantidade de funis retornados.
- deals_count inclui negócios abertos e encerrados com archived=false; open_count restringe is_closed=false. Valores archived NULL não entram no agregado atual.
- total_value/deals_value são números; total_value arredondado a duas casas.
Também se aplicam os erros globais de autenticação, permissão e limite.
Etapas
1POSTstages.listListar etapas
Lista as etapas de um funil da empresa, por sort_order e id.
Parâmetros
| Campo | Descrição |
|---|---|
pipeline_idintegerobrigatório | Funil pertencente à empresa do token. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/stages.list" \
--header 'Content-Type: application/json' \
--data '{"pipeline_id":10}'{
"ok": true,
"method": "stages.list",
"result": {
"total": 1,
"stages": [
{
"id": 11,
"pipeline_id": 10,
"name": "Em andamento",
"slug": "em-andamento-exemplo",
"type": "process",
"color": "#3b82f6",
"sort_order": 10
}
]
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- Não possui paginação. O método não aceita funil global, mesmo quando pipelines.list o apresenta.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400BAD_REQUEST | Parâmetro obrigatório ausente ou valor inválido. |
404PIPELINE_NOT_FOUND | Funil não encontrado ou não pertence à empresa do token (inclui funil global). |
Também se aplicam os erros globais de autenticação, permissão e limite.
Tarefas
2POSTtasks.getObter tarefa
Obtém atividade e nome do responsável.
Parâmetros
| Campo | Descrição |
|---|---|
idintegerobrigatório | Identificador numérico do registro. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/tasks.get" \
--header 'Content-Type: application/json' \
--data '{"id":401}'{
"ok": true,
"method": "tasks.get",
"result": {
"found": true,
"task": {
"id": 401,
"owner_type": "deal",
"owner_id": 201,
"type": "todo",
"subject": "Revisar proposta",
"completed": false,
"responsible_id": null,
"deadline": "2026-09-25T10:00:00",
"responsible_name": null
}
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- Ausente/fora da empresa: {found:false,task:null}.
- deadline não traz offset de fuso horário em list/get.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400BAD_REQUEST | Parâmetro obrigatório ausente ou valor inválido. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTtasks.listListar tarefas
Lista atividades do CRM por dono, conclusão, responsável e atraso.
Parâmetros
| Campo | Descrição |
|---|---|
owner_typestringopcional | deal (padrão), contact (contato comercial) ou lead. |
owner_idintegeropcional | Obrigatório se owner_type for enviado; se apenas owner_id for enviado, owner_type=deal. |
completedbooleanopcional | true concluídas; false pendentes. Ausente inclui ambas. |
responsible_idstring (uuid) | nullopcional | Usuário com acesso à empresa por vínculo principal ou multifilial. |
overduebooleanopcional | true: somente pendentes com prazo anterior a NOW(). |
pageintegeropcional | Página iniciada em 1; padrão 1. |
limitintegeropcional | Padrão 25; mínimo 1, máximo 100. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/tasks.list" \
--header 'Content-Type: application/json' \
--data '{"owner_type":"deal","owner_id":201,"completed":false,"page":1,"limit":25}'{
"ok": true,
"method": "tasks.list",
"result": {
"total": 1,
"tasks": [
{
"id": 401,
"owner_type": "deal",
"owner_id": 201,
"type": "todo",
"subject": "Revisar proposta",
"completed": false,
"responsible_id": null,
"deadline": "2026-09-25T10:00:00",
"responsible_name": null
}
]
}
}Comportamento e observações
- Exemplos ilustrativos e parciais: os registros podem retornar outros campos; não representam dados reais.
- total é tamanho da página, não total global. page/limit não são devolvidos.
- Ordenação: pendentes primeiro, deadline crescente (nulos por último), criação decrescente.
- O filtro responsible_id é de igualdade; null não serve para selecionar tarefas sem responsável.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400BAD_REQUEST | Parâmetro obrigatório ausente ou valor inválido. |
400INVALID_OWNER_TYPE | owner_type fora de deal, contact, lead. |
Também se aplicam os erros globais de autenticação, permissão e limite.
Catálogo
5POSTproducts.brandsListar marcas
Marcas ativas com produtos ativos, contagem por marca e ordenação alfabética.
Este método não exige parâmetros.
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.brands" \
--header 'Content-Type: application/json' \
--data '{}'{
"ok": true,
"method": "products.brands",
"result": {
"marcas": [
{
"marca_id": "22222222-2222-4222-8222-222222222222",
"marca": "Marca exemplo",
"total": 1
}
]
}
}Comportamento e observações
- Com Tiny conectado, considera apenas produtos de fonte tiny.
- Marcas configuradas como ocultas não são devolvidas.
- Use o campo marca, não marca_id, no filtro de products.list/search.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTproducts.categoriesListar categorias
Categorias ativas com produtos ativos, contagem por categoria e ordenação alfabética.
Este método não exige parâmetros.
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.categories" \
--header 'Content-Type: application/json' \
--data '{}'{
"ok": true,
"method": "products.categories",
"result": {
"categorias": [
{
"categoria_id": "33333333-3333-4333-8333-333333333333",
"categoria": "Categoria exemplo",
"total": 1
}
]
}
}Comportamento e observações
- Com Tiny conectado, considera apenas produtos de fonte tiny.
- Use o campo categoria, não categoria_id, no filtro de products.list/search.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTproducts.getDetalhar produto
Busca um SKU ativo da empresa e acrescenta descricao ao objeto de produto.
Parâmetros
| Campo | Descrição |
|---|---|
codigostringum dos dois obrigatório | SKU exato. Informe codigo OU sku; codigo tem precedência quando ambos são preenchidos. |
skustringum dos dois obrigatório | Alternativa a codigo. Ao menos um dos dois deve ser informado. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.get" \
--header 'Content-Type: application/json' \
--data '{"codigo":"DEMO-01"}'{
"ok": true,
"method": "products.get",
"result": {
"product": {
"id": "11111111-1111-4111-8111-111111111111",
"nome": "Produto de demonstração",
"codigo": "DEMO-01",
"idCatalogo": "100.000001",
"marca": "Marca exemplo",
"categoria": "Categoria exemplo",
"imagemThumb": "https://assets.example.com/produto.png",
"imagens": [
"https://assets.example.com/produto.png"
],
"imagensCount": 1,
"specs": {
"potencia": "10 W",
"tensao": "220V"
},
"preco_venda": 25,
"estoque": 12,
"reservado": 2,
"disponivel_qtd": 10,
"disponivel": true,
"motivo_indisponivel": null,
"descricao": "Descrição ilustrativa do produto."
}
}
}Comportamento e observações
- Inclui os mesmos campos de estoque e disponibilidade da listagem mais descricao.
- Não aplica o filtro fonte=tiny usado na listagem; um SKU conhecido pode ser consultado sem aparecer na grade filtrada.
- descricao pode ser string vazia; não assuma HTML seguro para renderização.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
400BAD_REQUEST | codigo/sku não informado. |
404NOT_FOUND | Produto ativo não encontrado na empresa. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTproducts.listListar produtos
Catálogo ativo da empresa do token com filtros e paginação por deslocamento.
Parâmetros
| Campo | Descrição |
|---|---|
qstringopcional | Busca tolerante por nome/SKU. Espaços ou * separam até 10 termos combinados com AND; cada termo e os campos comparados são normalizados para minúsculas e caracteres alfanuméricos, ignorando acentos, espaços e pontuação. Termos brutos formados apenas por dígitos e pontos também procuram idCatalogo sem pontos. products.search e products.list usam a mesma função. |
marcastringopcional | Nome exato da marca, não seu UUID. |
categoriastringopcional | Nome exato da categoria, não seu UUID. |
familiastringopcional | Família exata do cadastro. |
tagstringopcional | Texto contido nas tags de origem do cadastro. |
preco_minnumberopcional | Preço mínimo, em reais; valor não numérico é ignorado. |
preco_maxnumberopcional | Preço máximo, em reais. |
orderstringopcional | nome (padrão), preco_asc, preco_desc ou estoque. Valor desconhecido usa nome. |
offsetintegeropcional | Deslocamento a partir de zero. Passe aqui o next_cursor convertido em número. |
limitintegeropcional | Recomendado de 1 a 60; padrão 24 e teto 60. Use valores positivos; números negativos podem retornar INTERNAL_ERROR. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.list" \
--header 'Content-Type: application/json' \
--data '{"limit":24,"offset":0}'{
"ok": true,
"method": "products.list",
"result": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"nome": "Produto de demonstração",
"codigo": "DEMO-01",
"idCatalogo": "100.000001",
"marca": "Marca exemplo",
"categoria": "Categoria exemplo",
"imagemThumb": "https://assets.example.com/produto.png",
"imagens": [
"https://assets.example.com/produto.png"
],
"imagensCount": 1,
"specs": {
"potencia": "10 W",
"tensao": "220V"
},
"preco_venda": 25,
"estoque": 12,
"reservado": 2,
"disponivel_qtd": 10,
"disponivel": true,
"motivo_indisponivel": null
}
],
"total": 1,
"next_cursor": null
}
}Comportamento e observações
- disponivel é a decisão pronta de compra; estoque é o saldo físico, reservado é o saldo comprometido e disponivel_qtd desconta reservas. Valores de estoque e preço podem ser null.
- Indisponibilidade: sem_preco, sem_saldo ou esgotado. Produtos indisponíveis continuam na listagem dentro do recorte de fonte.
- Com Tiny conectado, listagem, marcas e categorias consideram fonte tiny. products.get consulta SKU ativo da própria empresa sem esse filtro de fonte.
- next_cursor é um deslocamento textual, não um cursor opaco: use como offset da próxima chamada até receber null.
- Use o escopo exato do método. Escopos amplos não fazem parte deste perfil público.
- O parâmetro herdado favoritos depende de usuário e não é utilizável nesta API por token.
- A busca q não consulta descrição, ficha técnica nem specs; cada termo precisa aparecer no nome, SKU ou, quando numérico, em idCatalogo.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTproducts.searchBuscar produtos
Alias funcional de products.list. q é aceito mas não obrigatório na implementação.
Parâmetros
| Campo | Descrição |
|---|---|
qstringopcional | Busca tolerante por nome/SKU. Espaços ou * separam até 10 termos combinados com AND; cada termo e os campos comparados são normalizados para minúsculas e caracteres alfanuméricos, ignorando acentos, espaços e pontuação. Termos brutos formados apenas por dígitos e pontos também procuram idCatalogo sem pontos. products.search e products.list usam a mesma função. |
marcastringopcional | Nome exato da marca, não seu UUID. |
categoriastringopcional | Nome exato da categoria, não seu UUID. |
familiastringopcional | Família exata do cadastro. |
tagstringopcional | Texto contido nas tags de origem do cadastro. |
preco_minnumberopcional | Preço mínimo, em reais; valor não numérico é ignorado. |
preco_maxnumberopcional | Preço máximo, em reais. |
orderstringopcional | nome (padrão), preco_asc, preco_desc ou estoque. Valor desconhecido usa nome. |
offsetintegeropcional | Deslocamento a partir de zero. Passe aqui o next_cursor convertido em número. |
limitintegeropcional | Recomendado de 1 a 60; padrão 24 e teto 60. Use valores positivos; números negativos podem retornar INTERNAL_ERROR. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/products.search" \
--header 'Content-Type: application/json' \
--data '{"q":"produto","limit":24}'{
"ok": true,
"method": "products.search",
"result": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"nome": "Produto de demonstração",
"codigo": "DEMO-01",
"idCatalogo": "100.000001",
"marca": "Marca exemplo",
"categoria": "Categoria exemplo",
"imagemThumb": "https://assets.example.com/produto.png",
"imagens": [
"https://assets.example.com/produto.png"
],
"imagensCount": 1,
"specs": {
"potencia": "10 W",
"tensao": "220V"
},
"preco_venda": 25,
"estoque": 12,
"reservado": 2,
"disponivel_qtd": 10,
"disponivel": true,
"motivo_indisponivel": null
}
],
"total": 1,
"next_cursor": null
}
}Comportamento e observações
- disponivel é a decisão pronta de compra; estoque é o saldo físico, reservado é o saldo comprometido e disponivel_qtd desconta reservas. Valores de estoque e preço podem ser null.
- Indisponibilidade: sem_preco, sem_saldo ou esgotado. Produtos indisponíveis continuam na listagem dentro do recorte de fonte.
- Com Tiny conectado, listagem, marcas e categorias consideram fonte tiny. products.get consulta SKU ativo da própria empresa sem esse filtro de fonte.
- next_cursor é um deslocamento textual, não um cursor opaco: use como offset da próxima chamada até receber null.
- Use o escopo exato do método. Escopos amplos não fazem parte deste perfil público.
- O parâmetro herdado favoritos depende de usuário e não é utilizável nesta API por token.
- A busca q não consulta descrição, ficha técnica nem specs; cada termo precisa aparecer no nome, SKU ou, quando numérico, em idCatalogo.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
Shop
5POSTshop.banners.listListar banners e carrossel
Banners ativos dentro da janela de exibição, em ordem de prioridade e criação; inclui configuração do carrossel.
Parâmetros
| Campo | Descrição |
|---|---|
slotstringopcional | Posição exata do banner. Sem slot, retorna todas as posições. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/shop.banners.list" \
--header 'Content-Type: application/json' \
--data '{"slot":"home"}'{
"ok": true,
"method": "shop.banners.list",
"result": {
"banners": [
{
"id": "44444444-4444-4444-8444-444444444444",
"slot": "home",
"titulo": "Banner de demonstração",
"imagem_url": "https://assets.example.com/banner.png",
"link_url": "https://loja.example.com/catalogo",
"ordem": 0
}
],
"carrossel": {
"efeito": "slide",
"intervalo_ms": 5000,
"transicao_ms": 600,
"autoplay": true,
"laco": true,
"mostrar_setas": true,
"mostrar_pontos": true,
"pausar_no_hover": true
}
}
}Comportamento e observações
- carrossel pode ser null quando ausente, inválido ou indisponível. O consumidor deve ter fallback.
- Configuração administrativa admite efeitos slide, fade, zoom, cover e none; intervalo de 1000 a 30000 ms e transição de 0 a 3000 ms.
- Caminhos de imagem relativos são prefixados pela base pública configurada no servidor.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTshop.desconto.validarValidar cupom e descontos automáticos
Calcula descontos com os preços atuais do catálogo. Retorna descontos aplicáveis e eventual recusa do código informado.
Parâmetros
| Campo | Descrição |
|---|---|
codigostringopcional | Cupom informado. Normaliza para maiúsculas e remove espaços. Sem código, calcula automáticos. |
itensarray<object> | string JSONobrigatório | Lista de itens. Aceita array JSON ou string JSON. Preço enviado pelo cliente é ignorado. |
itens[].skustringum dos dois obrigatório | SKU do produto. Em cada item informado, envie sku OU codigo; sku tem precedência quando ambos são preenchidos. |
itens[].codigostringum dos dois obrigatório | Alternativa a itens[].sku. Em cada item informado, é necessário identificar o produto por sku OU codigo. |
itens[].qtdintegeropcional | Quantidade; quantidade é alias; mínimo efetivo 1. |
frete_centsintegeropcional | Cotação de frete em centavos, usada somente para estimar o desconto; o valor final deve ser recalculado no fluxo comercial autorizado. |
clienteobjectopcional | CPF/cpf_cnpj ou email para restrições de uso por comprador. Envie objeto JSON, não string. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/shop.desconto.validar" \
--header 'Content-Type: application/json' \
--data '{"codigo":"DEMO10","itens":[{"sku":"DEMO-01","qtd":2}],"frete_cents":900,"cliente":{"email":"comprador@example.com"}}'{
"ok": true,
"method": "shop.desconto.validar",
"result": {
"descontos": [
{
"id": "66666666-6666-4666-8666-666666666666",
"tipo": "pedido",
"metodo": "codigo",
"codigo": "DEMO10",
"nome": "Desconto de demonstração",
"valor_cents": 500,
"valor": 5,
"skus": [],
"frete_gratis": false,
"combina": {
"produto": false,
"pedido": false,
"frete": false
}
}
],
"valor_cents": 500,
"frete_gratis": false,
"frete_desconto_cents": 0,
"valor": 5,
"recusa": null
}
}Comportamento e observações
- Tipos: produtos, compre_leve, pedido e frete. Esta consulta não registra o uso do cupom.
- valor_cents e valor representam desconto nos produtos; frete_desconto_cents é separado. Não some frete grátis ao desconto de produtos duas vezes.
- recusa, quando presente, contém codigo, motivo, min_valor_cents, min_itens e texto; é retorno de negócio HTTP 200.
- Motivos: nao_encontrado, inativo, ainda_nao_comecou, expirado, esgotado, ja_usado, exige_identificacao, minimo_valor, minimo_itens, sem_itens_no_alvo, combo_nao_atingido, sem_frete, frete_acima_do_teto e tipo_desconhecido.
- Item não encontrado ou sem preço positivo é ignorado nesta estimativa; a validação não garante disponibilidade do carrinho.
- Pode haver descontos automáticos mesmo quando o cupom explícito é recusado. Um fluxo comercial posterior deve revalidar o resultado.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTshop.frete.calcularCalcular opções de frete
Calcula tarifas compatíveis com o carrinho e destino, combinando perfis quando necessário.
Parâmetros
| Campo | Descrição |
|---|---|
cepstringobrigatório | CEP de destino; pontuação é normalizada. Envie 8 dígitos. |
itensarray<object> | string JSONobrigatório | Lista de SKU e quantidade. Este método aceita array JSON ou string JSON; string inválida vira lista vazia. |
itens[].skustringum dos dois obrigatório | SKU do produto. Em cada item informado, envie sku OU codigo; sku tem precedência quando ambos são preenchidos. |
itens[].codigostringum dos dois obrigatório | Alternativa a itens[].sku. Em cada item informado, é necessário identificar o produto por sku OU codigo. |
itens[].qtdintegeropcional | Quantidade; quantidade é alias; valores são arredondados para baixo e limitados ao mínimo 1. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/shop.frete.calcular" \
--header 'Content-Type: application/json' \
--data '{"cep":"01001000","itens":[{"sku":"DEMO-01","qtd":2}]}'{
"ok": true,
"method": "shop.frete.calcular",
"result": {
"cep": "01001000",
"uf": "SP",
"opcoes": [
{
"opcao_ids": [
"55555555-5555-4555-8555-555555555555"
],
"nome": "Entrega padrão",
"valor_cents": 900,
"prazo_min_dias": 2,
"prazo_max_dias": 4,
"id": "55555555-5555-4555-8555-555555555555",
"valor": 9,
"entrega_estimada": null
}
],
"retirada": null,
"entrega_local": null,
"origem": {
"cep": "01001000",
"uf": "SP"
},
"motivo": null,
"itens_sem_frete": [],
"peso_incompleto": false
}
}Comportamento e observações
- Respostas sem cotação usam HTTP 200 e motivo cep_invalido, sem_itens, nao_configurado ou sem_cobertura. Não são falhas HTTP.
- Use todos os opcao_ids para identificar a composição da opção calculada; id identifica somente a linha.
- valor_cents é inteiro em centavos; valor é reais. Valor zero significa frete grátis.
- entrega_estimada é null ou {de, ate, processamento_dias}; o cálculo considera dias úteis e processamento configurado.
- entrega_local pode ser {ativo:true,elegivel:false} ou elegível com nome, valor_cents, valor, minimo_pedido_cents e instrucoes; zonas por raio podem acrescentar distancia, raio e unidade.
- entrega_local pode coexistir com motivo sem_cobertura. Sua presença não garante elegibilidade em um fluxo comercial posterior.
- peso_incompleto indica produtos cujo peso foi tratado como zero. O cálculo não é prova de disponibilidade/estoque.
- Uma falta de cobertura em qualquer perfil impede cotação parcial do carrinho.
- O cálculo por raio pode consultar um serviço de geocodificação e manter um cache técnico do CEP. Ele não cria nem altera pedidos, tarifas ou outras regras comerciais.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTshop.frete.configLer opções gerais de entrega
Resumo para mostrar retirada e entrega local antes do CEP. Zonas e tarifas detalhadas não são expostas.
Este método não exige parâmetros.
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/shop.frete.config" \
--header 'Content-Type: application/json' \
--data '{}'{
"ok": true,
"method": "shop.frete.config",
"result": {
"retirada": {
"ativo": true,
"prazo": "24h",
"prazo_label": "Normalmente pronto em 24 horas",
"mensagem": "Aguarde a confirmação.",
"instrucoes": "Retirada no balcão."
},
"entrega_local": {
"ativo": true,
"a_partir_de_cents": 900,
"a_partir_de": 9,
"zonas": 2
},
"datas_estimadas": true,
"origem": {
"cep": "01001000",
"uf": "SP"
}
}
}Comportamento e observações
- retirada e entrega_local podem ser null.
- a_partir_de é o menor preço cadastrado, não uma cotação para o cliente.
- A filial pode herdar regras da matriz; a origem é resolvida para a filial.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
POSTshop.loja.configLer identidade e aparência da loja
Configuração pública de marca, contatos, políticas, avisos, rodapé, formas de pagamento anunciadas e aparência.
Este método não exige parâmetros.
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/shop.loja.config" \
--header 'Content-Type: application/json' \
--data '{}'{
"ok": true,
"method": "shop.loja.config",
"result": {
"nome": "Loja de demonstração",
"logo_url": "https://assets.example.com/logo.png",
"logo_quadrada_url": "https://assets.example.com/logo-square.png",
"descricao": "Descrição ilustrativa.",
"slogan": null,
"cores": {
"principal": "#2684ff",
"texto": "#0f1621"
},
"contato": {
"whatsapp": null,
"email": "loja@example.com",
"endereco": null,
"telefone": null,
"cnpj": null
},
"busca_placeholder": null,
"rodape": {
"colunas": null
},
"topbar": {
"avisos": [],
"frete_gratis_acima": null,
"desconto_pix": null,
"atacado_url": null,
"atendimento": null
},
"pagamentos": [
"pix"
],
"politicas": {
"troca": null,
"privacidade": null,
"entrega": null
},
"aparencia": {
"cores": {
"fundo": null,
"superficie": null,
"botao": null,
"botao_texto": null
},
"fonte": null,
"banner": {
"ativo": false,
"titulo": null,
"subtitulo": null,
"imagem_url": null,
"cta_texto": null,
"cta_url": null
},
"destaques": {
"ativo": false,
"titulo": null,
"skus": []
}
},
"completa": true
}
}Comportamento e observações
- Campos não configurados podem ser null, arrays vazios ou blocos com defaults. completa exige nome e logo própria da loja: a implementação atual não considera a logo herdada da empresa nesse indicador.
- Nome e logo podem usar fallback da empresa. URLs de logo devem ser HTTP(S) absolutas.
- topbar.avisos é lista resolvida de {texto,destaque?,url?}. rodape.colunas é null ou lista de {titulo,links:[{rotulo,url?}]}. Lista vazia é escolha explícita de não mostrar colunas.
- pagamentos descreve meios anunciados: pix, visa, mastercard, elo, amex, hipercard e boleto. Não é consulta da capacidade efetiva do gateway.
- Aparência inclui fonte inter, poppins, roboto, lato, playfair ou system (ou null), banner e até 24 SKUs de destaque.
- Políticas são conteúdo textual cadastrado pela loja; renderize como texto seguro.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
Marketing
1POSTmarketing.funnelConsultar funil de marketing
Agrega leads de mídia paga, oportunidades e vendas por dia em um funil, incluindo dias sem atividade e fotografia atual de oportunidades paradas.
Parâmetros
| Campo | Descrição |
|---|---|
fromstring (YYYY-MM-DD)obrigatório | Data inicial inclusiva. |
tostring (YYYY-MM-DD)obrigatório | Data final inclusiva. Intervalo de 1 a 92 dias. |
pipeline_idintegerobrigatório | ID positivo do funil acessível à empresa. |
Exemplo de chamada e resultado
Configure SYSLED_URL e SYSLED_TOKEN no servidor. Os dados são fictícios e o resultado pode conter outros campos.
curl --request POST \
"$SYSLED_URL/api/v1/$SYSLED_TOKEN/marketing.funnel" \
--header 'Content-Type: application/json' \
--data '{"from":"2026-09-18","to":"2026-09-18","pipeline_id":1}'{
"ok": true,
"method": "marketing.funnel",
"result": {
"company_id": "44444444-4444-4444-8444-444444444444",
"from": "2026-09-18",
"to": "2026-09-18",
"generated_at": "2026-09-18T15:00:00.000Z",
"days": [
{
"date": "2026-09-18",
"leads": {
"total": 0,
"google": 0,
"meta": 0,
"other": 0,
"junk": 0,
"junk_by_reason": []
},
"opportunities": {
"created": 0,
"value": 0,
"by_channel": [],
"by_pipeline": []
},
"sales": {
"won": 0,
"value": 0,
"by_channel": [],
"by_pipeline": [],
"lost": 0,
"lost_by_reason": []
}
}
],
"stalled": {
"snapshot_date": "2026-09-18",
"buckets": [
{
"label": "Mais de 15 dias",
"count": 0,
"value": 0
},
{
"label": "11 a 15 dias",
"count": 0,
"value": 0
},
{
"label": "8 a 10 dias",
"count": 0,
"value": 0
},
{
"label": "4 a 7 dias",
"count": 0,
"value": 0
},
{
"label": "Até 3 dias",
"count": 0,
"value": 0
}
]
},
"pipelines": [
{
"id": 1,
"name": "Funil de exemplo"
}
]
}
}Comportamento e observações
- Leads são contatos criados no período com sinais de mídia paga no rastreio ou nas classificações configuradas; não equivalem a todos os leads cadastrados no CRM.
- Oportunidades/vendas/perdas consideram negócios ligados à coorte de contatos do período e ao pipeline_id; descartes contam a data de junk e podem envolver contatos criados antes do período.
- stalled é uma fotografia atual de todos os negócios em processo no funil, não um histórico filtrado por from/to.
- by_pipeline pode incluir uma segmentação adicional de tipo de orçamento; by_channel pode conter mais de uma entrada com o mesmo label e exigir soma no consumidor.
- As datas da consulta usam o fuso configurado na instância; generated_at e snapshot_date são produzidos em UTC. Não é cálculo de ROAS e não retorna gasto de mídia.
- Resposta ilustrativa do campo result; IDs, nomes e valores são fictícios. Campos adicionais podem existir.
Erros e condições específicas
| HTTP / código | Condição |
|---|---|
400INVALID_DATE_RANGE | Datas ausentes/inválidas ou intervalo fora de 1 a 92 dias. |
400PIPELINE_ID_REQUIRED | pipeline_id ausente ou não inteiro positivo. |
400PIPELINE_NOT_FOUND | Funil não encontrado para a empresa. |
403TOKEN_NO_COMPANY | Token sem empresa associada. |
Também se aplicam os erros globais de autenticação, permissão e limite.
Downloads e ferramentas
O OpenAPI e o catálogo JSON contêm exatamente os mesmos 18 métodos desta edição pública.
Cada método possui schemas próprios de requisição, resultado e envelope. Tipos derivados dos exemplos são conservadores e objetos permanecem extensíveis para campos adicionais.
Sobre
Esta edição cobre a API externa por token, exclusivamente nos métodos apresentados. APIs administrativas, operações de escrita e integrações de eventos possuem processos de liberação separados.
Revisão documental 2026-10-02. Exemplos sintéticos; sem credenciais, dados de clientes, caminhos internos ou detalhes de infraestrutura.