AI API Routes
Rotas de integração com IA (Claude via VPS proxy). Todas usam rate limit preset ai (20 req/hora por account).
POST /api/ai/chat
Seção intitulada “POST /api/ai/chat”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 mensagemsystem_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.
POST /api/ai/suggest-reply
Seção intitulada “POST /api/ai/suggest-reply”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.
POST /api/ai/generate-flow
Seção intitulada “POST /api/ai/generate-flow”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)
POST /api/ai/generate-copy
Seção intitulada “POST /api/ai/generate-copy”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.
GET /api/ai-settings
Seção intitulada “GET /api/ai-settings”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
PUT /api/ai-settings
Seção intitulada “PUT /api/ai-settings”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.