Your AI Connector Docs

API de FAQs

As FAQs são as entradas de perguntas e respostas que o seu bot de IA utiliza ao responder aos clientes. Cada FAQ pertence à sua conta e pode ser associada a uma ou mais campanhas, para que a mesma resposta possa ser reutilizada onde quer que seja relevante. A API de FAQs permite-lhe gerir essa biblioteca programaticamente — criar, atualizar, importar em massa, reordenar e associar FAQs a campanhas a partir do seu próprio código.

Todos os endpoints abaixo são relativos ao URL base https://api.youraiconnector.com/v1. Todos os pedidos devem ser autenticados — consulte Acesso à API e Autenticação. O acesso à API é uma funcionalidade paga; sem ele, os pedidos são rejeitados com um 403.

Como o bot utiliza uma FAQ: Quando cria ou altera uma FAQ, a plataforma prepara os seus dados de pesquisa (utilizados para corresponder a FAQ às perguntas recebidas) em segundo plano. Isto demora normalmente alguns segundos, após os quais o bot começa a utilizar a entrada automaticamente.


O objeto FAQ

Cada FAQ devolvida pela API tem este formato:

Campo Tipo Descrição
id string O identificador único da FAQ.
question string A pergunta do cliente que esta entrada responde.
answer string A resposta fornecida pelo bot de IA.
category string | null Etiqueta de categoria de formato livre opcional.
tags string[] Etiquetas opcionais para organizar FAQs.
is_active boolean Se o bot tem permissão para utilizar esta FAQ. O valor predefinido é true.
is_global boolean Marca a FAQ como não estando ligada a uma campanha ou Agente específico. Isto não faz com que a FAQ se aplique a todo o lado: uma FAQ só é utilizada pelas campanhas e Agentes aos quais está ligada. O valor predefinido é false.
usage_count integer Quantas vezes esta FAQ foi utilizada em respostas de IA.
order_index integer Posição de visualização desta FAQ dentro da sua campanha.
campaign_ids string[] IDs das campanhas às quais esta FAQ está ligada.
created_at string | null Carimbo de data/hora ISO 8601 de quando a FAQ foi criada.
updated_at string | null Carimbo de data/hora ISO 8601 da última alteração.

Os campos que pode definir são: question, answer, is_active, is_global, category, tags e order_index. A plataforma gere tudo o resto (dados de pesquisa, contagens de utilização, carimbos de data/hora); quaisquer outros campos no corpo do seu pedido são ignorados.


Listar FAQs

GET /faqs

Devolve as FAQs na sua conta, da mais recente para a mais antiga. Opcionalmente, filtre por uma única campanha ou pelo estado ativo.

Parâmetros de consulta

Parâmetro Obrigatório Descrição
campaign_id Não Devolver apenas FAQs associadas a esta campanha.
is_active Não Devolver apenas FAQs com este estado ativo (true ou false). Este filtro é aplicado por página, pelo que uma página pode conter menos itens do que limit.
limit Não Máximo de FAQs por página. Predefinição 50, máximo 100.
cursor Não Um ID de FAQ para continuar a partir dele. Passe o valor next_cursor da página anterior.

cURL

curl "https://api.youraiconnector.com/v1/faqs?campaign_id=campaign123&limit=50&apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs?campaign_id=campaign123&limit=50",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.faqs, data.next_cursor);

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/faqs",
    params={"campaign_id": "campaign123", "limit": 50},
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["faqs"], data["next_cursor"])

Resposta

{
  "success": true,
  "faqs": [
    {
      "id": "aBcD1234eFgH5678",
      "question": "How long does shipping take?",
      "answer": "Standard shipping takes 3-5 business days.",
      "category": "shipping",
      "tags": ["logistics", "delivery"],
      "is_active": true,
      "is_global": false,
      "usage_count": 12,
      "order_index": 0,
      "campaign_ids": ["campaign123"],
      "created_at": "2026-01-01T12:00:00.000Z",
      "updated_at": "2026-01-02T08:30:00.000Z"
    }
  ],
  "next_cursor": "aBcD1234eFgH5678"
}

Quando next_cursor é null, não existem mais resultados.


Obter uma FAQ

GET /faqs/{faqId}

Devolve uma única FAQ pelo seu ID.

cURL

curl "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { faq } = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
faq = res.json()["faq"]

Resposta

