dealsky.ioDocs
Zur App
API-Referenz

Kampagnen

LinkedIn-Kampagnen, ihre Sequenzen und Kennzahlen lesen

#

Kampagnen auflisten

GET/v1/campaigns
Scope read:campaignsRecht: Übersicht und Statistiken ansehenliest

Neueste zuerst, wie die Kampagnenliste der App. progress zählt die Leads in der Sequenz in drei Gruppen (offen, mit Ergebnis, abgebrochen) und rechnet den Fortschritt wie die Liste. Eine Lead-Anzahl aus der Kampagnenzeile gibt es bewusst nicht (sie ist dort oft veraltet); die gezählte steht in GET /v1/campaigns/{id}. Sichtbar sind nur Kampagnen auf LinkedIn-Konten, auf die die Person hinter dem Key Zugriff hat.

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

  • statusListe aus string

    Ein oder mehrere Status, kommagetrennt

    draft active sent paused completed stopped archived
  • qstringmax. 200 Zeichen

    Teil des Namens (Groß/Klein egal)

Felder der Antwort
  • idstring (uuid)

    ID der Kampagne

  • namestring

    Name der Kampagne

  • statusstring

    Status der Kampagne, z. B. draft (Entwurf), active (läuft), paused, completed, stopped, archived

    draft active sent paused completed stopped archived
  • orchestration_statusstring, kann null sein

    Stand der Ausführung: draft, scheduled, running, paused, completed, failed, stopped

  • channelsListe aus string

    Kanäle, z. B. linkedin

  • campaign_typestring, kann null sein

    Art aus den Schritten der Sequenz: connect_only (Vernetzen), message_only (Nachrichten an Kontakte), connect_and_message

    connect_only message_only connect_and_message
  • linkedin_accountobject, kann null sein

    Verknüpftes LinkedIn-Konto (nur sichtbar, wenn der Key-Ersteller Zugriff auf das Konto hat)

    Felder anzeigen
    • idstring (uuid)

      ID des LinkedIn-Kontos (siehe /v1/linkedin/accounts)

    • namestring, kann null sein

      Anzeigename des Kontos, null ohne Namen

    • connection_statusstring, kann null sein

      connected, pending_verification, broken, disconnected, error

  • sequence_idstring (uuid), kann null sein

    Verknüpfte LinkedIn-Sequenz, null ohne Sequenz (z. B. Entwurf)

  • list_idstring (uuid), kann null sein

    Lead-Liste, aus der die Kampagne befüllt wurde

  • progressobject, kann null sein

    Fortschritt wie die Kampagnenliste der App. null, wenn die Zählung gerade nicht verfügbar ist.

    Felder anzeigen
    • totalinteger

      Eingeschriebene Leads (Zeilen der Sequenz)

    • openinteger

      Noch in Arbeit: pending, active, in_progress, waiting_for_connection, paused, paused_no_credits

    • resultinteger

      Mit Ergebnis durch: completed, replied, booked

    • abortedinteger

      Ohne Ergebnis raus: failed, excluded, stopped

    • stoppedinteger

      Absichtlich gestoppt oder ausgeschlossen (Teil von aborted)

    • failedinteger

      Echte Fehlschläge (Teil von aborted)

    • percentinteger, kann null sein

      Durch, egal wie, in Prozent. 100 nur, wenn niemand mehr offen ist. null ohne Leads.

  • start_datestring (date-time), kann null sein

    Startdatum der Kampagne, null ohne Angabe

  • end_datestring (date-time), kann null sein

    Enddatum der Kampagne, null ohne Angabe

  • created_atstring (date-time), kann null sein

    Angelegt am

  • updated_atstring (date-time), kann null sein

    Zuletzt geändert am

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/campaigns" \
  -H "X-API-Key: $DEALSKY_API_KEY"
const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/campaigns", {
  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/campaigns",
    headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json())
