FlowDeskDesenvolvedores

API v1.0.0 · somente consulta

API do FlowDesk

Consulta dos tickets de atendimento e de grupo do WhatsApp.

API somente de consulta: outro sistema da sua empresa (NOC, BI, ERP...) lê os tickets do FlowDesk. Ela não envia mensagens nem muda nada.

Chave de API: quem é cliente do FlowDesk cria a chave em Integrações › API do FlowDesk. Cada chave só enxerga a própria empresa e só o que os escopos dela permitem. Guarde a chave no servidor do seu sistema, nunca em página ou aplicativo que o usuário final abre.

Limite: 120 pedidos por minuto por chave (cabeçalhos X-RateLimit-Limit e X-RateLimit-Remaining; ao passar, erro 429 com Retry-After).

Datas em ISO 8601 (UTC na resposta). Mensagens: até 1000 por ticket, da abertura ao encerramento; as notas internas da equipe não saem pela API.

Endereço base

https://www.flowdeskk.com/api/v1

Especificação OpenAPI 3.1

/api/v1/openapi.json

Importe no Postman, no Insomnia ou num gerador de código.

Chave de API

  1. Entre no FlowDesk e vá em Integrações › API do FlowDesk.
  2. Clique em Nova chave, dê um nome (ex.: "Sistema do NOC") e escolha o que ela pode consultar.
  3. Copie a chave na hora: ela começa com fdk_ e só aparece uma vez.
  4. Envie em todo pedido no cabeçalho Authorization: Bearer fdk_... (ou X-Api-Key).

Tickets de atendimento

Um ticket por atendimento de cliente (do início ao encerramento). Escopo tickets.ler.

Tickets de grupo

Um ticket por assunto num grupo do WhatsApp ligado no FlowDesk. Escopo tickets_grupo.ler.

curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1"

Limites e erros

CódigoQuando
200Deu certo.
400Filtro inválido (a mensagem diz qual).
401Chave ausente, errada ou revogada.
403A chave não tem o escopo da rota.
404Ticket não existe nesta empresa.
429Mais de 120 pedidos por minuto na chave. Espere os segundos do cabeçalho Retry-After.

Todo erro vem como { "error": true, "statusCode": 401, "message": "..." }, com a explicação em português no campo message.

Sincronizar sem baixar tudo

Guarde a data da última consulta e peça só o que mudou desde então com atualizado_desde e ordem=antigos, página por página. Na próxima rodada, use a maior atualizado_em que recebeu.

// Busca só os tickets que mudaram desde a última rodada
async function sincronizar(desde) {
  let pagina = 1, maisNovo = desde;
  while (true) {
    const url = new URL('https://www.flowdeskk.com/api/v1/tickets');
    url.search = new URLSearchParams({ atualizado_desde: desde, ordem: 'antigos', por_pagina: '100', pagina: String(pagina) });
    const r = await fetch(url, { headers: { Authorization: `Bearer ${process.env.FLOWDESK_API_KEY}` } });
    if (r.status === 429) { await new Promise(ok => setTimeout(ok, Number(r.headers.get('Retry-After') || 5) * 1000)); continue; }
    const { dados, paginacao } = await r.json();
    for (const ticket of dados) {
      await salvarNoMeuSistema(ticket); // a sua função
      if (ticket.atualizado_em > maisNovo) maisNovo = ticket.atualizado_em;
    }
    if (pagina >= paginacao.total_paginas) return maisNovo; // guarde para a próxima rodada
    pagina++;
  }
}

Tickets de atendimento

Um ticket por atendimento de cliente (do início ao encerramento). Escopo tickets.ler.

GET/api/v1/tickets

Listar tickets de atendimento — Lista paginada, da atualização mais recente para a mais antiga (ou o contrário com `ordem=antigos`).

ParâmetroTipoDescrição
statusaberto | encerradoSituação do ticket.
aberto_desdedata ISO 8601Abertos a partir desta data (ISO 8601). Ex.: 2026-11-01T00:00:00-03:00
aberto_atedata ISO 8601Abertos até esta data (ISO 8601).
atualizado_desdedata ISO 8601Só o que mudou desde esta data. Use para sincronizar de tempos em tempos sem baixar tudo de novo.
canal_idnúmeroNúmero de WhatsApp (canal) do FlowDesk.
ordemrecentes | antigosPor data de atualização: recentes (padrão) ou antigos primeiro.
paginanúmero (padrão 1)Página (começa em 1).
por_paginanúmero (padrão 50)Itens por página.
telefonetextoTelefone do cliente (só os números contam: +55 (86) 99999-0000 = 5586999990000).
cpf_cnpjtextoCPF ou CNPJ do cliente (só os números contam).
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets?status=aberto&por_pagina=20"
Exemplo de resposta 200
{
  "dados": [
    {
      "numero": 1000245,
      "status": "encerrado",
      "cliente": {
        "nome": "Maria Souza",
        "telefone": "5586999990000",
        "cpf_cnpj": "12345678900"
      },
      "canal_id": 19,
      "atendente": "Ana Lima",
      "atendido_pela_ia": false,
      "tag_atual": "ENCERRADO",
      "motivo_encerramento": {
        "id": 4,
        "nome": "Problema resolvido"
      },
      "aberto_em": "2026-11-02T13:05:00.000Z",
      "atualizado_em": "2026-11-02T13:41:00.000Z",
      "encerrado_em": "2026-11-02T13:41:00.000Z",
      "duracao_minutos": 36
    }
  ],
  "paginacao": {
    "pagina": 1,
    "por_pagina": 50,
    "total": 1,
    "total_paginas": 1
  }
}