{
  "success": true,
  "faq": {
    "id": "aBcD1234eFgH5678",
    "question": "How long does shipping take?",
    "answer": "Standard shipping takes 3-5 business days.",
    "category": "shipping",
    "tags": ["logistics"],
    "is_active": true,
    "is_global": false,
    "usage_count": 12,
    "order_index": 0,
    "campaign_ids": ["campaign123"],
    "created_at": "2026-01-01T12:00:00.000Z",
    "updated_at": "2026-01-02T08:30:00.000Z"
  }
}

Criar uma FAQ

POST /faqs

Cria uma nova FAQ e associa-a a uma campanha.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha à qual associar a nova FAQ.
question Sim A pergunta do cliente que esta entrada responde.
answer Sim A resposta que o bot deve dar.
is_active Não Se o bot pode utilizar esta FAQ. O valor predefinido é true.
is_global Não Se a FAQ se aplica a todas as campanhas. O valor predefinido é false.
category Não Uma etiqueta de categoria de formato livre.
tags Não Uma matriz de etiquetas.
order_index Não Posição de visualização dentro da campanha. O valor predefinido é 0.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "campaign123",
    "question": "How long does shipping take?",
    "answer": "Standard shipping takes 3-5 business days.",
    "category": "shipping",
    "tags": ["logistics"]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaign_id: "campaign123",
    question: "How long does shipping take?",
    answer: "Standard shipping takes 3-5 business days.",
    category: "shipping",
    tags: ["logistics"],
  }),
});
const { faq_id } = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaign_id": "campaign123",
        "question": "How long does shipping take?",
        "answer": "Standard shipping takes 3-5 business days.",
        "category": "shipping",
        "tags": ["logistics"],
    },
)
faq_id = res.json()["faq_id"]

Resposta

{
  "success": true,
  "faq_id": "aBcD1234eFgH5678"
}

Atualizar uma FAQ

PUT /faqs/{faqId}

Atualiza parcialmente uma FAQ. Apenas os campos editáveis fornecidos são alterados; tudo o resto mantém o seu valor atual. Alterar o question ou o answer atualiza automaticamente os dados de pesquisa da FAQ em segundo plano.

Se enviar question ou answer, estes devem ser cadeias de caracteres não vazias. O envio de campos editáveis não reconhecidos devolve um 400.

cURL

curl -X PUT "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "is_active": false }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ is_active: false }),
  }
);
const data = await res.json();

Python

import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"is_active": False},
)
data = res.json()

Resposta

{
  "success": true,
  "faq_id": "aBcD1234eFgH5678"
}

Eliminar uma FAQ

DELETE /faqs/{faqId}

Elimina permanentemente uma FAQ. Opcionalmente, passe campaign_id como um parâmetro de consulta para remover também a FAQ da lista de FAQ dessa campanha.

Parâmetros de consulta

Parâmetro Obrigatório Descrição
campaign_id Não Remover também as FAQ da lista de FAQ desta campanha.

cURL

curl -X DELETE "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678?campaign_id=campaign123&apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678?campaign_id=campaign123",
  { method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.delete(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678",
    params={"campaign_id": "campaign123"},
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true
}

Eliminar FAQ em massa

POST /faqs/bulk-delete

Elimina até 500 FAQ num único pedido. Quando campaign_id é fornecido, as FAQ eliminadas são também removidas da lista de FAQ dessa campanha.

Campos do pedido

Campo Obrigatório Descrição
faq_ids Sim Uma matriz não vazia de IDs de FAQ a eliminar (máx. 500).
campaign_id Não Remover também as FAQ eliminadas da lista de FAQ desta campanha.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/bulk-delete?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "faq_ids": ["faqId1", "faqId2"], "campaign_id": "campaign123" }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/bulk-delete", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    faq_ids: ["faqId1", "faqId2"],
    campaign_id: "campaign123",
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/bulk-delete",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"faq_ids": ["faqId1", "faqId2"], "campaign_id": "campaign123"},
)
data = res.json()

Resposta

{
  "success": true,
  "deleted_count": 2
}

Perguntas frequentes sobre importação

POST /faqs/import

Importa em massa até 500 perguntas frequentes e associa-as todas a uma campanha. Os itens cujo question corresponda a uma pergunta frequente existente na sua biblioteca (sem distinção entre maiúsculas e minúsculas) atualizam essa pergunta frequente em vez de criar uma duplicada.