Antwort 200
{
  "ok": true,
  "data": [
    {
      "id": "c7a1e2d3-4b5c-4d6e-8f70-1a2b3c4d5e6f",
      "name": "Geschäftsführer Logistik NRW",
      "status": "active",
      "orchestration_status": "running",
      "channels": [
        "linkedin"
      ],
      "campaign_type": "connect_and_message",
      "linkedin_account": {
        "id": "acc4e2d1-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
        "name": "Anna Beispiel",
        "connection_status": "connected"
      },
      "sequence_id": "5e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b",
      "list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
      "progress": {
        "total": 240,
        "open": 150,
        "result": 72,
        "aborted": 18,
        "stopped": 15,
        "failed": 3,
        "percent": 37
      },
      "start_date": "2026-10-01T08:00:00.000Z",
      "end_date": null,
      "created_at": "2026-09-30T14:12:00.000Z",
      "updated_at": "2026-10-18T09:00:00.000Z"
    }
  ],
  "meta": {
    "request_id": "req_7f3a…",
    "next_cursor": null,
    "has_more": false
  }
}
#

Eine Kampagne abrufen

GET/v1/campaigns/{id}
Scope read:campaignsRecht: Übersicht und Statistiken ansehenliest

Stammdaten, Status, verknüpftes LinkedIn-Konto, Sequenz mit Zeitplan und Tageslimits, Fortschritt und die gezählte Lead-Anzahl (ohne archivierte Leads, bei beendeten Kampagnen mit). Zeitplan und Limits stammen aus der Sequenz. Bei einem Entwurf stehen die Tageslimits noch im Aufbau der Kampagne (der Start überträgt sie in die Sequenz), dann gelten diese. Fehlt ein Wert, steht der Standard, den die App anzeigt und mit dem sie arbeitet.

Pfad-Parameter

  • idstring (uuid)Pflicht

    ID der Kampagne

