Erreurs et pagination
Cette page couvre deux aspects que toute intégration doit gérer : à quoi ressemble une requête ayant échoué et comment paginer les points de terminaison qui renvoient des listes.
L’enveloppe d’erreur
Lorsqu’une requête échoue, la réponse est toujours au format JSON avec la même structure : un indicateur success défini sur false, un message error lisible par l’homme et un error_code numérique qui correspond au code d’état HTTP :
{
"success": false,
"error": "Invalid cursor",
"error_code": 400
}
Comme success et error_code sont toujours présents, vous pouvez baser votre logique dessus sans avoir à inspecter les codes d’état HTTP bruts si vous préférez. Une réponse réussie contient toujours success: true.
Codes d’état
| Statut | error_code |
Signification | Que faire |
|---|---|---|---|
200 |
— | Succès | Lire les données de réponse. |
201 |
— | Ressource créée | Enregistrer l’ID renvoyé (par ex. campaign_id, contactId). |
400 |
400 |
Requête incorrecte | Un paramètre est manquant ou invalide. Lire le message error et corriger la requête. |
401 |
401 |
Non autorisé | Votre clé API est manquante ou invalide. Vérifiez la clé et la manière dont vous l’envoyez — voir Authentification. |
403 |
403 |
Interdit | Votre forfait n’inclut pas l’accès à l’API. Voir Accès API ou contactez hi@youraiconnector.com. |
404 |
404 |
Non trouvé | La ressource (par ex. un ID de contact, de campagne ou de tâche) n’existe pas sur votre compte. |
409 |
409 |
Conflit | La ressource existe déjà — par exemple, la création d’un contact dont le numéro de téléphone est déjà présent sur votre compte. |
429 |
429 |
Limite de débit atteinte | Vous avez dépassé 300 requêtes par minute (ou le plafond plus large de 1 200/minute par compte). Attendez un peu et réessayez. |
500 |
500 |
Erreur serveur | Quelque chose a mal tourné de notre côté. Réessayez après une courte attente ; envoyez un e-mail à hi@youraiconnector.com si le problème persiste. |
Quelques exemples de ce à quoi cela ressemble en pratique :
{
"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."
}
Bien gérer les erreurs
- Vérifiez
success(ou le code d’état) avant de lire les données. Ne supposez pas qu’un corps de réponse contient le champ que vous attendez. - Réessayez
429et500avec un court délai d’attente — attendez, puis réessayez. Ne réessayez pas400,401,403,404ou409; ces requêtes continueront d’échouer tant que vous ne modifierez pas la requête. - Lisez le message
error. Il vous indique généralement exactement quel champ est incorrect.
Pagination
Les points de terminaison de liste (tels que GET /contacts, GET /campaigns et GET /tasks) renvoient les résultats par pages afin qu’un seul appel n’ait jamais à charger l’intégralité de votre compte. La pagination utilise un curseur opaque.
Deux paramètres de requête la contrôlent :
| Paramètre | Description |
|---|---|
limit |
Nombre d’éléments à renvoyer par page. Les valeurs par défaut varient selon le point de terminaison (souvent 50) ; le maximum est 100. |
cursor |
Un pointeur opaque vers la page suivante. Laissez-le vide pour la première page. |
Chaque page inclut un champ next_cursor dans la réponse :
- Si
next_cursorest une chaîne de caractères, il y a d’autres résultats — transmettez-la en tant quecursorlors de votre prochaine requête. - Si
next_cursorestnull, vous avez atteint la dernière page. Arrêtez.
Une page unique de contacts ressemble à ceci :
{
"success": true,
"contacts": [
{ "id": "abc123", "first_name": "Jane", "phone_number": "+15551234567" },
{ "id": "def456", "first_name": "John", "phone_number": "+15557654321" }
],
"next_cursor": "eyJsYXN0IjoiZGVmNDU2In0"
}
Remarque : Un curseur est opaque — n’essayez pas de l’analyser, de le construire ou de le modifier. Ne renvoyez que la valeur next_cursor que vous avez reçue d’une réponse précédente.
Pagination de tous les contacts
Pour récupérer une liste complète, commencez sans curseur et continuez à effectuer des appels jusqu’à ce que next_cursor soit null.
cURL
Cet exemple parcourt manuellement les deux premières pages. Exécutez le premier appel, copiez le next_cursor de sa réponse dans CURSOR, puis exécutez le second appel. Répétez l’opération jusqu’à ce que next_cursor soit 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
La même boucle fonctionne pour n’importe quel point de terminaison paginé — changez simplement le chemin et le champ que vous lisez dans la réponse (campaigns, tasks, etc.).
Étapes suivantes
- Authentification — les quatre méthodes pour envoyer votre clé.
- Contacts — les points de terminaison complets des contacts utilisés dans les exemples ci-dessus.
- Clés API — vérifiez votre utilisation actuelle de la limite de débit pour éviter les
429.