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
| Status | error_code |
Meaning | What to do |
|---|---|---|---|
200 |
— | Success | Read the response data. |
201 |
— | Resource created | Save the returned ID (e.g. campaign_id, contactId). |
400 |
400 |
Bad request | A parameter is missing or invalid. Read the error message and fix the request. |
401 |
401 |
Unauthorized | Your API key is missing or invalid. Check the key and how you are sending it — see Authentication. |
403 |
403 |
Forbidden | Your plan does not include API access. See API Access or contact hi@youraiconnector.com. |
404 |
404 |
Not found | The resource (e.g. a contact, campaign, or task ID) does not exist on your account. |
409 |
409 |
Conflict | The resource already exists — for example, creating a contact whose phone number is already on your account. |
429 |
429 |
Rate limited | You have exceeded 300 requests per minute (or the wider 1,200/minute account ceiling). Back off and retry shortly. |
500 |
500 |
Server error | Something went wrong on our side. Retry after a short wait; email hi@youraiconnector.com if it persists. |
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
429e500com um curto período de espera — aguarde e tente de novo. Não tente novamente400,401,403,404ou409; 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_cursorfor uma string, existem mais resultados — passe-a como ocursorno seu próximo pedido. - Se
next_cursorfornull, 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.