Felder der Antwort
  • idstring (uuid)

    ID der Kampagne

  • namestring

    Name der Kampagne

  • statusstring

    Status der Kampagne, z. B. draft (Entwurf), active (läuft), paused, completed, stopped, archived

    draft active sent paused completed stopped archived
  • orchestration_statusstring, kann null sein

    Stand der Ausführung: draft, scheduled, running, paused, completed, failed, stopped

  • channelsListe aus string

    Kanäle, z. B. linkedin

  • campaign_typestring, kann null sein

    Art aus den Schritten der Sequenz: connect_only (Vernetzen), message_only (Nachrichten an Kontakte), connect_and_message

    connect_only message_only connect_and_message
  • linkedin_accountobject, kann null sein

    Verknüpftes LinkedIn-Konto (nur sichtbar, wenn der Key-Ersteller Zugriff auf das Konto hat)

    Felder anzeigen
    • idstring (uuid)

      ID des LinkedIn-Kontos (siehe /v1/linkedin/accounts)

    • namestring, kann null sein

      Anzeigename des Kontos, null ohne Namen

    • connection_statusstring, kann null sein

      connected, pending_verification, broken, disconnected, error

  • sequence_idstring (uuid), kann null sein

    Verknüpfte LinkedIn-Sequenz, null ohne Sequenz (z. B. Entwurf)

  • list_idstring (uuid), kann null sein

    Lead-Liste, aus der die Kampagne befüllt wurde

  • progressobject, kann null sein

    Fortschritt wie die Kampagnenliste der App. null, wenn die Zählung gerade nicht verfügbar ist.

    Felder anzeigen
    • totalinteger

      Eingeschriebene Leads (Zeilen der Sequenz)

    • openinteger

      Noch in Arbeit: pending, active, in_progress, waiting_for_connection, paused, paused_no_credits

    • resultinteger

      Mit Ergebnis durch: completed, replied, booked

    • abortedinteger

      Ohne Ergebnis raus: failed, excluded, stopped

    • stoppedinteger

      Absichtlich gestoppt oder ausgeschlossen (Teil von aborted)

    • failedinteger

      Echte Fehlschläge (Teil von aborted)

    • percentinteger, kann null sein

      Durch, egal wie, in Prozent. 100 nur, wenn niemand mehr offen ist. null ohne Leads.

  • start_datestring (date-time), kann null sein

    Startdatum der Kampagne, null ohne Angabe

  • end_datestring (date-time), kann null sein

    Enddatum der Kampagne, null ohne Angabe

  • created_atstring (date-time), kann null sein

    Angelegt am

  • updated_atstring (date-time), kann null sein

    Zuletzt geändert am

  • descriptionstring, kann null sein

    Beschreibung der Kampagne, null ohne Text

  • leads_countinteger

    Leads mit dieser Kampagne (gezählt, ohne archivierte; bei beendeten Kampagnen mit archivierten)

  • sequenceobject, kann null sein

    Verknüpfte LinkedIn-Sequenz, null ohne Sequenz

    Felder anzeigen
    • idstring (uuid)

      ID der Sequenz

    • namestring, kann null sein

      Name der Sequenz, null ohne Namen

    • categorystring, kann null sein

      connection (Vernetzungskampagne) oder outreach

    • statusstring, kann null sein

      Status der Sequenz, z. B. active, paused, draft

    • orchestration_statusstring, kann null sein

      running, paused, stopped, completed. Nur running versendet.

  • scheduleobject, kann null sein

    Zeitplan der Sequenz. Fehlende Werte zeigen den Standard der App.

    Felder anzeigen
    • timezonestring

      Zeitzone des Zeitplans, Standard Europe/Berlin

    • active_daysListe aus integer

      Aktive Wochentage, 0 = Sonntag, 1 = Montag … 6 = Samstag

    • activity_windowsListe aus object

      Uhrzeiten, in denen Aktionen laufen

      Felder anzeigen
      • start_hourinteger

        Beginn des Fensters, volle Stunde (0 bis 23) in der Zeitzone des Zeitplans

      • end_hourinteger

        Ende des Fensters, volle Stunde, ausschließlich

    • max_leads_per_hourinteger

      Neue Leads je Stunde

  • daily_limitsobject, kann null sein

    Tageslimits dieser Kampagne. Unabhängig davon gelten je LinkedIn-Konto 150 Vernetzungsanfragen pro Woche.

    Felder anzeigen
    • connection_requestsinteger

      Vernetzungsanfragen pro Tag (Standard 35)

    • messagesinteger

      Nachrichten pro Tag (Standard 40)

    • profile_viewsinteger

      Profilbesuche pro Tag (Standard 60)

    • followsinteger, kann null sein

      Folgen pro Tag, null ohne eigenes Limit

    • likesinteger, kann null sein

      Reaktionen auf Beiträge pro Tag, null ohne eigenes Limit

  • stop_conditionsobject, kann null sein

    Sequenz stoppt bei Antwort bzw. Termin

    Felder anzeigen
    • on_replyboolean

      Sequenz stoppt für einen Lead, sobald er antwortet (Standard true)

    • on_bookingboolean

      Sequenz stoppt für einen Lead, sobald er einen Termin bucht (Standard true)

  • landing_pageobject, kann null sein

    Persönliche Landingpage je Lead, falls eingerichtet

    Felder anzeigen
    • template_idstring (uuid), kann null sein

      Vorlage der Landingpage, null ohne Vorlage

    • template_namestring, kann null sein

      Name der Vorlage zum Zeitpunkt der Einrichtung

    • videostring, kann null sein

      Video auf der Seite: static (für alle gleich), personalized (je Lead erzeugt), null ohne Video

      static personalized

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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
  -H "X-API-Key: $DEALSKY_API_KEY"
const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/campaigns/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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
    headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json())
Antwort 200
{
  "ok": true,
  "data": {
    "id": "c7a1e2d3-4b5c-4d6e-8f70-1a2b3c4d5e6f",
    "name": "Geschäftsführer Logistik NRW",
    "status": "active",
    "orchestration_status": "running",
    "channels": [
      "linkedin"
    ],
    "campaign_type": "connect_and_message",
    "linkedin_account": {
      "id": "acc4e2d1-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
      "name": "Anna Beispiel",
      "connection_status": "connected"
    },
    "sequence_id": "5e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b",
    "list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
    "progress": {
      "total": 240,
      "open": 150,
      "result": 72,
      "aborted": 18,
      "stopped": 15,
      "failed": 3,
      "percent": 37
    },
    "start_date": "2026-10-01T08:00:00.000Z",
    "end_date": null,
    "created_at": "2026-09-30T14:12:00.000Z",
    "updated_at": "2026-10-18T09:00:00.000Z",
    "description": null,
    "leads_count": 240,
    "sequence": {
      "id": "5e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b",
      "name": "Geschäftsführer Logistik NRW Sequenz",
      "category": "outreach",
      "status": "active",
      "orchestration_status": "running"
    },
    "schedule": {
      "timezone": "Europe/Berlin",
      "active_days": [
        1,
        2,
        3,
        4,
        5
      ],
      "activity_windows": [
        {
          "start_hour": 9,
          "end_hour": 11
        },
        {
          "start_hour": 13,
          "end_hour": 15
        },
        {
          "start_hour": 16,
          "end_hour": 18
        }
      ],
      "max_leads_per_hour": 3
    },
    "daily_limits": {
      "connection_requests": 25,
      "messages": 30,
      "profile_views": 40,
      "follows": null,
      "likes": null
    },
    "stop_conditions": {
      "on_reply": true,
      "on_booking": true
    },
    "landing_page": null
  },
  "meta": {
    "request_id": "req_7f3a…"
  }
}
#

