Pular para o conteúdo

AI API Routes

Rotas de integração com IA (Claude via VPS proxy). Todas usam rate limit preset ai (20 req/hora por account).


Descrição: Envia mensagens para o Claude e retorna a resposta. Usa o system prompt personalizado do account (AI settings) se disponível.

Auth: Required (getAuthContext()) Rate Limit: ai preset (20/hora) Audit: Nenhum

Request:

  • Body (Zod chatSchema):
{
"messages": [
{ "role": "user | assistant", "content": "string" }
],
"system_prompt": "string (opcional)"
}
  • messages: array com min 1 mensagem
  • system_prompt: override do system prompt (tem prioridade sobre AI settings)

Response:

  • 200: { "data": { "reply": "string" } }
  • 401: Auth error
  • 422: Validation error
  • 429: Rate limit excedido

Notas: Carrega ai_settings do account para obter personality e model. O system_prompt do request tem prioridade sobre personality.


Descrição: Sugere uma resposta para uma conversa com base no histórico de mensagens. Carrega as últimas 20 mensagens da conversa e envia ao Claude.

Auth: Required (getAuthContext()) Rate Limit: ai preset (20/hora) Audit: Nenhum

Request:

  • Body (Zod suggestReplySchema):
{
"conversation_id": "uuid"
}

Response:

  • 200: { "data": { "suggestion": "string" } }
  • 401: Auth error
  • 404: Conversa não encontrada
  • 422: Validation error
  • 429: Rate limit excedido

Notas: Converte mensagens inbound para role: "user" e outbound para role: "assistant" para contexto do Claude. Usa personality das AI settings como system prompt.


Descrição: Gera um fluxo de automação WhatsApp em formato JSON (nodes + edges) via Claude. Suporta cenarios pre-definidos e prompts customizados.

Auth: Required (getAuthContext()) Rate Limit: ai preset (20/hora) Audit: Nenhum

Request:

  • Body (Zod generateFlowSchema):
{
"scenario": "carrinho_abandonado | pix_confirmado | boas_vindas | reengajamento | pos_venda | custom",
"custom_prompt": "string (max 2000 chars, obrigatório se scenario='custom')"
}

Response:

  • 200:
{
"data": {
"nodes": [{ "id": "string", "type": "string", "label": "string", "config": {}, "position": { "x": 0, "y": 0 } }],
"edges": [{ "source": "string", "target": "string", "sourceHandle": "string?" }]
}
}
  • 401: Auth error
  • 422: Validation error
  • 429: Rate limit excedido

Notas:

  • Cenarios pre-definidos possuem prompts detalhados (recuperação de carrinho, confirmação Pix, boas-vindas, reengajamento, pos-venda)
  • O brand context do account e automaticamente adicionado ao system prompt
  • Tipos de nodes válidos: trigger, action (send_message), condition, wait, ai, tag, assign, close_conversation, http_request
  • A resposta é o JSON bruto retornado pelo Claude (parseado com JSON.parse)

Descrição: Gera copy/texto marketing para WhatsApp usando Claude, enriquecido com o brand context do account.

Auth: Required (getAuthContext()) Rate Limit: ai preset (20/hora) Audit: Nenhum

Request:

  • Body (Zod generateCopySchema):
{
"prompt": "string (min 1, max 2000, obrigatório)",
"context": "string (max 2000, opcional)"
}

Response:

  • 200: { "data": { "copy": "string" } }
  • 401: Auth error
  • 422: Validation error
  • 429: Rate limit excedido

Notas: Se o account possui brand context, as informações de marca (nome, descrição, tom, público, produtos) são automaticamente adicionadas ao contexto.


Descrição: Retorna as configurações de IA do account (personalidade, tom, restrições, modelo, auto-reply).

Auth: Required (getAuthContext()) Rate Limit: Nenhum Audit: Nenhum

Request: N/A

Response:

  • 200: { "data": AiSettings | null }
    {
    "id": "uuid",
    "account_id": "uuid",
    "personality": "string | null",
    "tone": "string | null",
    "restrictions": "string | null",
    "auto_reply": false,
    "model": "claude-opus-4-6"
    }
  • 401: Auth error

Descrição: Cria ou atualiza as configurações de IA do account. Se não existir registro, cria um novo (upsert manual).

Auth: Required (getAuthContext()) Rate Limit: Nenhum Audit: update em ai_settings

Request:

  • Body:
{
"personality": "string | null",
"tone": "string | null",
"restrictions": "string | null",
"auto_reply": "boolean (default: false)",
"model": "string (default: 'claude-opus-4-6')"
}

Response:

  • 200: { "data": AiSettings }
  • 401: Auth error

Notas: Sem validação Zod inline — aceita body livre. Default do modelo e claude-opus-4-6.