GET/api/v1/tickets/{numero}

Consultar um ticket de atendimento

ParâmetroTipoDescrição
numerono caminhonúmeroNúmero do ticket (o mesmo que aparece no FlowDesk).
mensagenstrue | false (padrão false)true para trazer as mensagens do ticket junto.
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets/1000245"
Exemplo de resposta 200
{
  "dados": {
    "numero": 1000245,
    "status": "encerrado",
    "cliente": {
      "nome": "Maria Souza",
      "telefone": "5586999990000",
      "cpf_cnpj": "12345678900"
    },
    "canal_id": 19,
    "atendente": "Ana Lima",
    "atendido_pela_ia": false,
    "tag_atual": "ENCERRADO",
    "motivo_encerramento": {
      "id": 4,
      "nome": "Problema resolvido"
    },
    "aberto_em": "2026-11-02T13:05:00.000Z",
    "atualizado_em": "2026-11-02T13:41:00.000Z",
    "encerrado_em": "2026-11-02T13:41:00.000Z",
    "duracao_minutos": 36
  }
}

GET/api/v1/tickets/{numero}/mensagens

Mensagens de um ticket de atendimento — As mensagens trocadas durante o atendimento, em ordem cronológica.

ParâmetroTipoDescrição
numerono caminhonúmeroNúmero do ticket (o mesmo que aparece no FlowDesk).
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets/1000245/mensagens"
Exemplo de resposta 200
{
  "numero": 1000245,
  "mensagens": [
    {
      "id": "3EB0A1B2C3D4E5F6",
      "enviada_em": "2026-11-02T13:05:10.000Z",
      "de": "cliente",
      "tipo": "Conversation",
      "texto": "Estou sem internet desde ontem",
      "midia_url": null,
      "arquivo": null
    }
  ],
  "mensagens_truncadas": false
}

Tickets de grupo

Um ticket por assunto num grupo do WhatsApp ligado no FlowDesk. Escopo tickets_grupo.ler.

GET/api/v1/tickets-grupo

Listar tickets de grupo — Cada assunto num grupo vira um ticket: abre com a mensagem de um participante e encerra pelo atendente ou sozinho, depois de um tempo sem mensagens.

ParâmetroTipoDescrição
statusaberto | encerradoSituação do ticket.
aberto_desdedata ISO 8601Abertos a partir desta data (ISO 8601). Ex.: 2026-11-01T00:00:00-03:00
aberto_atedata ISO 8601Abertos até esta data (ISO 8601).
atualizado_desdedata ISO 8601Só o que mudou desde esta data. Use para sincronizar de tempos em tempos sem baixar tudo de novo.
canal_idnúmeroNúmero de WhatsApp (canal) do FlowDesk.
ordemrecentes | antigosPor data de atualização: recentes (padrão) ou antigos primeiro.
paginanúmero (padrão 1)Página (começa em 1).
por_paginanúmero (padrão 50)Itens por página.
grupotextoId do grupo (ex.: 120363225392860006@g.us; só os números contam).
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets-grupo?status=aberto&por_pagina=20"
Exemplo de resposta 200
{
  "dados": [
    {
      "numero": 5000012,
      "status": "aberto",
      "grupo": {
        "nome": "Equipe Técnica",
        "id": "120363225392860006@g.us"
      },
      "canal_id": 19,
      "aberto_por": {
        "nome": "Zé Técnico",
        "telefone": "5586911112222"
      },
      "primeira_mensagem": "Cliente 123 sem sinal na rua das Flores",
      "responsavel": "Ana Lima",
      "aberto_em": "2026-11-02T10:00:00.000Z",
      "primeira_resposta_em": "2026-11-02T10:04:00.000Z",
      "minutos_ate_primeira_resposta": 4,
      "ultima_mensagem_em": "2026-11-02T10:25:00.000Z",
      "atualizado_em": "2026-11-02T10:25:00.000Z",
      "encerrado_em": null,
      "encerrado_por": null,
      "encerrado_por_nome": null,
      "motivo_encerramento": null,
      "nota_encerramento": null,
      "reaberturas": 0,
      "duracao_minutos": null
    }
  ],
  "paginacao": {
    "pagina": 1,
    "por_pagina": 50,
    "total": 1,
    "total_paginas": 1
  }
}

GET/api/v1/tickets-grupo/{numero}

Consultar um ticket de grupo