Schritte der Sequenz

GET/v1/campaigns/{id}/steps
Scope read:campaignsRecht: Übersicht und Statistiken ansehenliest

Alle Schritte der Sequenz in der Reihenfolge der App: erst der Hauptpfad, dann der Pfad nach angenommener Vernetzung (if_yes), dann der Pfad ohne Annahme (if_no), jeweils nach step_order. Texte stehen mit ihren Platzhaltern ({{first_name}}, {{company}}, {{landing_page_url}} …) so, wie die App sie zeigt; A/B-Varianten, Sprachnachrichten, Video und KI-Opener sind aufgeschlüsselt. Ohne verknüpfte Sequenz (Entwurf) ist die Liste leer.

Pfad-Parameter

  • idstring (uuid)Pflicht

    ID der Kampagne

Felder der Antwort
  • idstring (uuid)

    ID des Schritts

  • step_orderinteger

    Reihenfolge innerhalb der Sequenz

  • branchstring

    main = Hauptpfad, if_yes = nach Annahme der Vernetzung, if_no = nicht angenommen

    main if_yes if_no
  • action_typestring

    view_profile, send_connection, send_message, send_voice, send_video, ai_opener, react_post, comment_post, follow, wait, withdraw_connection

  • labelstring

    Name des Schritts wie im Editor

  • wait_minutesinteger

    Wartezeit in Minuten (bei wait), bzw. Frist bis zum Zurückziehen (bei withdraw_connection)

  • wait_minutes_maxinteger, kann null sein

    Obergrenze der zufälligen Wartezeit

  • randomizedboolean

    Wartezeit wird je Lead zufällig zwischen wait_minutes und wait_minutes_max gewählt

  • textstring, kann null sein

    Text mit Platzhaltern wie {{first_name}} oder {{landing_page_url}}; bei ai_opener die Begrüßung

  • variantsListe aus object, kann null sein

    A/B-Test: alle Varianten, A ist text

    Felder anzeigen
    • keystring

      Kennung der Variante, A ist der Haupttext, danach B, C …

    • textstring

      Text der Variante mit Platzhaltern

  • audio_urlsListe aus string, kann null sein

    Sprachnachrichten (je Lead wird eine zufällig gewählt)

  • videoobject, kann null sein

    Video-Einstellungen, nur bei send_video

    Felder anzeigen
    • modestring

      static: ein festes Video für alle, personalized: Video wird je Lead erzeugt

      static personalized
    • video_urlstring, kann null sein

      URL des festen Videos, nur bei static

    • thumbnail_urlstring, kann null sein

      Vorschaubild des festen Videos, nur bei static

    • templatestring, kann null sein

      Vorlage des personalisierten Videos, nur bei personalized

  • reactionsListe aus string, kann null sein

    Reaktionen bei react_post (je Lead eine zufällig)

  • comment_image_urlstring, kann null sein

    Bild zum Kommentar, nur bei comment_post und comment_post_image

  • ai_openerobject, kann null sein

    Einstellungen des KI-Openers ({{ai_opener}} im Text oder Schritt ai_opener). Leer = Standard.

  • ai_opener_questionstring, kann null sein

    Frage, die als zweite Nachricht folgt

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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/steps" \
  -H "X-API-Key: $DEALSKY_API_KEY"
const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/steps", {
  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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/steps",
    headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json())
