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
| 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. |
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.