ArgorantDocs

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

EreignisWannWas data enthält
reply.receivedEine Person hat auf eine deiner Kampagnen geantwortet. Abwesenheitsnotizen und andere automatische Antworten kommen nichtclassification, lead_email, campaign_id, subject, snippet
reply.positiveEine Antwort wurde als interessiert eingeordnetDasselbe wie oben
email.bouncedEine Kampagnen-E-Mail ist gebounctlead_email, campaign_id, subject
email.unsubscribedJemand will keine E-Mails mehr, hat sich beschwert oder den Abmeldelink benutztclassification, lead_email, campaign_id, subject, snippet, beim Abmeldelink dazu source
campaign.pausedDer 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.resumedDer Monat hat neu begonnen oder der Plan ist größer geworden, der Versand geht weitercampaign_id, campaign_name, reason, campaign_emails
export.readyEin Export ist fertigjob_id, status, total_rows, verified_rows, status_url, download_url
list.readyEine Liste ist fertig befüllt, auch nachdem du Personen hinzugefügt hastlist_id, list_name, job_id, status, total_items, note, status_url
verification.completedEine einzelne E-Mail-Prüfung mit einem API-Schlüssel ist fertigemail, status, deliverable, is_role_based, is_free, is_disposable
segment.new_matchesEine gespeicherte Liste hat neue Personen, die zu ihren Filtern passenlist_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

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

AufrufWas er tut
GET /api/v1/webhooksDeine 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}/testEinen signierten Testaufruf senden
GET /api/v1/webhooks/{id}/deliveriesLetzte Aufrufe mit Ergebnis und nächstem Versuch

Was dein Server bekommt

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

Python
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)
Node
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.