Antwort 200
{
  "ok": true,
  "data": [
    {
      "id": "9a1b2c3d-0000-4000-8000-000000000001",
      "step_order": 1,
      "branch": "main",
      "action_type": "view_profile",
      "label": "Profil ansehen",
      "wait_minutes": 0,
      "wait_minutes_max": null,
      "randomized": false,
      "text": null,
      "variants": null,
      "audio_urls": null,
      "video": null,
      "reactions": null,
      "comment_image_url": null,
      "ai_opener": null,
      "ai_opener_question": null
    },
    {
      "id": "9a1b2c3d-0000-4000-8000-000000000002",
      "step_order": 2,
      "branch": "main",
      "action_type": "send_connection",
      "label": "Vernetzungsanfrage",
      "wait_minutes": 0,
      "wait_minutes_max": null,
      "randomized": false,
      "text": null,
      "variants": null,
      "audio_urls": null,
      "video": null,
      "reactions": null,
      "comment_image_url": null,
      "ai_opener": null,
      "ai_opener_question": null
    },
    {
      "id": "9a1b2c3d-0000-4000-8000-000000000003",
      "step_order": 3,
      "branch": "if_yes",
      "action_type": "wait",
      "label": "Warten",
      "wait_minutes": 1440,
      "wait_minutes_max": 1800,
      "randomized": true,
      "text": null,
      "variants": null,
      "audio_urls": null,
      "video": null,
      "reactions": null,
      "comment_image_url": null,
      "ai_opener": null,
      "ai_opener_question": null
    },
    {
      "id": "9a1b2c3d-0000-4000-8000-000000000004",
      "step_order": 4,
      "branch": "if_yes",
      "action_type": "send_message",
      "label": "Nachricht senden",
      "wait_minutes": 0,
      "wait_minutes_max": null,
      "randomized": false,
      "text": "Hallo {{first_name}}, danke fürs Vernetzen! Kurze Frage zu {{company}}: Wie gewinnt ihr gerade neue Kunden?",
      "variants": [
        {
          "key": "A",
          "text": "Hallo {{first_name}}, danke fürs Vernetzen! Kurze Frage zu {{company}}: Wie gewinnt ihr gerade neue Kunden?"
        },
        {
          "key": "B",
          "text": "Hi {{first_name}}, schön, dass wir vernetzt sind. Darf ich fragen, wie {{company}} aktuell Neukunden gewinnt?"
        }
      ],
      "audio_urls": null,
      "video": null,
      "reactions": null,
      "comment_image_url": null,
      "ai_opener": null,
      "ai_opener_question": null
    },
    {
      "id": "9a1b2c3d-0000-4000-8000-000000000005",
      "step_order": 5,
      "branch": "if_no",
      "action_type": "withdraw_connection",
      "label": "Anfrage zurückziehen",
      "wait_minutes": 20160,
      "wait_minutes_max": null,
      "randomized": false,
      "text": null,
      "variants": null,
      "audio_urls": null,
      "video": null,
      "reactions": null,
      "comment_image_url": null,
      "ai_opener": null,
      "ai_opener_question": null
    }
  ],
  "meta": {
    "request_id": "req_7f3a…"
  }
}
#

Statistik und Funnel einer Kampagne

GET/v1/campaigns/{id}/stats
Scope read:campaignsRecht: Übersicht und Statistiken ansehenliest

Gerechnet wie der Reiter „Statistiken“ der App, mit denselben Formeln: Vernetzungsanfragen gesendet und angenommen (Annahmequote), Antwortquote je Person (Nenner: Personen mit mindestens einer Nachricht, also Text, Sprache, Video oder InMail), Antworten je Nachricht (eine Antwort zählt für die letzte Nachricht davor), Termine (Lead-Status booked oder Termin gesetzt, je Person einmal), gesendet je Schritt und die Funnel-Zeilen in der Reihenfolge des Reiters. Landingpage-Besuche, Video-Aufrufe, CTA-Klicks und Buchungen gibt es, wenn die Sequenz eine Landingpage nutzt. Die Übersicht im Dashboard rechnet „erreicht“ anders (über den erreichten Schritt) und kann abweichen. Bei großen Kampagnen dauert die Antwort einige Sekunden.

Pfad-Parameter

  • idstring (uuid)Pflicht

    ID der Kampagne

