Webhooks
Ereignisse per Webhook empfangen
Webhook-Endpunkte auflisten
/v1/webhooksread:webhooksRecht: IntegrationenliestAlle Webhook-Endpunkte des Kontos, neueste zuerst, wie unter Einstellungen, Integrationen, Webhooks in der App. Auch die in der App angelegten. Das Geheimnis für die Signatur wird hier nie ausgegeben.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
activebooleanNur aktive (true) oder nur ausgeschaltete (false)
Felder der Antwort
idstring (uuid)ID des Webhook-Endpunkts
namestringAnzeigename in der App
urlstringZieladresse
eventsListe aus stringAbonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)
activebooleanNur aktive Endpunkte bekommen Ereignisse (Schalter in der App)
events_without_triggerListe aus stringAbonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)
total_deliveriesintegerZustellversuche insgesamt
successful_deliveriesintegerdavon mit Antwort 2xx
failed_deliveriesintegerdavon fehlgeschlagen (kein 2xx oder nicht erreichbar)
last_triggered_atstring (date-time), kann null seinLetzter Zustellversuch, null, solange noch keiner stattfand
last_success_atstring (date-time), kann null seinLetzte erfolgreiche Zustellung (Antwort 2xx), sonst null
last_failure_atstring (date-time), kann null seinLetzte fehlgeschlagene Zustellung, sonst null
created_atstring (date-time)Zeitpunkt der Anlage
updated_atstring (date-time)Zeitpunkt der letzten Änderung, ohne eigenen Wert der Zeitpunkt der Anlage
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/webhooks" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks", {
method: "GET",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
},
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.dealsky.io/functions/v1/api/v1/webhooks",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "4e5f6a7b-8c9d-4e0f-8a1b-2c3d4e5f6a7b",
"name": "CRM Sync",
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"linkedin.connection_accepted",
"linkedin.replied"
],
"active": true,
"events_without_trigger": [],
"total_deliveries": 128,
"successful_deliveries": 126,
"failed_deliveries": 2,
"last_triggered_at": "2026-10-18T12:02:00.000Z",
"last_success_at": "2026-10-18T12:02:00.000Z",
"last_failure_at": "2026-10-12T07:15:00.000Z",
"created_at": "2026-09-30T14:00:00.000Z",
"updated_at": "2026-09-30T14:00:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Webhook-Endpunkt anlegen
/v1/webhookswrite:webhooksRecht: IntegrationenschreibtLegt einen Endpunkt an wie „Webhook hinzufügen“ in der App: aktiv, mit eigenem Geheimnis für die Signatur. Das Geheimnis steht nur in dieser Antwort (secret), über die API danach nie wieder; bitte sofort sicher speichern. Höchstens 10 Endpunkte je Konto, wie in der App (sonst 422 mit details.reason = "limit_reached"). Fehlt name, wird der Hostname der Adresse genommen.
Adresse: nur öffentliche https://-Adressen bis 2048 Zeichen. Abgelehnt werden IP-Adressen (auch in Dezimal- oder Hex-Schreibweise), localhost, .local, .internal und Adressen mit Zugangsdaten. dealsky ruft die Adresse beim Anlegen nicht auf.
Zustellbare Ereignisse: landing_page.visited, booking.confirmed, landing_page.deletion_requested, linkedin.connection_accepted, linkedin.connection_declined, linkedin.replied. Andere Häkchen der App (E-Mail, Brief, Video gestartet, Video 50 %, Video komplett, Buchungsseite geöffnet, Hot Lead) haben derzeit keinen Auslöser und werden darum hier nicht angenommen.
Zustellung: dealsky schickt jedes Ereignis einmal per POST mit Content-Type: application/json an jede aktive, passende Adresse. Es gibt keinen erneuten Versuch. Antwortet die Adresse nicht mit 2xx, zählt das als fehlgeschlagen (failed_deliveries, Zustellprotokoll in der App). Bitte schnell mit 2xx antworten und die Arbeit danach erledigen. Die Zustellung übernimmt dieselbe Stelle wie für Webhooks aus der App; diese API legt nur die Endpunkte an.
Header: X-Webhook-Signature (Signatur, Hex), X-Webhook-Event (Name des Ereignisses), X-Webhook-Timestamp (Zeitpunkt, derselbe Wert wie timestamp im Body).
Nutzlast: { "event", "timestamp", "tenant_id", "data" }. In data stehen lead_id, je nach Ereignis lead_name und company_name, die Einzelheiten in event_details und, wenn ein Lead bekannt ist, der ganze Lead in lead. Beispiele je Ereignis: GET /v1/webhooks/events.
Signatur prüfen: HMAC-SHA256 über den unveränderten Body (die Bytes, wie sie ankommen, nicht neu serialisiert), Schlüssel ist das Geheimnis aus der Antwort von POST /v1/webhooks als Text (UTF-8, die 64 Zeichen selbst, nicht hex-dekodiert). Das Ergebnis als Hex in Kleinbuchstaben muss X-Webhook-Signature gleichen; zeitkonstant vergleichen. Der Zeitstempel-Header ist nicht signiert, timestamp im Body schon: gegen Wiederholungen den Body-Wert prüfen (z. B. höchstens 5 Minuten alt).
Node.js: crypto.createHmac("sha256", secret).update(rawBody).digest("hex"), dann crypto.timingSafeEqual. Python: hmac.compare_digest(hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest(), signature).
Testen: Einen Test-Aufruf gibt es über die API bewusst nicht (er würde eine fremde Adresse aufrufen). In der App unter Einstellungen, Integrationen, Webhooks schickt „Test“ das erste abonnierte Ereignis des Endpunkts mit data.test = true, und zwar an jeden aktiven Endpunkt, der dieses Ereignis abonniert hat. Mit Test-Key wird alles geprüft, aber nichts angelegt und kein Geheimnis erzeugt.
Webhooks sind wie in der App ab dem Growth-Tarif enthalten (sonst 402).
Body
urlstring (uri)Pflichtmax. 2048 ZeichenÖffentliche https-Adresse, an die dealsky die Ereignisse per POST schickt. Keine IP-Adressen, kein localhost, .local oder .internal, keine Zugangsdaten in der Adresse
eventsListe aus stringPflichtmax. 20 EinträgeEreignisse, die an diese Adresse gehen. Erlaubt sind nur die, die dealsky heute wirklich sendet: landing_page.visited, booking.confirmed, landing_page.deletion_requested, linkedin.connection_accepted, linkedin.connection_declined, linkedin.replied. Nutzlast je Ereignis: GET /v1/webhooks/events
landing_page.visitedbooking.confirmedlanding_page.deletion_requestedlinkedin.connection_acceptedlinkedin.connection_declinedlinkedin.repliednamestringmax. 200 ZeichenAnzeigename in der App
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/webhooks" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"booking.confirmed"
]
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"booking.confirmed"
]
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/webhooks",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"booking.confirmed"
]
},
)
print(res.json()){
"ok": true,
"data": {
"id": "6a7b8c9d-0e1f-4a2b-9c3d-4e5f6a7b8c9d",
"name": "hooks.beispiel.de",
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"booking.confirmed"
],
"active": true,
"events_without_trigger": [],
"total_deliveries": 0,
"successful_deliveries": 0,
"failed_deliveries": 0,
"last_triggered_at": null,
"last_success_at": null,
"last_failure_at": null,
"created_at": "2026-10-18T14:00:00.000Z",
"updated_at": "2026-10-18T14:00:00.000Z",
"secret": "9f2c4e6a8b0d1f3e5a7c9b1d3f5e7a9c2b4d6f8a0c1e3b5d7f9a2c4e6b8d0f1a"
},
"meta": {
"request_id": "req_7f3a…"
}
}Ereignisse und ihre Nutzlast
/v1/webhooks/eventsread:webhooksRecht: IntegrationenliestDie Ereignisse, die ein Webhook-Endpunkt abonnieren kann, mit Anlass und einer Beispiel-Nutzlast genau in der Form, in der dealsky sie sendet. Feste Liste, unabhängig vom Konto.
Zustellbare Ereignisse: landing_page.visited, booking.confirmed, landing_page.deletion_requested, linkedin.connection_accepted, linkedin.connection_declined, linkedin.replied. Andere Häkchen der App (E-Mail, Brief, Video gestartet, Video 50 %, Video komplett, Buchungsseite geöffnet, Hot Lead) haben derzeit keinen Auslöser und werden darum hier nicht angenommen.
Felder der Antwort
eventstringName, wie er in events und im Header X-Webhook-Event steht
descriptionstringWann das Ereignis kommt
exampleobjectBody, wie dealsky ihn per POST schickt
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/webhooks/events" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks/events", {
method: "GET",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
},
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.dealsky.io/functions/v1/api/v1/webhooks/events",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"event": "landing_page.visited",
"description": "Ein Lead hat seine persönliche Landingpage geöffnet. Kommt bei jedem Seitenaufruf, Bots werden vorher herausgefiltert. Nur wenn das Landingpage-Tracking im Konto eingeschaltet ist.",
"example": {
"event": "landing_page.visited",
"timestamp": "2026-10-18T09:12:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"lead_name": "Max Mustermann",
"company_name": "Beispiel GmbH",
"event_details": {
"slug": "max-mustermann",
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
},
{
"event": "booking.confirmed",
"description": "Ein Lead hat über die Buchungsseite seiner Landingpage einen Termin gebucht (Bestätigungsseite geöffnet). dealsky stoppt dabei laufende Sequenzen dieses Leads.",
"example": {
"event": "booking.confirmed",
"timestamp": "2026-10-18T09:30:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"lead_name": "Max Mustermann",
"company_name": "Beispiel GmbH",
"event_details": {
"slug": "max-mustermann",
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
},
{
"event": "landing_page.deletion_requested",
"description": "Ein Lead hat auf seiner Landingpage die Löschung seiner Daten beantragt. dealsky vermerkt den Antrag am Lead; gelöscht wird erst, wenn das Konto es tut.",
"example": {
"event": "landing_page.deletion_requested",
"timestamp": "2026-10-18T10:05:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"lead_name": "Max Mustermann",
"company_name": "Beispiel GmbH",
"event_details": {
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"requested_at": "2026-10-18T10:05:00.000Z"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
},
{
"event": "linkedin.connection_accepted",
"description": "Ein Lead hat eine Vernetzungsanfrage aus einer Kampagne angenommen. Kommt einmal je Lead und Sequenz, egal ob LinkedIn die Annahme meldet (detection_source webhook) oder dealsky sie beim Abgleich findet (polling, inline_check).",
"example": {
"event": "linkedin.connection_accepted",
"timestamp": "2026-10-18T11:20:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"event_details": {
"sequence_id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f",
"detection_source": "webhook",
"match_method": "profile_id"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
},
{
"event": "linkedin.connection_declined",
"description": "LinkedIn meldet, dass ein Lead eine Vernetzungsanfrage abgelehnt hat, auf die eine Kampagne gerade wartet. Die Sequenz endet für diesen Lead.",
"example": {
"event": "linkedin.connection_declined",
"timestamp": "2026-10-18T11:45:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"event_details": {
"profile_id": "ACoAAB1x2y3z4A5b6C7d8E9f0G"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
},
{
"event": "linkedin.replied",
"description": "Auf einem verbundenen LinkedIn-Konto ist eine Nachricht eingegangen. lead_id ist null und lead fehlt, wenn dealsky den Absender keinem Lead zuordnen konnte. Meldet LinkedIn eine Nachricht doppelt, kommt auch das Ereignis doppelt; zum Entdoppeln event_details.message_id nutzen.",
"example": {
"event": "linkedin.replied",
"timestamp": "2026-10-18T12:02:00.000Z",
"tenant_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"event_details": {
"chat_id": "1rT5vX9zQ2mN4bL6",
"message_id": "8kP3sW7yD1fH5jC9",
"message_preview": "Hallo Herr Schmidt, danke für die Nachricht. Passt Ihnen Donnerstag?"
},
"lead": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"email": "max.mustermann@beispiel.de",
"first_name": "Max",
"last_name": "Mustermann",
"full_name": "Max Mustermann",
"salutation": "Herr",
"anrede": "Herr",
"company": "Beispiel GmbH",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"phone": "+49 3012 3456",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"website": "https://beispiel.de",
"street": "Musterstraße 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"full_address": "Musterstraße 1, 10115 Berlin, DE",
"score": 42,
"stage": "warm",
"status": "contacted",
"employees": "11-50",
"keywords": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"qr_code_url": null,
"logo_url": null,
"notes": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z",
"last_activity_at": "2026-10-18T09:12:00.000Z"
}
}
}
}
],
"meta": {
"request_id": "req_7f3a…"
}
}Einen Webhook-Endpunkt abrufen
/v1/webhooks/{id}read:webhooksRecht: IntegrationenliestEndpunkt mit Zustell-Statistik. Das Geheimnis für die Signatur wird hier nie ausgegeben.
Pfad-Parameter
idstring (uuid)PflichtID des Webhook-Endpunkts
Felder der Antwort
idstring (uuid)ID des Webhook-Endpunkts
namestringAnzeigename in der App
urlstringZieladresse
eventsListe aus stringAbonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)
activebooleanNur aktive Endpunkte bekommen Ereignisse (Schalter in der App)
events_without_triggerListe aus stringAbonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)
total_deliveriesintegerZustellversuche insgesamt
successful_deliveriesintegerdavon mit Antwort 2xx
failed_deliveriesintegerdavon fehlgeschlagen (kein 2xx oder nicht erreichbar)
last_triggered_atstring (date-time), kann null seinLetzter Zustellversuch, null, solange noch keiner stattfand
last_success_atstring (date-time), kann null seinLetzte erfolgreiche Zustellung (Antwort 2xx), sonst null
last_failure_atstring (date-time), kann null seinLetzte fehlgeschlagene Zustellung, sonst null
created_atstring (date-time)Zeitpunkt der Anlage
updated_atstring (date-time)Zeitpunkt der letzten Änderung, ohne eigenen Wert der Zeitpunkt der Anlage
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10", {
method: "GET",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
},
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"id": "4e5f6a7b-8c9d-4e0f-8a1b-2c3d4e5f6a7b",
"name": "CRM Sync",
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"linkedin.connection_accepted",
"linkedin.replied"
],
"active": true,
"events_without_trigger": [],
"total_deliveries": 128,
"successful_deliveries": 126,
"failed_deliveries": 2,
"last_triggered_at": "2026-10-18T12:02:00.000Z",
"last_success_at": "2026-10-18T12:02:00.000Z",
"last_failure_at": "2026-10-12T07:15:00.000Z",
"created_at": "2026-09-30T14:00:00.000Z",
"updated_at": "2026-09-30T14:00:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Webhook-Endpunkt ändern oder an- und ausschalten
/v1/webhooks/{id}write:webhooksRecht: IntegrationenschreibtNur übergebene Felder werden geändert. active: false schaltet den Endpunkt aus wie der Schalter in der App, events ersetzt die ganze Liste. Eine neue Adresse wird geprüft wie beim Anlegen. Das Geheimnis bleibt gleich und wird nicht ausgegeben.
Zustellbare Ereignisse: landing_page.visited, booking.confirmed, landing_page.deletion_requested, linkedin.connection_accepted, linkedin.connection_declined, linkedin.replied. Andere Häkchen der App (E-Mail, Brief, Video gestartet, Video 50 %, Video komplett, Buchungsseite geöffnet, Hot Lead) haben derzeit keinen Auslöser und werden darum hier nicht angenommen.
Pfad-Parameter
idstring (uuid)PflichtID des Webhook-Endpunkts
Body
namestringmax. 200 ZeichenAnzeigename in der App
urlstring (uri)max. 2048 ZeichenÖffentliche https-Adresse, an die dealsky die Ereignisse per POST schickt. Keine IP-Adressen, kein localhost, .local oder .internal, keine Zugangsdaten in der Adresse
eventsListe aus stringmax. 20 EinträgeEreignisse, die an diese Adresse gehen. Erlaubt sind nur die, die dealsky heute wirklich sendet: landing_page.visited, booking.confirmed, landing_page.deletion_requested, linkedin.connection_accepted, linkedin.connection_declined, linkedin.replied. Nutzlast je Ereignis: GET /v1/webhooks/events
landing_page.visitedbooking.confirmedlanding_page.deletion_requestedlinkedin.connection_acceptedlinkedin.connection_declinedlinkedin.repliedactivebooleanAn oder aus
Felder der Antwort
idstring (uuid)ID des Webhook-Endpunkts
namestringAnzeigename in der App
urlstringZieladresse
eventsListe aus stringAbonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)
activebooleanNur aktive Endpunkte bekommen Ereignisse (Schalter in der App)
events_without_triggerListe aus stringAbonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)
total_deliveriesintegerZustellversuche insgesamt
successful_deliveriesintegerdavon mit Antwort 2xx
failed_deliveriesintegerdavon fehlgeschlagen (kein 2xx oder nicht erreichbar)
last_triggered_atstring (date-time), kann null seinLetzter Zustellversuch, null, solange noch keiner stattfand
last_success_atstring (date-time), kann null seinLetzte erfolgreiche Zustellung (Antwort 2xx), sonst null
last_failure_atstring (date-time), kann null seinLetzte fehlgeschlagene Zustellung, sonst null
created_atstring (date-time)Zeitpunkt der Anlage
updated_atstring (date-time)Zeitpunkt der letzten Änderung, ohne eigenen Wert der Zeitpunkt der Anlage
Mögliche Fehler
curl -X PATCH "https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"active": false
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10", {
method: "PATCH",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"active": false
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"PATCH",
"https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"active": False
},
)
print(res.json()){
"ok": true,
"data": {
"id": "4e5f6a7b-8c9d-4e0f-8a1b-2c3d4e5f6a7b",
"name": "CRM Sync",
"url": "https://hooks.beispiel.de/dealsky",
"events": [
"linkedin.connection_accepted",
"linkedin.replied"
],
"active": false,
"events_without_trigger": [],
"total_deliveries": 128,
"successful_deliveries": 126,
"failed_deliveries": 2,
"last_triggered_at": "2026-10-18T12:02:00.000Z",
"last_success_at": "2026-10-18T12:02:00.000Z",
"last_failure_at": "2026-10-12T07:15:00.000Z",
"created_at": "2026-09-30T14:00:00.000Z",
"updated_at": "2026-09-30T14:00:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Webhook-Endpunkt löschen
/v1/webhooks/{id}write:webhooksRecht: IntegrationenschreibtLöscht den Endpunkt wie „Löschen“ in der App, samt seinem Zustellprotokoll. Danach gehen keine Ereignisse mehr an die Adresse. Zapier-Verbindungen sind davon nicht betroffen. Wer nur pausieren will, nutzt PATCH mit active: false.
Pfad-Parameter
idstring (uuid)PflichtID des Webhook-Endpunkts
Felder der Antwort
deletedbooleantrue: Der Endpunkt wurde gelöscht
idstring (uuid)ID des gelöschten Endpunkts
Mögliche Fehler
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10", {
method: "DELETE",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
},
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.dealsky.io/functions/v1/api/v1/webhooks/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"deleted": true,
"id": "4e5f6a7b-8c9d-4e0f-8a1b-2c3d4e5f6a7b"
},
"meta": {
"request_id": "req_7f3a…"
}
}