Webhooks
Bekomm einen signierten Aufruf an deinen Server, wenn eine Antwort eingeht, jemand interessiert ist, eine E-Mail bounct oder eine Liste oder ein Export fertig ist. Ab dem Plan Pro enthalten.
Ereignisse
| Ereignis | Wann | Was data enthält |
|---|---|---|
reply.received | Eine Person hat auf eine deiner Kampagnen geantwortet. Abwesenheitsnotizen und andere automatische Antworten kommen nicht | classification, lead_email, campaign_id, subject, snippet |
reply.positive | Eine Antwort wurde als interessiert eingeordnet | Dasselbe wie oben |
email.bounced | Eine Kampagnen-E-Mail ist gebounct | lead_email, campaign_id, subject |
email.unsubscribed | Jemand will keine E-Mails mehr, hat sich beschwert oder den Abmeldelink benutzt | classification, lead_email, campaign_id, subject, snippet, beim Abmeldelink dazu source |
campaign.paused | Der Versand pausiert: die Kampagnen-E-Mails deines Plans für diesen Monat sind aufgebraucht, oder die Kampagne hat sich selbst pausiert (zum Beispiel zu viele Bounces) | campaign_id, campaign_name, reason, dazu campaign_emails (Plan) oder message, metrics, url (automatische Pause) |
campaign.resumed | Der Monat hat neu begonnen oder der Plan ist größer geworden, der Versand geht weiter | campaign_id, campaign_name, reason, campaign_emails |
export.ready | Ein Export ist fertig | job_id, status, total_rows, verified_rows, status_url, download_url |
list.ready | Eine Liste ist fertig befüllt, auch nachdem du Personen hinzugefügt hast | list_id, list_name, job_id, status, total_items, note, status_url |
verification.completed | Eine einzelne E-Mail-Prüfung mit einem API-Schlüssel ist fertig | email, status, deliverable, is_role_based, is_free, is_disposable |
segment.new_matches | Eine gespeicherte Liste hat neue Personen, die zu ihren Filtern passen | list_id, list_name, previous_total, current_total, new_matches |
Kampagnen-Ereignisse gehen an die Webhooks des Workspace-Inhabers und jedes aktiven Teammitglieds, so kann jede Person sie an ihre eigenen Tools schicken. Exporte, Listen und Prüfungen gehen an die Webhooks der Person, die sie gestartet hat.
Einen Webhook anlegen
curl -X POST "https://app.argorant.com/api/v1/webhooks" \
-H "Authorization: Bearer $ARGORANT_API_KEY" -H "Idempotency-Key: hook-crm-1" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/argorant","events":["reply.positive","email.bounced","export.ready"]}'Die Adresse muss eine öffentliche https://-Adresse sein. Die Antwort enthält das Signatur-secret. Es wird nur einmal angezeigt, speicher es also sofort. Jedes Konto kann bis zu 10 Webhooks haben, ausgeschaltete mitgezählt.
| Aufruf | Was er tut |
|---|---|
GET /api/v1/webhooks | Deine Webhooks und jedes Ereignis, das du wählen kannst |
PATCH /api/v1/webhooks/{id} | URL oder Ereignisse ändern oder ihn mit "active": false ausschalten |
DELETE /api/v1/webhooks/{id} | Entfernen |
POST /api/v1/webhooks/{id}/test | Einen signierten Testaufruf senden |
GET /api/v1/webhooks/{id}/deliveries | Letzte Aufrufe mit Ergebnis und nächstem Versuch |
Was dein Server bekommt
POST /hooks/argorant
Content-Type: application/json
User-Agent: Argorant-Webhooks/1.0
X-Argorant-Event: reply.positive
X-Argorant-Delivery: 8841
X-Argorant-Signature: sha256=5d41402abc4b2a76b9719d911017c592...
{"event": "reply.positive", "delivery_id": "8841", "created_at": "2026-10-07T09:14:03+00:00",
"data": {"classification": "positive", "lead_email": "jane.doe@acme.com", "campaign_id": "7f3a2c1e-9b4d-4e8a-a1c2-5d6e7f8a9b0c", "subject": "Re: Quick question", "snippet": "Happy to talk..."}}Antworte innerhalb weniger Sekunden mit einem beliebigen 2xx-Status. Erledige langsame Arbeit erst nach der Antwort. Weiterleitungen werden nicht verfolgt, nutz also die endgültige Adresse.
Die Signatur prüfen
Die Signatur ist der HMAC-SHA256 des rohen Bodys mit deinem Secret. Vergleich sie, bevor du dem Aufruf vertraust. Nimm die Bytes des Bodys genau so, wie sie ankommen, vor jedem JSON-Parsen.
import hmac, hashlib
def is_from_argorant(secret: str, raw_body: bytes, signature_header: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature_header)const crypto = require("crypto");
function isFromArgorant(secret, rawBody, signatureHeader) {
const expected = Buffer.from("sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex"));
const given = Buffer.from(signatureHeader || "");
return given.length === expected.length && crypto.timingSafeEqual(expected, given);
}Der signierte Body enthält delivery_id und created_at, beide lassen sich also nicht ändern, ohne die Signatur zu brechen. Merk dir die verarbeiteten Delivery-IDs und überspring eine, die du schon kennst. So richtet ein wiederholt gesendeter Aufruf keinen Schaden an.
Wenn dein Server nicht erreichbar ist
Ein fehlgeschlagener Aufruf wird nach 1 Minute, 5 Minuten, 30 Minuten, 2 Stunden und 6 Stunden erneut versucht, also bis zu 6 Mal. X-Argorant-Delivery bleibt für jeden Versuch eines Ereignisses gleich. Nutz den Wert, um Ereignisse zu überspringen, die du schon verarbeitet hast. Nach 50 fehlgeschlagenen Aufrufen am Stück wird der Webhook ausgeschaltet. Schalte ihn mit PATCH und "active": true wieder ein.
Beliebiges Postfach verbinden (SMTP und IMAP)
Verbinde Postfächer von Zoho, Fastmail, Yahoo, iCloud, IONOS, deinem Webhoster oder jedem anderen Anbieter mit ihren Servereinstellungen. Teste zuerst die Anmeldung, verbinde eins nach dem anderen oder viele aus einer CSV-Datei.
Personen an deine anderen Tools senden
Sende eine Liste, die Personen einer Kampagne oder einen Export in das Versand-Tool, das du schon nutzt, in dein eigenes Konto dort. Ab dem Pro-Plan enthalten.