Felder der Antwort
  • campaign_idstring (uuid)

    ID der Kampagne

  • sequence_idstring (uuid), kann null sein

    Verknüpfte Sequenz, null ohne Sequenz

  • sequence_categorystring, kann null sein

    connection (Vernetzungskampagne) oder outreach, null ohne Sequenz

  • calculated_atstring (date-time)

    Zeitpunkt der Berechnung (die Zahlen werden bei jedem Aufruf neu gerechnet)

  • leadsobject

    Leads der Kampagne

    Felder anzeigen
    • totalinteger

      Eingeschriebene Leads, sonst Leads der Kampagne (Bezugsgröße der Schritte)

    • in_campaigninteger

      Leads mit dieser Kampagne (gezählt)

    • in_sequenceinteger

      Zeilen in der Sequenz

    • activeinteger

      Zeilen, die noch laufen (active, waiting, pending, in_progress, waiting_for_connection)

    • completedinteger

      Zeilen mit Status completed

    • repliedinteger

      Zeilen mit Antwort (auch ohne vorherige Nachricht)

  • connectionsobject

    Vernetzung

    Felder anzeigen
    • sentinteger

      Leads mit gesendeter Vernetzungsanfrage

    • acceptedinteger

      Davon angenommen

    • accepted_by_activityinteger

      Annahmen laut Aktivitäten (Rückfall für Altdaten)

    • already_connectedinteger

      Schon vor der Kampagne vernetzt

    • connected_totalinteger

      Alle vernetzten Zeilen, mit und ohne Anfrage aus der Kampagne

    • acceptance_rateinteger

      Annahmequote in Prozent

  • messages_sentinteger

    Versendete Nachrichten (Text, Sprache, Video, InMail), jede einzeln

  • repliesobject

    Antworten

    Felder anzeigen
    • messaged_peopleinteger

      Personen mit mindestens einer Nachricht (Nenner)

    • replied_peopleinteger

      Davon geantwortet

    • reply_rateinteger

      Antwortquote je Person in Prozent

    • replied_before_first_messageinteger

      Antworten, die vor der ersten Nachricht der Sequenz kamen

    • unattributedinteger

      Antworten, die keiner gezeigten Nachricht zugeordnet sind

    • by_messageListe aus object

      Antworten je Nachricht; eine Antwort zählt für die letzte Nachricht davor

      Felder anzeigen
      • step_orderinteger

        Schritt der Nachricht (step_order)

      • labelstring

        Name des Schritts wie im Reiter

      • sentinteger

        Zeilen, an die diese Nachricht ging

      • repliedinteger

        Antworten nach genau dieser Nachricht

      • reply_rateinteger, kann null sein

        Antwortquote dieser Nachricht in Prozent, null ohne Versand

      • variantsListe aus object

        A/B-Varianten mit Versand, leer ohne A/B-Test

        Felder anzeigen
        • keystring

          Kennung der A/B-Variante (A, B, …)

        • sentinteger

          Versand dieser Variante

        • repliedinteger

          Antworten nach dieser Variante

        • reply_rateinteger, kann null sein

          Antwortquote der Variante in Prozent, null ohne Versand

  • bookingsobject

    Termine (Lead-Status booked oder Termin gesetzt, je Person einmal)

    Felder anzeigen
    • peopleinteger

      Personen mit Termin

    • baseinteger, kann null sein

      Bezugsgröße (Angeschriebene), null wenn nicht sinnvoll

  • funnelListe aus object

    Funnel-Zeilen in der Reihenfolge des Reiters

    Felder anzeigen
    • kindstring

      step: ausgeführter Schritt, pre_connected: schon vernetzt, accepted: Vernetzung angenommen, replied: geantwortet, booked: Termin

      step pre_connected accepted replied booked
    • action_typestring, kann null sein

      Art des Schritts, nur bei kind step

    • step_orderinteger, kann null sein

      Schritt (step_order), nur bei kind step

    • labelstring

      Beschriftung der Zeile wie im Reiter

    • countinteger

      Anzahl der Leads in dieser Stufe

    • baseinteger

      Bezugsgröße der Zeile

    • conversion_rateinteger, kann null sein

      Umwandlung gegenüber der Zeile davor in Prozent

  • lead_statusobject

    Zeilen der Sequenz je Status, gruppiert wie der Reiter

    Felder anzeigen
    • pendinginteger

      Status pending (noch nicht gestartet)

    • activeinteger

      Status active und in_progress

    • waitinginteger

      Status waiting_for_connection und waiting

    • repliedinteger

      Status replied

    • bookedinteger

      Status booked

    • completedinteger

      Status completed

    • stoppedinteger

      Status stopped und excluded

    • failedinteger

      Status failed

    • pausedinteger

      paused und paused_no_credits (hat im Reiter keine eigene Zeile)

  • landing_pageobject, kann null sein

    Nur wenn die Sequenz {{landing_page_url}} nutzt. Eindeutige Leads je Ereignis, Anteil an den Leads der Kampagne.

    Felder anzeigen
    • visitsinteger

      Leads mit Seitenaufruf

    • video_viewsinteger

      Leads, die das Video gestartet haben

    • cta_clicksinteger

      Leads mit Klick auf einen Button

    • bookingsinteger

      Leads mit bestätigter Buchung über die Seite

    • visits_percentinteger

      visits in Prozent der Leads der Kampagne, gerundet

    • video_views_percentinteger

      video_views in Prozent der Leads der Kampagne, gerundet

    • cta_clicks_percentinteger

      cta_clicks in Prozent der Leads der Kampagne, gerundet

    • bookings_percentinteger

      bookings in Prozent der Leads der Kampagne, gerundet

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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/stats" \
  -H "X-API-Key: $DEALSKY_API_KEY"
