Fehler und Limits
Die eine Fehlerform, jeder Fehlercode, die Request-ID, Anfragelimits pro Plan, Limits für Suchen und Zählungen, Tageslimits, Seiten und sichere Wiederholungen.
Eine Fehlerform
Jede Fehlerantwort sieht gleich aus. Lies error.code, um zu entscheiden, was zu tun ist, und zeig Menschen error.message. Die Meldung ist ein einfacher Satz (auf Englisch).
{
"error": {
"code": "insufficient_credits",
"message": "Revealing these people costs 1 credit each and the account has none left. Buy credits or upgrade.",
"details": { "needed": 25, "balance": 0 }
},
"request_id": "req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70",
"detail": "..."
}detail enthält die ältere Form des Fehlers für Clients, die vor dieser Form geschrieben wurden. Neuer Code sollte error lesen.
Fehlercodes
| Code | Status | Was er bedeutet und was zu tun ist |
|---|---|---|
invalid_request | 400 | Der Anfrage fehlt etwas oder ein Wert ist falsch. Die Meldung sagt, was du ändern musst. |
launch_blocked | 400 | Die Kampagne kann noch nicht starten. details.blockers listet auf, was fehlt. |
unauthorized | 401 | Kein API-Schlüssel, oder der Schlüssel ist falsch oder widerrufen. |
api_key_required | 401 | Diese Route braucht einen API-Schlüssel oder eine Connector-Anmeldung, keine Browser-Sitzung. |
plan_required | 402 | Der Plan des Kontos enthält das nicht. Die Meldung nennt den Plan, der es enthält. |
insufficient_credits | 402 | Nicht genug Credits für diesen Aufruf. details sagt, wie viele nötig sind. Es wurde nichts berechnet. |
scope_missing | 403 | Dem Schlüssel fehlt ein Scope, den dieser Aufruf braucht. Erstell einen Schlüssel mit diesem Scope. |
permission_missing | 403 | Deine Rolle im Workspace erlaubt diese Aktion nicht. |
forbidden | 403 | Diese Aktion ist für dieses Konto nicht erlaubt. |
not_found | 404 | Diesen Eintrag gibt es in deinem Workspace nicht. Einträge anderer Workspaces antworten genauso. |
route_not_found | 404 | Diesen Endpunkt gibt es nicht. Prüf den Pfad in der Referenz. |
method_not_allowed | 405 | Den Pfad gibt es, aber nicht mit dieser HTTP-Methode. details.allowed listet die Methoden. |
conflict | 409 | Der Eintrag ist in einem Zustand, der das nicht erlaubt, zum Beispiel beim Löschen einer laufenden Kampagne. |
idempotency_conflict | 409 | Dieser Idempotency-Key wurde schon mit einem anderen Body benutzt. |
idempotency_in_progress | 409 | Eine Anfrage mit diesem Idempotency-Key läuft noch. Warte und versuch es erneut. |
gone | 410 | Der Eintrag ist abgelaufen, zum Beispiel eine Exportdatei, die älter als ihre Aufbewahrungszeit ist. |
quote_expired | 410 | Das Angebot ist zu alt. Hol ein neues Angebot und bestätige erneut. |
validation_error | 422 | Ein Feld hat den falschen Typ oder fehlt. details.fields listet jedes Problem. |
access_key_activation_required | 428 | Dieser eingeladene Zugangsschlüssel ist noch nicht aktiv. Bestätige zuerst die E-Mail unter details.claim_url. |
rate_limited | 429 | Zu viele Anfragen in dieser Minute. Warte Retry-After Sekunden. |
daily_limit_reached | 429 | Das Tageslimit des Schlüssels für diese Art von Aufruf ist aufgebraucht. Es wird um Mitternacht UTC zurückgesetzt. |
internal_error | 500 | Bei uns ist etwas schiefgegangen. Versuch es erneut. Gib die Request-ID an, wenn es weiter fehlschlägt. |
unavailable | 503 | Ein Teil des Dienstes ist ausgelastet oder pausiert. Versuch es in einer Minute erneut. |
confirmation_required | 400 | Ein Kauf oder eine Bestellung braucht confirmed=true, gesendet erst nachdem die zahlende Person Ja gesagt hat. |
invalid_webhook_url | 400 | Die Webhook-Adresse muss eine öffentliche https://-Adresse sein. |
phones_not_in_plan | 402 | Telefonnummern gibt es ab dem Plan Pro. Es wurde nichts berechnet. |
card_not_charged | 402 | Die gespeicherte Karte wurde nicht belastet. Es wurde nichts gekauft. Bezahl stattdessen über einen Zahlungslink. |
owner_only | 403 | Nur der Inhaber des Workspace kann das tun, zum Beispiel Postfächer bestellen oder kündigen. |
quote_not_found | 404 | Das Angebot gibt es nicht oder es gehört jemand anderem. Hol ein neues Angebot. |
charge_in_progress | 409 | Dieses Angebot wird gerade abgerechnet. Prüf den Kauf gleich noch einmal. |
not_enough_names | 409 | Es wurden nicht genug freie Domainnamen gefunden. Schick selbst ein paar Domains mit. |
not_paid | 409 | Die Bestellung ist noch nicht bezahlt, es gibt also nichts zu kündigen. |
reason_required | 422 | Zum Kündigen von Postfächern brauchst du einen Grund aus der vorgegebenen Auswahl. |
sign_in_failed | 422 | Der Mailserver hat die Anmeldung nicht akzeptiert, deshalb wurde das Postfach nicht verbunden. details.test sagt für Versand und für das Lesen von Antworten, was schiefging. |
Manche Operationen haben einen eigenen Code, etwa confirmation_required oder quote_not_found. Jede Operation listet ihre Codes in der Referenz. Behandle einen Code, den du nicht kennst, nach seinem HTTP-Status.
Die Request-ID
Jede Antwort enthält einen Header X-Request-Id, und jeder Fehler wiederholt ihn als request_id. Schick deine eigene ID im Header X-Request-Id mit (8 bis 64 Buchstaben, Ziffern, Punkte, Bindestriche oder Unterstriche), um einen Aufruf in deinen eigenen Logs zu finden. Gib die ID an, wenn du Hilfe brauchst.
Anfragen pro Minute
Jeder Schlüssel darf so viele Anfragen pro Minute senden, und bis zur zweiten Zahl in beliebigen 10 Sekunden.
| Plan | Anfragen pro Minute | In 10 Sekunden |
|---|---|---|
| 14-tägige Testphase oder ohne Abo, API-Schlüssel oder CLI | 30 | 15 |
| 14-tägige Testphase oder ohne Abo, KI-Assistent | 60 | 20 |
| Starter | 60 | 15 |
| Pro | 240 | 60 |
| Scale | 600 | 150 |
| Hyperscale | 1.200 | 300 |
Jede Antwort auf einen Aufruf mit Schlüssel enthält X-RateLimit-Limit (Anfragen pro Minute), X-RateLimit-Remaining (verbleibende Anfragen in dieser Minute) und X-RateLimit-Reset (Sekunden bis die Minute neu beginnt). Über einem der beiden Limits bekommst du 429 rate_limited mit einem Header Retry-After. Warte so viele Sekunden und versuch es dann erneut.
Suchen und Zählungen
Suchen, Zählungen und Vorschauen sind kostenlos. Sie sind pro Konto begrenzt, über alle Schlüssel und den Connector hinweg. Ein zweiter Schlüssel bringt also nicht mehr.
| Plan | Pro Minute | Zählungen pro Tag | Vorschauzeilen pro Tag |
|---|---|---|---|
| 14-tägige Testphase oder ohne Abo, API-Schlüssel oder CLI | 10 | 500 | 500 |
| 14-tägige Testphase oder ohne Abo, KI-Assistent | 20 | 1.000 | 1.000 |
| Starter | 30 | kein Limit | kein Limit |
| Pro | 60 | kein Limit | kein Limit |
| Scale | 90 | kein Limit | kein Limit |
| Hyperscale | 120 | kein Limit | kein Limit |
In der Testphase enthalten Suchen und Zählungen zusätzlich X-RateLimit-Daily-Limit und X-RateLimit-Daily-Remaining. Eine Vorschau enthält bis zu 10 Personen pro Aufruf.
Tageslimits pro Schlüssel
In der Testphase und ohne Abo hat jeder Schlüssel zusätzlich Tageslimits. In einem Plan hat nur der E-Mail-Finder eins, den Rest begrenzen die Credits. Tageslimits werden um Mitternacht UTC zurückgesetzt. GET /api/v1/account zeigt, was heute noch übrig ist.
| Was | Pro Tag | Pro Aufruf |
|---|---|---|
| Freigeschaltete Personen | 100 (kein Limit in einem Plan) | 25 |
| Exportzeilen | 50.000 (kein Limit in einem Plan) | 50.000 pro Datei, 500.000 pro Stapel |
| Abfragen im E-Mail-Finder | 2.000 | 30 pro Minute, Listen bis 10.000 Zeilen |
Über einem Tageslimit bekommst du 429 daily_limit_reached. Für mehr Personen als das Tageslimit beim Freischalten speicherst du eine Liste, exportierst sie oder fügst sie einer Kampagne hinzu. Diese Wege sind für Tausende Personen gemacht.
Seiten
Jede Liste nimmt limit und cursor. Die Antwort behält ihren eigenen Schlüssel (zum Beispiel campaigns oder people) und ergänzt total, limit, offset, next_cursor und has_more. Gib next_cursor als cursor mit, um die nächste Seite zu bekommen. Auf der letzten Seite ist er null. offset geht auch, wenn du Zeilen lieber selbst zählst.
curl "https://app.argorant.com/api/v1/campaigns?limit=25" -H "Authorization: Bearer $ARGORANT_API_KEY"
curl "https://app.argorant.com/api/v1/campaigns?limit=25&cursor=bzoyNQ" -H "Authorization: Bearer $ARGORANT_API_KEY"Wenn total_is_estimate den Wert true hat, ist total das Minimum, zum Beispiel wenn eine Liste ihre maximale Größe erreicht hat.
Sichere Wiederholungen
Schick bei jedem schreibenden Aufruf einen Header Idempotency-Key mit: Anlegen, Ändern, Löschen, Antworten, Weiterleiten und allem, was Credits oder Geld kostet. Nimm für jede neue Aktion einen neuen Zufallswert und denselben Wert, wenn du sie wiederholst.
- Derselbe Schlüssel mit demselben Body innerhalb von 24 Stunden gibt die erste Antwort zurück, mit dem Header
Idempotent-Replayed: true. Nichts passiert doppelt. - Derselbe Schlüssel mit einem anderen Body antwortet mit
409 idempotency_conflict. - Solange die erste Anfrage noch läuft, antwortet eine Wiederholung mit
409 idempotency_in_progress. Warte kurz und versuch es erneut. - Fehler werden nicht gespeichert. Du kannst also das Problem beheben und mit demselben Schlüssel erneut senden.
curl -X POST "https://app.argorant.com/api/v1/exports" \
-H "Authorization: Bearer $ARGORANT_API_KEY" \
-H "Idempotency-Key: export-cfo-germany-2026-10-07" \
-H "Content-Type: application/json" \
-d '{"filters":{"title":"CFO","country":"Germany"},"limit":500}'Kampagnen, die nicht starten können
POST /api/v1/campaigns/{id}/launch antwortet mit launch_blocked, solange etwas fehlt, zum Beispiel eine E-Mail, ein Postfach mit freier Kapazität für heute oder Personen. details.blockers listet jeden Punkt in einfachen Worten (auf Englisch). GET /api/v1/campaigns/{id} zeigt dieselbe Liste als launch_blockers, damit du alles vorher beheben kannst.