EvoluAI Docs

Endpoints

Referência completa dos endpoints REST públicos disponíveis para integrações externas via API Key.

Endpoints da API

Estes são os endpoints REST públicos disponíveis para integrações externas via autenticação por API Key.

Todas as requisições devem incluir o header X-API-Key com uma API Key válida.


GET /api/salespersons

Lista os vendedores e supervisores da empresa autenticada.

Fluxo de Uso

  1. Chame GET /api/salespersons para obter a lista de vendedores da sua empresa.
  2. Localize o vendedor desejado e copie o id dele.
  3. Use esse id no campo salespersonId ao fazer uma requisição POST /api/analyses. Isso garante que a análise seja gerada conforme a função de trabalho específica do vendedor.

Headers

HeaderObrigatórioDescrição
X-API-KeySimSua API Key

Resposta

[
  {
    "id": "user_xxx",
    "name": "João Silva",
    "role": "salesperson",
    "jobFunctionName": "SDR",
    "supervisorName": "Maria Souza"
  },
  {
    "id": "user_yyy",
    "name": "Maria Souza",
    "role": "supervisor",
    "jobFunctionName": "Sales Manager",
    "supervisorName": null
  }
]

Campos da Resposta

CampoTipoDescrição
idstringID único do usuário (use em POST /api/analyses)
namestringNome completo
rolestring"salesperson" ou "supervisor"
jobFunctionNamestring | nullNome da função de trabalho atribuída
supervisorNamestring | nullNome do supervisor atribuído

POST /api/analyses

Cria uma nova análise de vendas com IA. Requer transcript ou audioKey.

Headers

HeaderObrigatórioDescrição
X-API-KeySimSua API Key
Content-TypeSimapplication/json

Corpo da Requisição

CampoTipoObrigatórioDescrição
transcriptstringUm de transcript ou audioKeyTranscrição completa da ligação de vendas
audioKeystringUm de transcript ou audioKeyFonte de áudio (veja Opções de Entrada de Áudio abaixo)
salespersonIdstringNãoID do vendedor (obtido via GET /api/salespersons)
salespersonNamestringNãoNome do vendedor
clientNamestringNãoNome do cliente

Opções de Entrada de Áudio

Você pode fornecer áudio via o campo audioKey de três formas:

  1. URL direta: URL HTTP/HTTPS de um arquivo de áudio (ex: "https://exemplo.com/audio.mp3")
  2. Base64: Data URL com áudio codificado em base64 (ex: "data:audio/mp3;base64,SGVsbG8g...")

Formatos suportados: mp3, mp4, wav, ogg, opus

Exemplo de Requisição (com transcript)

{
  "salespersonId": "user_1234567890",
  "clientName": "Cliente Teste",
  "transcript": "Olá, meu nome é João da evoluAI..."
}

Exemplo de Requisição (com URL de áudio)

{
  "salespersonId": "user_1234567890",
  "clientName": "Cliente Teste",
  "audioKey": "https://exemplo.com/audio.mp3"
}

Resposta

{
  "id": "anal_xxx",
  "score": 87,
  "summary": "O vendedor demonstrou forte rapport...",
  "clientName": "Cliente Teste",
  "salespersonName": "João Silva",
  "audioDurationSeconds": 420,
  "dimensionScores": {
    "rapport": 90,
    "listening": 85,
    "objections": 80,
    "clarity": 88
  },
  "interactionType": "outbound-prospecting",
  "interactionScore": 82,
  "interactionScorecard": {
    "typeKey": "outbound-prospecting",
    "typeLabel": "Prospecção Outbound",
    "macroFront": "comercial",
    "score": 82,
    "confidence": 0.9,
    "criteria": [
      {
        "key": "string",
        "label": "string",
        "polarity": "objective",
        "met": true,
        "evidence": "string",
        "timestamp": "01:23"
      }
    ]
  },
  "universalIndicators": {
    "methodAdherence": {
      "score": 75,
      "steps": [
        { "key": "string", "label": "string", "present": true, "timestamp": "00:12" }
      ]
    },
    "talkToListen": { "attendantPct": 40, "clientPct": 60 },
    "interruptions": { "count": 2, "perTenMinutes": 1.5 },
    "emotionalClimate": {
      "start": "neutral",
      "middle": "positive",
      "end": "positive",
      "overall": "positive"
    }
  },
  "objections": [{"objection": "Preocupação com preço", "resolved": true}],
  "productExploration": {
    "explored": true,
    "products": ["Produto A"]
  },
  "keywordDetection": {
    "client_terms": [
      { "term": "preço", "polarity": "negative", "category": "objection", "context": null }
    ],
    "attendant_terms": []
  },
  "profile": "Consultivo",
  "stage": "Qualify",
  "bant": {
    "budget": "string",
    "authority": "string",
    "need": "string",
    "timing": "string"
  },
  "publicLink": "https://app.evoluai.com.br/analysis/anal_xxx",
  "createdAt": "2024-01-15T12:00:00.000Z"
}

Nota: os campos strengths, improvements e phaseSuggestions foram descontinuados e não são mais retornados.

Respostas de Erro