const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/stats", {
  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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/stats",
    headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json())
Antwort 200
{
  "ok": true,
  "data": {
    "campaign_id": "c7a1e2d3-4b5c-4d6e-8f70-1a2b3c4d5e6f",
    "sequence_id": "5e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b",
    "sequence_category": "outreach",
    "calculated_at": "2026-10-18T09:15:00.000Z",
    "leads": {
      "total": 240,
      "in_campaign": 240,
      "in_sequence": 240,
      "active": 150,
      "completed": 40,
      "replied": 30
    },
    "connections": {
      "sent": 180,
      "accepted": 72,
      "accepted_by_activity": 70,
      "already_connected": 12,
      "connected_total": 84,
      "acceptance_rate": 40
    },
    "messages_sent": 95,
    "replies": {
      "messaged_people": 80,
      "replied_people": 24,
      "reply_rate": 30,
      "replied_before_first_message": 1,
      "unattributed": 0,
      "by_message": [
        {
          "step_order": 4,
          "label": "Nachricht gesendet",
          "sent": 80,
          "replied": 23,
          "reply_rate": 29,
          "variants": [
            {
              "key": "A",
              "sent": 41,
              "replied": 13,
              "reply_rate": 32
            },
            {
              "key": "B",
              "sent": 39,
              "replied": 10,
              "reply_rate": 26
            }
          ]
        }
      ]
    },
    "bookings": {
      "people": 6,
      "base": 80
    },
    "funnel": [
      {
        "kind": "step",
        "action_type": "view_profile",
        "step_order": 1,
        "label": "Profil besucht",
        "count": 230,
        "base": 240,
        "conversion_rate": null
      },
      {
        "kind": "pre_connected",
        "action_type": null,
        "step_order": null,
        "label": "Bereits vernetzt (12)",
        "count": 12,
        "base": 240,
        "conversion_rate": null
      },
      {
        "kind": "step",
        "action_type": "send_connection",
        "step_order": 2,
        "label": "Kontaktanfrage",
        "count": 180,
        "base": 240,
        "conversion_rate": null
      },
      {
        "kind": "accepted",
        "action_type": null,
        "step_order": null,
        "label": "Vernetzung angenommen",
        "count": 72,
        "base": 180,
        "conversion_rate": 40
      },
      {
        "kind": "step",
        "action_type": "send_message",
        "step_order": 4,
        "label": "Nachricht gesendet",
        "count": 80,
        "base": 240,
        "conversion_rate": null
      },
      {
        "kind": "replied",
        "action_type": null,
        "step_order": null,
        "label": "Geantwortet",
        "count": 24,
        "base": 80,
        "conversion_rate": null
      },
      {
        "kind": "booked",
        "action_type": null,
        "step_order": null,
        "label": "Termin gebucht",
        "count": 6,
        "base": 80,
        "conversion_rate": 25
      }
    ],
    "lead_status": {
      "pending": 20,
      "active": 60,
      "waiting": 70,
      "replied": 24,
      "booked": 6,
      "completed": 40,
      "stopped": 15,
      "failed": 3,
      "paused": 2
    },
    "landing_page": null
  },
  "meta": {
    "request_id": "req_7f3a…"
  }
}
#