Dica de desempenho: A correspondência de duplicados analisa toda a sua biblioteca de perguntas frequentes, pelo que bibliotecas muito grandes tornam as importações mais lentas. Prefira menos importações de maior dimensão a muitas pequenas.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha à qual todas as perguntas frequentes importadas estão associadas.
faqs Sim Uma matriz não vazia de itens de perguntas frequentes (máx. 500). Cada item deve ter um question e um answer não vazios; pode também incluir is_active, is_global, category, tags e order_index.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/import?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "campaign123",
    "faqs": [
      { "question": "Do you ship internationally?", "answer": "Yes, we ship to most countries worldwide." },
      { "question": "What is your return policy?", "answer": "You can return any item within 30 days." }
    ]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/import", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaign_id: "campaign123",
    faqs: [
      {
        question: "Do you ship internationally?",
        answer: "Yes, we ship to most countries worldwide.",
      },
      {
        question: "What is your return policy?",
        answer: "You can return any item within 30 days.",
      },
    ],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/import",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaign_id": "campaign123",
        "faqs": [
            {"question": "Do you ship internationally?", "answer": "Yes, we ship to most countries worldwide."},
            {"question": "What is your return policy?", "answer": "You can return any item within 30 days."},
        ],
    },
)
data = res.json()

Resposta

{
  "success": true,
  "faq_ids": ["aBcD1234eFgH5678", "iJkL9012mNoP3456"],
  "imported_count": 2
}

faq_ids são os IDs das perguntas frequentes criadas ou atualizadas, pela ordem em que os forneceu.


Reordenar perguntas frequentes

POST /faqs/reorder

Define a ordem de apresentação das perguntas frequentes de uma campanha. Forneça a lista completa de IDs das perguntas frequentes na ordem pretendida; a posição de cada pergunta frequente é atualizada para corresponder ao seu lugar na matriz.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha cujas FAQs estão a ser reordenadas.
ordered_faq_ids Sim Uma matriz não vazia de todos os IDs de FAQ da campanha na ordem de apresentação pretendida (máximo 500).

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/reorder?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "campaign123",
    "ordered_faq_ids": ["faqId2", "faqId1", "faqId3"]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/reorder", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaign_id: "campaign123",
    ordered_faq_ids: ["faqId2", "faqId1", "faqId3"],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/reorder",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaign_id": "campaign123",
        "ordered_faq_ids": ["faqId2", "faqId1", "faqId3"],
    },
)
data = res.json()

Resposta

{
  "success": true
}

Se a campanha ou qualquer um dos IDs de FAQ não for encontrado na sua conta, o pedido devolve 404 One or more FAQs were not found.


Ligar uma FAQ a uma campanha

POST /faqs/{faqId}/link

Liga uma FAQ existente a uma campanha adicional. Uma FAQ pode ser partilhada por qualquer número de campanhas, pelo que a mesma resposta só precisa de ser mantida uma vez.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha à qual ligar a FAQ.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/link?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "campaign_id": "campaign456" }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/link",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ campaign_id: "campaign456" }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/link",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"campaign_id": "campaign456"},
)
data = res.json()

Resposta

{
  "success": true,
  "faq_id": "aBcD1234eFgH5678",
  "campaign_id": "campaign456"
}

Desassociar uma FAQ de uma campanha

POST /faqs/{faqId}/unlink

Remove uma FAQ de uma campanha sem eliminar a própria FAQ. A FAQ permanece na sua biblioteca e continua associada a quaisquer outras campanhas.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha da qual pretende remover a FAQ.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/unlink?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "campaign_id": "campaign456" }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/unlink",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ campaign_id: "campaign456" }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/unlink",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"campaign_id": "campaign456"},
)
data = res.json()

Resposta

{
  "success": true,
  "faq_id": "aBcD1234eFgH5678",
  "campaign_id": "campaign456"
}

Reconstruir os dados de pesquisa de uma FAQ

POST /faqs/{faqId}/rebuild-embeddings

Coloca na fila uma reconstrução dos dados que o bot de IA utiliza para encontrar esta FAQ (os seus dados de pesquisa semântica e por palavras-chave). Isto é útil se uma FAQ não estiver a ser incluída nas respostas como esperado. A reconstrução é executada em segundo plano e, normalmente, é concluída em poucos segundos; a FAQ pode ser temporariamente excluída das respostas da IA enquanto está a ser reconstruída.

Este endpoint devolve 202 Accepted porque o trabalho continua após o envio da resposta. O status é sempre "processing" — volte a consultar a FAQ mais tarde se precisar de confirmar a conclusão.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/rebuild-embeddings?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/rebuild-embeddings",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/rebuild-embeddings",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true,
  "faq_id": "aBcD1234eFgH5678",
  "status": "processing"
}