ParâmetroTipoDescrição
numerono caminhonúmeroNúmero do ticket (o mesmo que aparece no FlowDesk).
mensagenstrue | false (padrão false)true para trazer as mensagens do ticket junto.
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets-grupo/5000012"
Exemplo de resposta 200
{
  "dados": {
    "numero": 5000012,
    "status": "aberto",
    "grupo": {
      "nome": "Equipe Técnica",
      "id": "120363225392860006@g.us"
    },
    "canal_id": 19,
    "aberto_por": {
      "nome": "Zé Técnico",
      "telefone": "5586911112222"
    },
    "primeira_mensagem": "Cliente 123 sem sinal na rua das Flores",
    "responsavel": "Ana Lima",
    "aberto_em": "2026-11-02T10:00:00.000Z",
    "primeira_resposta_em": "2026-11-02T10:04:00.000Z",
    "minutos_ate_primeira_resposta": 4,
    "ultima_mensagem_em": "2026-11-02T10:25:00.000Z",
    "atualizado_em": "2026-11-02T10:25:00.000Z",
    "encerrado_em": null,
    "encerrado_por": null,
    "encerrado_por_nome": null,
    "motivo_encerramento": null,
    "nota_encerramento": null,
    "reaberturas": 0,
    "duracao_minutos": null
  }
}

GET/api/v1/tickets-grupo/{numero}/mensagens

Mensagens de um ticket de grupo — As mensagens do assunto, com o participante que escreveu cada uma (`autor`).

ParâmetroTipoDescrição
numerono caminhonúmeroNúmero do ticket (o mesmo que aparece no FlowDesk).
curl -H "Authorization: Bearer $FLOWDESK_API_KEY" \
  "https://www.flowdeskk.com/api/v1/tickets-grupo/5000012/mensagens"
Exemplo de resposta 200
{
  "numero": 5000012,
  "mensagens": [
    {
      "id": "3EB0A1B2C3D4E5F6",
      "enviada_em": "2026-11-02T13:05:10.000Z",
      "de": "participante",
      "tipo": "Conversation",
      "texto": "Cliente 123 sem sinal na rua das Flores",
      "midia_url": null,
      "arquivo": null,
      "autor": "Zé Técnico"
    }
  ],
  "mensagens_truncadas": false
}

Formatos

Ticket de atendimento

CampoTipoDescrição
numeronúmeroNúmero do ticket (protocolo do atendimento).
statusaberto | encerrado
cliente{ nome, telefone, cpf_cnpj }
canal_idnúmero | nullNúmero de WhatsApp (canal) do atendimento.
atendentetexto | nullAtendente humano atual ou o último. null quando só a IA atendeu.
atendido_pela_iatrue | false
tag_atualtexto | nullOnde o atendimento está ou como terminou (ex.: FILA - Aguardando atendente, ATIVO - Atendimento humano, RESOLVIDO PELA IA).
motivo_encerramentoobjeto { id, nome } | null
aberto_emdata ISO 8601Início do atendimento.
atualizado_emdata ISO 8601Última mudança no ticket.
encerrado_emdata ISO 8601 | nullEncerramento (null se ainda aberto).
duracao_minutosnúmero | nullDa abertura ao encerramento.
mensagenslistaSó com ?mensagens=true.
mensagens_truncadastrue | falseSó com ?mensagens=true.

Ticket de grupo

CampoTipoDescrição
numeronúmeroNúmero do ticket de grupo (a partir de 5000001).
statusaberto | encerrado
grupo{ nome, id }
canal_idnúmero | null
aberto_por{ nome, telefone }Participante que mandou a 1ª mensagem.
primeira_mensagemtexto | null
responsaveltexto | nullAtendente que assumiu o ticket.
aberto_emdata ISO 8601Abertura.
primeira_resposta_emdata ISO 8601 | null1ª mensagem da empresa depois da abertura.
minutos_ate_primeira_respostanúmero | null
ultima_mensagem_emdata ISO 8601 | nullÚltima mensagem do assunto.
atualizado_emdata ISO 8601Última mudança no ticket.
encerrado_emdata ISO 8601 | nullEncerramento (null se ainda aberto).
encerrado_poratendente | inatividade | nullinatividade = encerrou sozinho, sem mensagens pelo tempo configurado no grupo.
encerrado_por_nometexto | null
motivo_encerramentoobjeto { id, nome } | null
nota_encerramentotexto | nullNota escrita por quem encerrou.
reaberturasnúmeroVezes que uma mensagem logo depois do encerramento (carência) reabriu este ticket.
duracao_minutosnúmero | null
mensagenslistaSó com ?mensagens=true.
mensagens_truncadastrue | falseSó com ?mensagens=true.

Mensagem

CampoTipoDescrição
idtexto | nullId da mensagem no WhatsApp.
enviada_emdata ISO 8601Quando foi enviada.
decliente | empresa | participanteparticipante = alguém do grupo (tickets de grupo).
autortexto | nullSó nos tickets de grupo: quem escreveu.
tipotextoTipo da mensagem no WhatsApp (Conversation, ImageMessage, AudioMessage, DocumentMessage...).
textotexto | nullTexto ou legenda (áudios transcritos aparecem aqui).
midia_urltexto | nullLink da imagem, áudio, vídeo ou documento.
arquivotexto | nullNome do arquivo (documentos).