Leads einer Kampagne mit ihrem Stand

GET/v1/campaigns/{id}/leads
Scope read:campaignsRecht: Übersicht und Statistiken ansehenliest

Je eingeschriebenem Lead der Stand in der Sequenz: Status, erreichter Schritt, Vernetzung, Antwort, letzte und nächste Aktion. Älteste Einschreibung zuerst. Leads, die über ein LinkedIn-Konto laufen, auf das die Person hinter dem Key keinen Zugriff hat, fehlen (wie in der App).

Pfad-Parameter

  • idstring (uuid)Pflicht

    ID der Kampagne

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

  • statusListe aus string

    Stand in der Sequenz, kommagetrennt, z. B. replied,booked

    pending active in_progress waiting_for_connection paused paused_no_credits completed replied booked failed excluded stopped
  • connection_statusListe aus string

    Vernetzungsstand, kommagetrennt

    unknown not_connected pending connected withdrawn
Felder der Antwort
  • sequence_lead_idstring (uuid)

    Zeile des Leads in der Sequenz

  • lead_idstring (uuid)

    Lead (siehe /v1/leads/{id})

  • first_namestring, kann null sein

    Vorname aus dem Lead, sonst aus der Sequenz-Zeile

  • last_namestring, kann null sein

    Nachname aus dem Lead, sonst aus der Sequenz-Zeile

  • companystring, kann null sein

    Firma aus dem Lead, sonst aus der Sequenz-Zeile

  • linkedin_urlstring, kann null sein

    LinkedIn-Profil des Leads, null ohne Profil

  • statusstring

    Stand in der Sequenz

    pending active in_progress waiting_for_connection paused paused_no_credits completed replied booked failed excluded stopped
  • current_step_orderinteger

    Zuletzt erreichter Schritt (step_order)

  • connection_statusstring

    Vernetzungsstand: unknown, not_connected, pending (Anfrage offen), connected, withdrawn (Anfrage zurückgezogen)

    unknown not_connected pending connected withdrawn
  • connection_requested_atstring (date-time), kann null sein

    Vernetzungsanfrage gesendet am, null ohne Anfrage

  • connected_atstring (date-time), kann null sein

    Vernetzt seit, null solange nicht vernetzt

  • replied_atstring (date-time), kann null sein

    Erste Antwort am, null ohne Antwort

  • pause_reasonstring, kann null sein

    Freitext, warum der Lead gerade nicht weiterläuft, z. B. Tageslimit erreicht oder Warten auf Annahme. Enthält auch Normalzustände und interne Hinweise, ist also kein Fehlerkennzeichen. null ohne Grund

  • last_action_typestring, kann null sein

    Art der zuletzt ausgeführten Aktion, z. B. send_connection, send_message; null vor der ersten Aktion

  • last_action_atstring (date-time), kann null sein

    Zeitpunkt der letzten Aktion

  • next_action_atstring (date-time), kann null sein

    Frühester Zeitpunkt der nächsten Aktion, null, wenn keine geplant ist

  • enrolled_atstring (date-time)

    In die Sequenz eingeschrieben am

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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/leads" \
  -H "X-API-Key: $DEALSKY_API_KEY"
const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/leads", {
  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/campaigns/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/leads",
    headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json())
Antwort 200
{
  "ok": true,
  "data": [
    {
      "sequence_lead_id": "d4c3b2a1-1234-4abc-8def-0123456789ab",
      "lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
      "first_name": "Max",
      "last_name": "Mustermann",
      "company": "Beispiel Logistik GmbH",
      "linkedin_url": "https://www.linkedin.com/in/max-mustermann",
      "status": "waiting_for_connection",
      "current_step_order": 2,
      "connection_status": "pending",
      "connection_requested_at": "2026-10-16T10:04:00.000Z",
      "connected_at": null,
      "replied_at": null,
      "pause_reason": null,
      "last_action_type": "send_connection",
      "last_action_at": "2026-10-16T10:04:00.000Z",
      "next_action_at": "2026-10-19T09:00:00.000Z",
      "enrolled_at": "2026-10-15T08:30:00.000Z"
    }
  ],
  "meta": {
    "request_id": "req_7f3a…",
    "next_cursor": null,
    "has_more": false
  }
}