Gestão de FAQ assistida por IA

Os endpoints abaixo vão além do CRUD simples: invocam as mesmas ferramentas de assistência por IA que o editor de FAQ do painel utiliza — encontrando duplicados, gerando entradas a partir de um documento e associando FAQs a tarefas de lacunas de conhecimento abertas. Os corpos dos pedidos neste conjunto utilizam nomes de campos camelCase (campaignId, taskId, sourceIds…), correspondendo aos formatos de pedido da própria aplicação, em vez do snake_case utilizado noutras partes desta página — copie os exemplos abaixo em vez de tentar adivinhar o nome de um campo.

Criar uma cópia de uma FAQ específica para uma campanha

POST /faqs/{faqId}/fork-for-campaign

Cria uma nova FAQ que é uma cópia de uma existente, limitada a uma única campanha, e reassocia essa campanha à nova cópia em vez da original. Utilize isto quando pretender personalizar uma resposta para uma campanha sem a alterar em todos os outros locais onde a FAQ original é utilizada. A FAQ original permanece no local — apenas perde a ligação desta campanha.

Campos do pedido

Campo Obrigatório Descrição
campaign_id Sim A campanha à qual a nova cópia será limitada e da qual será reassociada a partir da FAQ original.
question Sim A pergunta para a nova cópia específica da campanha.
answer Sim A resposta para a nova cópia específica da campanha.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/fork-for-campaign?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "campaign456",
    "question": "How long does shipping take to the EU?",
    "answer": "For EU orders, shipping takes 7-10 business days."
  }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/fork-for-campaign",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      campaign_id: "campaign456",
      question: "How long does shipping take to the EU?",
      answer: "For EU orders, shipping takes 7-10 business days.",
    }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/aBcD1234eFgH5678/fork-for-campaign",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaign_id": "campaign456",
        "question": "How long does shipping take to the EU?",
        "answer": "For EU orders, shipping takes 7-10 business days.",
    },
)
data = res.json()

Resposta201 Created

{
  "success": true,
  "faq_id": "nEwFaQiD9012mNoP",
  "campaign_id": "campaign456",
  "original_faq_id": "aBcD1234eFgH5678"
}

Encontrar FAQs quase duplicadas

POST /faqs/dedupe

Inicia uma tarefa em segundo plano que analisa a sua biblioteca de FAQs à procura de entradas quase duplicadas ou sobrepostas e funde-as ou remove-as quando existe confiança. Útil após uma importação em massa, ou após várias rondas de FAQs geradas por IA terem deixado a biblioteca com sobreposições. Apenas uma tarefa de desduplicação pode ser executada por conta de cada vez — iniciar uma segunda enquanto uma tarefa ainda está em execução devolve 409.

Campos do pedido

Campo Obrigatório Descrição
sourceIds Não Matriz de IDs de origem da base de conhecimento para limitar a desduplicação. Omitir para analisar toda a sua biblioteca de FAQs.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/dedupe?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/dedupe", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({}),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/dedupe",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={},
)
data = res.json()

Resposta202 Accepted

{
  "success": true,
  "job_id": "dedupJob_aBc123"
}

A tarefa é executada em segundo plano e demora normalmente alguns minutos numa biblioteca grande. Não existe um endpoint de estado separado — volte a obter GET /faqs após uma curta espera para ver o que mudou. Quando terminar de rever o resultado, chame o endpoint de dispensa abaixo para o limpar.

Dispensar um resultado de verificação de duplicados

POST /faqs/dedupe/dismiss

Limpa a tarefa de desduplicação concluída para que deixe de aparecer como um resultado ativo. Idempotente — seguro para chamar mesmo que não haja nada para dispensar. Devolve 409 se a tarefa ainda estiver queued ou processing (não pode dispensar uma execução que ainda não terminou).

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/dedupe/dismiss?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/dedupe/dismiss", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/dedupe/dismiss",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{ "success": true }

Gerar FAQs a partir de documentos carregados

POST /faqs/generate-from-documents

Lê um ou mais documentos já existentes no armazenamento de ficheiros da sua conta e faz com que a IA crie rascunhos de FAQs a partir do seu conteúdo, verificando os rascunhos em relação à sua biblioteca existente para que reutilize ou atualize entradas em vez de criar duplicados. Os resultados não são escritos imediatamente — são guardados como um conjunto de alterações pendentes na campanha para que os reveja, sendo depois aplicados (ou descartados) com Aplicar alterações de FAQ revistas abaixo. Isto consome créditos, uma vez que se trata de uma passagem de geração de IA sobre o texto do documento.

