dealsky.ioDocs
Zur App
API-Referenz

Webhooks

Ereignisse per Webhook empfangen

#

Webhook-Endpunkte auflisten

GET/v1/webhooks
Scope read:webhooksRecht: Integrationenliest

Alle 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 100

    Einträge pro Seite (Standard 25, höchstens 100)

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

  • activeboolean

    Nur aktive (true) oder nur ausgeschaltete (false)

Felder der Antwort
  • idstring (uuid)

    ID des Webhook-Endpunkts

  • namestring

    Anzeigename in der App

  • urlstring

    Zieladresse

  • eventsListe aus string

    Abonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)

  • activeboolean

    Nur aktive Endpunkte bekommen Ereignisse (Schalter in der App)

  • events_without_triggerListe aus string

    Abonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)

  • total_deliveriesinteger

    Zustellversuche insgesamt

  • successful_deliveriesinteger

    davon mit Antwort 2xx

  • failed_deliveriesinteger

    davon fehlgeschlagen (kein 2xx oder nicht erreichbar)

  • last_triggered_atstring (date-time), kann null sein

    Letzter Zustellversuch, null, solange noch keiner stattfand

  • last_success_atstring (date-time), kann null sein

    Letzte erfolgreiche Zustellung (Antwort 2xx), sonst null

  • last_failure_atstring (date-time), kann null sein

    Letzte 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

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING429 RATE_LIMITED
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())
Antwort 200
{
  "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

POST/v1/webhooks
Scope write:webhooksRecht: Integrationenschreibt

Legt 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äge

    Ereignisse, 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.visited booking.confirmed landing_page.deletion_requested linkedin.connection_accepted linkedin.connection_declined linkedin.replied
  • namestringmax. 200 Zeichen

    Anzeigename in der App

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING409 CONFLICT429 RATE_LIMITED
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())
Antwort 201
{
  "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

GET/v1/webhooks/events
Scope read:webhooksRecht: Integrationenliest

Die 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
  • eventstring

    Name, wie er in events und im Header X-Webhook-Event steht

  • descriptionstring

    Wann das Ereignis kommt

  • exampleobject

    Body, wie dealsky ihn per POST schickt

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING429 RATE_LIMITED
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())
Antwort 200
{
  "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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

GET/v1/webhooks/{id}
Scope read:webhooksRecht: Integrationenliest

Endpunkt mit Zustell-Statistik. Das Geheimnis für die Signatur wird hier nie ausgegeben.

Pfad-Parameter

  • idstring (uuid)Pflicht

    ID des Webhook-Endpunkts

Felder der Antwort
  • idstring (uuid)

    ID des Webhook-Endpunkts

  • namestring

    Anzeigename in der App

  • urlstring

    Zieladresse

  • eventsListe aus string

    Abonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)

  • activeboolean

    Nur aktive Endpunkte bekommen Ereignisse (Schalter in der App)

  • events_without_triggerListe aus string

    Abonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)

  • total_deliveriesinteger

    Zustellversuche insgesamt

  • successful_deliveriesinteger

    davon mit Antwort 2xx

  • failed_deliveriesinteger

    davon fehlgeschlagen (kein 2xx oder nicht erreichbar)

  • last_triggered_atstring (date-time), kann null sein

    Letzter Zustellversuch, null, solange noch keiner stattfand

  • last_success_atstring (date-time), kann null sein

    Letzte erfolgreiche Zustellung (Antwort 2xx), sonst null

  • last_failure_atstring (date-time), kann null sein

    Letzte 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

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
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())
Antwort 200
{
  "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

PATCH/v1/webhooks/{id}
Scope write:webhooksRecht: Integrationenschreibt

Nur ü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)Pflicht

    ID des Webhook-Endpunkts

Body

  • namestringmax. 200 Zeichen

    Anzeigename 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äge

    Ereignisse, 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.visited booking.confirmed landing_page.deletion_requested linkedin.connection_accepted linkedin.connection_declined linkedin.replied
  • activeboolean

    An oder aus

Felder der Antwort
  • idstring (uuid)

    ID des Webhook-Endpunkts

  • namestring

    Anzeigename in der App

  • urlstring

    Zieladresse

  • eventsListe aus string

    Abonnierte Ereignisse. Endpunkte aus der App können auch Ereignisse enthalten, die nie gesendet werden (siehe events_without_trigger)

  • activeboolean

    Nur aktive Endpunkte bekommen Ereignisse (Schalter in der App)

  • events_without_triggerListe aus string

    Abonnierte Ereignisse, die dealsky derzeit nie sendet (in der App auswählbar, aber ohne Auslöser)

  • total_deliveriesinteger

    Zustellversuche insgesamt

  • successful_deliveriesinteger

    davon mit Antwort 2xx

  • failed_deliveriesinteger

    davon fehlgeschlagen (kein 2xx oder nicht erreichbar)

  • last_triggered_atstring (date-time), kann null sein

    Letzter Zustellversuch, null, solange noch keiner stattfand

  • last_success_atstring (date-time), kann null sein

    Letzte erfolgreiche Zustellung (Antwort 2xx), sonst null

  • last_failure_atstring (date-time), kann null sein

    Letzte 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

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND409 CONFLICT429 RATE_LIMITED
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())
Antwort 200
{
  "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

DEL/v1/webhooks/{id}
Scope write:webhooksRecht: Integrationenschreibt

Lö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)Pflicht

    ID des Webhook-Endpunkts

Felder der Antwort
  • deletedboolean

    true: Der Endpunkt wurde gelöscht

  • idstring (uuid)

    ID des gelöschten Endpunkts

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
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())
Antwort 200
{
  "ok": true,
  "data": {
    "deleted": true,
    "id": "4e5f6a7b-8c9d-4e0f-8a1b-2c3d4e5f6a7b"
  },
  "meta": {
    "request_id": "req_7f3a…"
  }
}