Your AI Connector Docs

Erros e Paginação

Esta página aborda dois aspetos que todas as integrações precisam de gerir: como é um pedido falhado e como paginar através de endpoints que devolvem listas.


O envelope de erro

Quando um pedido falha, a resposta é sempre JSON com a mesma estrutura — um sinalizador success definido como false, uma mensagem error legível por humanos e um error_code numérico que corresponde ao estado HTTP:

{
  "success": false,
  "error": "Invalid cursor",
  "error_code": 400
}

Como success e error_code estão sempre presentes, pode ramificar com base neles sem inspecionar códigos de estado HTTP brutos, se preferir. Uma resposta bem-sucedida tem sempre success: true.


Códigos de estado

Estado error_code Significado O que fazer
200 — Sucesso Leia os dados da resposta.
201 — Recurso criado Guarde o ID devolvido (por exemplo, campaign_id, contactId).
400 400 Pedido inválido Falta um parâmetro ou este é inválido. Leia a mensagem error e corrija o pedido.
401 401 Não autorizado A sua chave de API está em falta ou é inválida. Verifique a chave e a forma como a está a enviar — consulte Autenticação.
403 403 Proibido O seu plano não inclui acesso à API. Consulte Acesso à API ou contacte hi@youraiconnector.com.
404 404 Não encontrado O recurso (por exemplo, um contacto, campanha ou ID de tarefa) não existe na sua conta.
409 409 Conflito O recurso já existe — por exemplo, ao criar um contacto cujo número de telefone já se encontra na sua conta.
429 429 Limite de taxa excedido Excedeu os 300 pedidos por minuto (ou o limite mais abrangente de 1200/minuto da conta). Aguarde um pouco e tente novamente.
500 500 Erro de servidor Algo correu mal do nosso lado. Tente novamente após uma breve espera; envie um e-mail para hi@youraiconnector.com se o problema persistir.

Alguns exemplos de como isto se apresenta na prática:

{
  "success": false,
  "error_code": 401,
  "error": "Invalid API key"
}
{
  "success": false,
  "error": "A contact with this phone number already exists",
  "error_code": 409
}
{
  "success": false,
  "error_code": 429,
  "error": "Rate limit exceeded. Please try again later."
}

Gerir erros corretamente

  • Verifique success (ou o código de estado) antes de ler os dados. Não assuma que o corpo da resposta contém o campo que espera.
  • Tente novamente 429 e 500 com um curto período de espera — aguarde e tente de novo. Não tente novamente 400, 401, 403, 404 ou 409; estes continuarão a falhar até que altere o pedido.
  • Leia a mensagem error. Geralmente, indica exatamente qual é o campo incorreto.

Paginação

Os endpoints de lista (como GET /contacts, GET /campaigns e GET /tasks) devolvem resultados em páginas para que uma única chamada nunca tenha de carregar toda a sua conta. A paginação utiliza um cursor opaco.

Dois parâmetros de consulta controlam-na:

Parâmetro Descrição
limit Quantos itens devolver por página. Os valores predefinidos variam consoante o endpoint (frequentemente 50); o máximo é 100.
cursor Um ponteiro opaco para a página seguinte. Deixe-o vazio para a primeira página.

Cada página inclui um campo next_cursor na resposta:

  • Se next_cursor for uma string, existem mais resultados — passe-a como o cursor no seu próximo pedido.
  • Se next_cursor for null, chegou à última página. Pare.

Uma única página de contactos tem o seguinte aspeto:

{
  "success": true,
  "contacts": [
    { "id": "abc123", "first_name": "Jane", "phone_number": "+15551234567" },
    { "id": "def456", "first_name": "John", "phone_number": "+15557654321" }
  ],
  "next_cursor": "eyJsYXN0IjoiZGVmNDU2In0"
}

Nota: Um cursor é opaco — não tente analisar, construir ou modificar o mesmo. Apenas devolva um valor next_cursor que tenha recebido de uma resposta anterior.


Paginação de todos os contactos

Para recolher uma lista completa, comece sem cursor e continue a chamar até que next_cursor devolva null.

cURL

Este exemplo percorre manualmente as duas primeiras páginas. Execute a primeira chamada, copie o next_cursor da sua resposta para CURSOR e, em seguida, execute a segunda chamada. Repita até que next_cursor seja null.

# First page
curl "https://api.youraiconnector.com/v1/contacts?apiKey=YOUR_API_KEY&limit=100"

# Next page — paste the next_cursor from the previous response
CURSOR="eyJsYXN0IjoiZGVmNDU2In0"
curl "https://api.youraiconnector.com/v1/contacts?apiKey=YOUR_API_KEY&limit=100&cursor=$CURSOR"

JavaScript

async function getAllContacts() {
  const all = [];
  let cursor = null;

  do {
    const url = new URL("https://api.youraiconnector.com/v1/contacts");
    url.searchParams.set("limit", "100");
    if (cursor) url.searchParams.set("cursor", cursor);

    const res = await fetch(url, {
      headers: { "X-API-Key": "YOUR_API_KEY" },
    });
    const data = await res.json();

    if (!data.success) throw new Error(data.error);

    all.push(...data.contacts);
    cursor = data.next_cursor;
  } while (cursor);

  return all;
}

Python

import requests

def get_all_contacts():
    all_contacts = []
    cursor = None

    while True:
        params = {"limit": 100}
        if cursor:
            params["cursor"] = cursor

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

        if not data["success"]:
            raise Exception(data["error"])

        all_contacts.extend(data["contacts"])
        cursor = data["next_cursor"]

        if not cursor:
            break

    return all_contacts

O mesmo ciclo funciona para qualquer endpoint paginado — basta alterar o caminho e o campo que lê da resposta (campaigns, tasks, e assim sucessivamente).


Próximos passos

  • Autenticação — as quatro formas de enviar a sua chave.
  • Contactos — os endpoints de contacto completos utilizados nos exemplos acima.
  • Chaves de API — verifique a sua utilização de limite de taxa em tempo real para evitar 429s.