Este endpoint não transporta o ficheiro: storagePath deve apontar para um ficheiro já existente na sua própria pasta de carregamentos (users/{your user id}/uploads/), a mesma convenção que Importar um documento carregado na API da Base de Conhecimento.

Campos do pedido

Campo Obrigatório Descrição
campaignId Sim A campanha para a qual as FAQs geradas são propostas.
uploadedFiles Sim Matriz não vazia de ficheiros a ler, cada um { storagePath, fileName, mimeType }. storagePath deve começar com users/{your user id}/uploads/.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/generate-from-documents?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignId": "campaign123",
    "uploadedFiles": [
      { "storagePath": "users/abc123uid/uploads/handbook.pdf", "fileName": "handbook.pdf", "mimeType": "application/pdf" }
    ]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/generate-from-documents", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaignId: "campaign123",
    uploadedFiles: [
      { storagePath: "users/abc123uid/uploads/handbook.pdf", fileName: "handbook.pdf", mimeType: "application/pdf" },
    ],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/generate-from-documents",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaignId": "campaign123",
        "uploadedFiles": [
            {"storagePath": "users/abc123uid/uploads/handbook.pdf", "fileName": "handbook.pdf", "mimeType": "application/pdf"},
        ],
    },
)
data = res.json()

Resposta202 Accepted

{
  "success": true,
  "faqCount": 6,
  "reusedCount": 2,
  "modifiedCount": 1,
  "newCount": 3
}

faqCount é o número total de alterações propostas a aguardar revisão; reusedCount, modifiedCount e newCount dividem esse número em FAQs que corresponderam a uma entrada existente sem alterações, as que a IA propõe editar e as totalmente novas. Os ficheiros carregados são eliminados do armazenamento assim que o processamento termina, independentemente de ser bem-sucedido ou não.

Aplicar alterações de FAQ revistas

POST /faqs/apply-optimization

Aplica (ou descarta) um conjunto pendente de alterações de FAQ propostas pela IA — o tipo produzido por Gerar FAQs a partir de documentos acima, ou pela revisão de otimização de FAQ do painel de controlo. Escolhe exatamente quais as alterações propostas a aceitar; tudo o que não mencionar permanece inalterado (uma alteração omitida nunca é tratada como uma rejeição que elimina algo).

Campos do pedido

Campo Obrigatório Descrição
campaignId Um destes dois A campanha cujas alterações de FAQ pendentes estão a ser aplicadas.
agentId Um destes dois O Agente de IA cujas alterações de FAQ pendentes estão a ser aplicadas, numa conta nativa do agente. Forneça exatamente um de campaignId / agentId, nunca ambos.
acceptedChanges Sim Matriz das alterações que aceita, cada uma { action, faq_id?, faq_ref_path?, question?, answer?, edit_scope? }. action é um de keep, remove, add_from_library, create_new, modify. Envie uma matriz vazia para descartar o conjunto pendente sem aplicar nada.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/apply-optimization?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignId": "campaign123",
    "acceptedChanges": [
      { "action": "create_new", "question": "Do you ship to the EU?", "answer": "Yes, EU shipping takes 7-10 business days." },
      { "action": "remove", "faq_ref_path": "users/abc123uid/faqs/oldFaqId" }
    ]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/apply-optimization", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaignId: "campaign123",
    acceptedChanges: [
      { action: "create_new", question: "Do you ship to the EU?", answer: "Yes, EU shipping takes 7-10 business days." },
      { action: "remove", faq_ref_path: "users/abc123uid/faqs/oldFaqId" },
    ],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/apply-optimization",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaignId": "campaign123",
        "acceptedChanges": [
            {"action": "create_new", "question": "Do you ship to the EU?", "answer": "Yes, EU shipping takes 7-10 business days."},
            {"action": "remove", "faq_ref_path": "users/abc123uid/faqs/oldFaqId"},
        ],
    },
)
data = res.json()

Resposta

{
  "success": true,
  "message": "Applied 2 FAQ changes",
  "faq_count": 7
}

faq_count é o número total de FAQs ligadas da campanha (ou Agente) após a aplicação. Se não existia nenhum conjunto de alterações pendentes para aplicar, a resposta é { "success": true, "message": "No pending FAQ changes to apply" }.

Encontrar FAQs semelhantes a uma tarefa

POST /faqs/similar-for-task