StatusCódigoDescrição
400BAD_REQUESTtranscript e audioKey ausentes
401UNAUTHORIZEDAPI Key inválida ou ausente
403FORBIDDENMinutos/créditos insuficientes
404NOT_FOUNDVendedor não encontrado
429TOO_MANY_REQUESTSRate limit atingido

GET /api/analyses/{id}

Retorna a análise completa por ID: todos os campos do dossiê (scorecard, indicadores, diagnóstico, transcrição) mais os metadados internos (custo, tokens, observabilidade, integrações). A análise precisa pertencer à empresa da API Key — análises de outra empresa retornam 404 (isolamento multi-tenant).

Parâmetros de Path

ParâmetroTipoDescrição
idstringID (uuid) da análise

Headers

HeaderObrigatórioDescrição
X-API-KeySimSua API Key

Resposta

{
  "id": "anal_xxx",
  "status": "completed",
  "source": "api",
  "createdAt": "2024-01-15T12:00:00.000Z",
  "updatedAt": "2024-01-15T12:05:00.000Z",
  "salespersonName": "João Silva",
  "clientName": "Cliente Teste",
  "supervisorName": "Maria Souza",

  "displayScore": 82,
  "score": 87,
  "interactionScore": 82,
  "summary": "O vendedor demonstrou forte rapport...",
  "profile": "Consultivo",
  "stage": "Qualify",

  "interactionType": "outbound-prospecting",
  "interactionTypeSource": "auto",
  "interactionScorecard": {
    "typeKey": "outbound-prospecting",
    "typeLabel": "Prospecção Outbound",
    "macroFront": "comercial",
    "score": 82,
    "confidence": 0.9,
    "criteria": [
      {
        "key": "string",
        "label": "string",
        "polarity": "objective",
        "met": true,
        "evidence": "string",
        "timestamp": "01:23"
      }
    ]
  },

  "universalIndicators": {
    "methodAdherence": {
      "score": 75,
      "steps": [
        { "key": "string", "label": "string", "present": true, "timestamp": "00:12" }
      ]
    },
    "talkToListen": { "attendantPct": 40, "clientPct": 60 },
    "interruptions": { "count": 2, "perTenMinutes": 1.5 },
    "emotionalClimate": {
      "start": "neutral", "middle": "positive",
      "end": "positive", "overall": "positive"
    }
  },
  "methodAdherenceScore": 75,
  "attendantTalkPct": 40,
  "interruptionsPerTenMin": 1.5,
  "climateLabel": "positive",

  "diagnostic": {
    "executive_summary": "Cliente interessado em automação...",
    "client_profile": {
      "tone": "analytical", "engagement": "active",
      "confidence": "high", "details": "Fez perguntas técnicas."
    },
    "core_motivation": { "problem": "Processo manual", "impact": "Perda de vendas" },
    "hard_data": { "collected": ["Equipe de 5"], "missing": ["Orçamento"] },
    "agent_evaluation": { "posture": "Cordial", "solution_effectiveness": "Avançou a negociação" },
    "next_steps": { "status": "scheduled", "responsibilities": ["Enviar proposta"] }
  },

  "dimensionScores": { "rapport": 90, "listening": 85, "objections": 80, "clarity": 88 },
  "bant": { "budget": "string", "authority": "string", "need": "string", "timing": "string" },
  "objections": [{ "objection": "Preço alto", "resolved": true }],
  "productExploration": { "explored": true, "products": ["Produto A"] },
  "keywordDetection": {
    "client_terms": [
      { "term": "preço", "polarity": "negative", "category": "objection", "context": null }
    ],
    "attendant_terms": []
  },

  "transcript": "Transcrição completa da conversa...",
  "transcriptSegments": [
    { "start": 0, "end": 5, "text": "Olá", "speaker": "Speaker 1" }
  ],
  "audioUrl": "https://storage.../audio.mp3",
  "audioKey": "audio/xyz.mp3",
  "audioDurationSeconds": 420,

  "tokensUsed": 1234,
  "cost": 0.42,
  "jobId": null,
  "errorSource": null,
  "errorDetail": null,
  "autoRetryCount": 0,
  "archivedAt": null,

  "provider": null,
  "externalCallId": null,
  "externalOwnerId": null,
  "attributionStatus": "auto",
  "participants": null,
  "salespersonId": "user_xxx",
  "companyId": "company_xxx"
}

Regras do Contrato

RegraDescrição
displayScoreNota oficial da análise: interactionScore ?? score ?? null. null = sem nota (nunca retorna 0 inventado)
Blocos jsonbinteractionScorecard, universalIndicators, diagnostic, dimensionScores, bant, objections, productExploration, keywordDetection, transcriptSegments vêm null quando ausentes ou em formato legado — nunca erro 500
transcriptSegments[].start/endSegundos (number) ou "MM:SS" legado (string)
timestamps de critérios/etapasFormato "MM:SS" ou null
stageConnect, Qualify, Present, Close, Negotiate ou null
Campos descontinuadosstrengths, improvements, phaseSuggestions não existem mais na resposta
audioUrlURL de playback resolvida na leitura; audioKey é a chave de storage original

Respostas de Erro

StatusCódigoDescrição
401UNAUTHORIZEDAPI Key ausente, inválida ou expirada
404NOT_FOUNDAnálise não encontrada ou pertence a outra empresa

On this page