Classifica a sua biblioteca de FAQs por relevância para a pergunta de uma tarefa de lacuna de conhecimento — a mesma pesquisa por detrás do seletor “Usar uma FAQ existente” do painel de controlo. Apenas de leitura. taskId deve apontar para uma tarefa do tipo faq_update.

Este endpoint responde sempre 200, mesmo em caso de falha esperada, como uma tarefa desconhecida — verifique success no corpo da resposta em vez do estado HTTP.

Campos do pedido

Campo Obrigatório Descrição
taskId Sim A tarefa faq_update para encontrar correspondências.
limit Não Máximo de correspondências a devolver. O padrão é 20, com um limite de 50.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/similar-for-task?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "taskId": "task789", "limit": 10 }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/similar-for-task", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ taskId: "task789", limit: 10 }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/similar-for-task",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"taskId": "task789", "limit": 10},
)
data = res.json()

Resposta

{
  "success": true,
  "data": {
    "task_id": "task789",
    "matches": [
      {
        "faq_id": "aBcD1234eFgH5678",
        "question": "How long does shipping take?",
        "answer": "Standard shipping takes 3-5 business days.",
        "category": "shipping",
        "created_at": "2026-01-01T12:00:00.000Z",
        "similarity": 0.81,
        "embedding_similarity": 0.81,
        "keyword_similarity": 0.6,
        "bm25_score": 4.2,
        "distance": 0.19
      }
    ]
  }
}

As correspondências são ordenadas por similarity (correspondência semântica quando disponível, sobreposição de palavras-chave caso contrário), começando pela melhor. Numa falha ligeira, a estrutura é { "success": false, "error": "...", "error_code": 404 }error_code reflete o que seria normalmente o estado HTTP.

Resolver uma tarefa com uma FAQ existente

POST /faqs/resolve-task

Resolve uma tarefa de lacuna de conhecimento ligando-a a uma FAQ que já possui (em vez de escrever uma nova), envia a resposta dessa FAQ ao contacto que originou a lacuna e marca a tarefa como concluída. Utilize isto após Encontrar FAQs semelhantes a uma tarefa revelar uma FAQ existente que já cobre a questão.

Tal como o endpoint acima, este responde sempre 200 — verifique success no corpo da resposta.

Campos do pedido

Campo Obrigatório Descrição
taskId Sim A tarefa faq_update a resolver.
faqId Sim A FAQ existente a associar e a enviar como resposta.

cURL

curl -X POST "https://api.youraiconnector.com/v1/faqs/resolve-task?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "taskId": "task789", "faqId": "aBcD1234eFgH5678" }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/faqs/resolve-task", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ taskId: "task789", faqId: "aBcD1234eFgH5678" }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/faqs/resolve-task",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"taskId": "task789", "faqId": "aBcD1234eFgH5678"},
)
data = res.json()

Resposta

{
  "success": true,
  "data": {
    "task_id": "task789",
    "faq_id": "aBcD1234eFgH5678",
    "follow_up_status": "published"
  }
}

follow_up_status indica o que aconteceu ao seguimento do contacto: published (enviado imediatamente), queued (a IA já estava a responder a esse contacto, por isso será enviado a seguir), skipped_no_contact (a tarefa não tem nenhum contacto associado) ou skipped_no_campaign (não existe nenhuma campanha através da qual enviar).


FAQs Erros da API

Os endpoints de FAQ devolvem o envelope de erro padrão:

{
  "success": false,
  "error": "FAQ not found"
}
Estado Quando ocorre num endpoint de FAQ
400 Falta um campo obrigatório ou é inválido (por exemplo, um question vazio, um campaign_id em falta ou mais de 500 itens num pedido em massa).
404 A FAQ ou campanha não foi encontrada — ou não existe ou pertence a outra conta.
409 POST /faqs/dedupe foi chamado enquanto um trabalho de desduplicação já está queued/processing, ou POST /faqs/dedupe/dismiss foi chamado enquanto o trabalho ainda não terminou.

Os códigos partilhados que qualquer endpoint pode devolver — 401, 403 (o seu plano não inclui acesso à API), 429 (limite de taxa) e 500 — estão listados com orientações de repetição em Erros e Paginação.

POST /faqs/similar-for-task e POST /faqs/resolve-task são as duas exceções nesta página: respondem 200 mesmo para uma falha esperada (tarefa desconhecida, tipo de tarefa incorreto) e colocam o estado real no error_code do corpo da resposta — consulte cada endpoint acima.


Relacionado