Leads
Kontakte anlegen, suchen, pflegen und ihren Verlauf lesen
Leads auflisten und filtern
/v1/leadsread:leadsRecht: Leads einsehenliestNeueste zuerst. Mehrere Filter werden mit UND verknüpft. q sucht in Vorname, Nachname, E-Mail und Firma.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
qstringmax. 200 ZeichenFreitextsuche (Name, E-Mail, Firma)
emailstring (email)max. 320 ZeichenExakte E-Mail (Groß/Klein egal)
linkedin_urlstringmax. 500 ZeichenLinkedIn-Profil-URL: findet dieselbe Person in jeder Schreibweise (mit oder ohne www, Länder-Subdomain, Groß/Klein, Parameter, Unterseiten, %-Kodierung) und über die Member-ID, wie die Dublettenprüfung. Andere URLs (z. B. /pub/) exakt.
list_idstring (uuid)Nur Leads dieser Liste (GET /v1/lists)
campaign_idstring (uuid)Nur Leads, die dieser Kampagne zugeordnet sind (Feld campaign_id)
company_idstring (uuid)Nur Leads, die mit dieser CRM-Firma verknüpft sind
statusListe aus stringEin oder mehrere Status, kommagetrennt
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedassigned_user_idstring (uuid)Nur Leads dieses Team-Mitglieds (GET /v1/team)
show_in_crmbooleantrue: nur Leads im CRM, false: nur Leads außerhalb
created_afterstring (date-time)Nur Leads, die ab diesem Zeitpunkt angelegt wurden
updated_afterstring (date-time)Nur Leads, die seitdem geändert wurden (für Abgleiche)
include_archivedbooleanArchivierte Leads mitliefern (Standard: nein)
Felder der Antwort
idstring (uuid)ID des Leads
list_idstring (uuid), kann null seinListe, in der der Lead steht
campaign_idstring (uuid), kann null seinKampagne, der der Lead zugeordnet ist (Zuordnung über /v1/campaigns/{id}/leads)
company_idstring (uuid), kann null seinVerknüpfte CRM-Firma
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
email_statusstring, kann null seinErgebnis der E-Mail-Prüfung
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
linkedin_network_distancestring, kann null seinKontaktgrad zum verbundenen LinkedIn-Konto
statusstringVertriebsstatus
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedstagestring, kann null seinTemperatur aus dem Scoring: cold, warm, hot
outreach_statusstringOutreach-Status: Ausstehend (Standard), Brief (ein Brief ist in Produktion), Abgemeldet (bei Status opt_out), daneben Email, Linkedin, Beendet, Warten. LinkedIn-Kampagnen ändern ihn nicht, ihren Stand je Lead liefert GET /v1/campaigns/{id}/leads
AusstehendBriefEmailLinkedinBeendetWartenAbgemeldetscoreinteger, kann null seinLead-Score 0 bis 100
lead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
crm_onlyboolean, kann null seinMarkierung aus dem CRM-Modul, Standard false. Über die API nicht änderbar
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
do_not_contactboolean, kann null seinGesperrt für jede Ansprache
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
landing_page_urlstring, kann null seinURL der personalisierten Landingpage des Leads, null solange keine erzeugt wurde
personalized_video_urlstring, kann null seinURL des personalisierten Videos, null solange keins erzeugt wurde (POST /v1/leads/{id}/video)
personalized_video_thumbnailstring, kann null seinURL des Vorschaubilds zum personalisierten Video, null ohne Video
landingpage_url_qrcodestring, kann null seinURL eines QR-Code-Bilds, das auf landing_page_url zeigt (z. B. für Briefe), null solange keiner erzeugt wurde
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
last_activity_atstring (date-time), kann null seinZeitpunkt der letzten Aktivität am Lead (ISO 8601, UTC), null ohne Aktivität
archived_atstring (date-time), kann null seinZeitpunkt der Archivierung (ISO 8601, UTC), null bei aktiven Leads. GET /v1/leads zeigt archivierte nur mit include_archived
created_atstring (date-time)Anlagezeitpunkt (ISO 8601, UTC)
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/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/leads",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"campaign_id": null,
"company_id": null,
"salutation": "Herr",
"academic_title": "Dr.",
"first_name": "Max",
"last_name": "Mustermann",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"email": "max.mustermann@beispiel.de",
"email_status": null,
"phone": "+49 3012 3456",
"company": "Beispiel GmbH",
"website": "https://beispiel.de",
"employees": "11-50",
"street": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country": "DE",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"linkedin_network_distance": "DISTANCE_2",
"status": "open",
"stage": "cold",
"outreach_status": "Ausstehend",
"score": 15,
"lead_source": "api",
"source_details": "Messe Köln 2026",
"notes": null,
"assigned_user_id": null,
"show_in_crm": false,
"crm_only": false,
"is_priority": false,
"do_not_contact": false,
"meeting_scheduled_at": null,
"meeting_type": null,
"next_action": null,
"next_action_at": null,
"landing_page_url": null,
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"landingpage_url_qrcode": null,
"utm_source": null,
"utm_medium": null,
"utm_campaign": null,
"utm_content": null,
"utm_term": null,
"last_activity_at": "2026-10-18T09:12:00.000Z",
"archived_at": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Lead anlegen
/v1/leadswrite:leadsRecht: Leads anlegen/bearbeitenschreibtLegt einen Lead in einer Liste an. Dubletten (gleiche E-Mail oder dieselbe LinkedIn-Person im Konto) werden mit 409 abgelehnt; error.details.existing_id nennt den ältesten vorhandenen Lead, der sich dann per PATCH ändern lässt. Telefonnummern bekommen die Ländervorwahl (+49 …), Länder werden zu ISO-Codes.
Dieselbe LinkedIn-Person erkennt die API wie die App beim CSV-Import: am Profil-Slug aus linkedin.com/in/<slug>, egal ob mit oder ohne www, mit Länder-Subdomain (de.linkedin.com), in Groß- oder Kleinschreibung, mit Parametern (?trk=…, ?miniProfileUrn=…), Unterseiten (/details/…), Schrägstrich am Ende oder %-kodierten Umlauten. Steht im Slug die LinkedIn-ID (/in/ACoAA… oder /in/ACwAA… aus Sales-Navigator-Exporten), trifft sie auch einen Lead, der diese ID als Member-ID führt. Andere URLs (z. B. /pub/…) werden exakt verglichen. Gespeichert wird die URL so, wie sie übergeben wurde.
Body
Mindestens eines von email, linkedin_url oder Vor- und Nachname ist nötig.
list_idstring (uuid), kann null seinPflichtListe, in der der Lead steht
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
statusstringStandard: open
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedlead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/leads" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 123456",
"country": "Deutschland",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"lead_source": "api"
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 123456",
"country": "Deutschland",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"lead_source": "api"
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/leads",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 123456",
"country": "Deutschland",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"lead_source": "api"
},
)
print(res.json()){
"ok": true,
"data": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"campaign_id": null,
"company_id": null,
"salutation": "Herr",
"academic_title": "Dr.",
"first_name": "Max",
"last_name": "Mustermann",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"email": "max.mustermann@beispiel.de",
"email_status": null,
"phone": "+49 3012 3456",
"company": "Beispiel GmbH",
"website": "https://beispiel.de",
"employees": "11-50",
"street": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country": "DE",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"linkedin_network_distance": "DISTANCE_2",
"status": "open",
"stage": "cold",
"outreach_status": "Ausstehend",
"score": 15,
"lead_source": "api",
"source_details": "Messe Köln 2026",
"notes": null,
"assigned_user_id": null,
"show_in_crm": false,
"crm_only": false,
"is_priority": false,
"do_not_contact": false,
"meeting_scheduled_at": null,
"meeting_type": null,
"next_action": null,
"next_action_at": null,
"landing_page_url": null,
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"landingpage_url_qrcode": null,
"utm_source": null,
"utm_medium": null,
"utm_campaign": null,
"utm_content": null,
"utm_term": null,
"last_activity_at": "2026-10-18T09:12:00.000Z",
"archived_at": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Einen Lead abrufen
/v1/leads/{id}read:leadsRecht: Leads einsehenliestLiefert einen Lead des eigenen Kontos mit denselben Feldern wie GET /v1/leads, auch wenn er archiviert ist (archived_at gesetzt). Eine unbekannte oder fremde ID ergibt 404. Werte der eigenen Felder liefert GET /v1/leads/{id}/custom-fields, den Verlauf GET /v1/leads/{id}/activities.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Felder der Antwort
idstring (uuid)ID des Leads
list_idstring (uuid), kann null seinListe, in der der Lead steht
campaign_idstring (uuid), kann null seinKampagne, der der Lead zugeordnet ist (Zuordnung über /v1/campaigns/{id}/leads)
company_idstring (uuid), kann null seinVerknüpfte CRM-Firma
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
email_statusstring, kann null seinErgebnis der E-Mail-Prüfung
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
linkedin_network_distancestring, kann null seinKontaktgrad zum verbundenen LinkedIn-Konto
statusstringVertriebsstatus
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedstagestring, kann null seinTemperatur aus dem Scoring: cold, warm, hot
outreach_statusstringOutreach-Status: Ausstehend (Standard), Brief (ein Brief ist in Produktion), Abgemeldet (bei Status opt_out), daneben Email, Linkedin, Beendet, Warten. LinkedIn-Kampagnen ändern ihn nicht, ihren Stand je Lead liefert GET /v1/campaigns/{id}/leads
AusstehendBriefEmailLinkedinBeendetWartenAbgemeldetscoreinteger, kann null seinLead-Score 0 bis 100
lead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
crm_onlyboolean, kann null seinMarkierung aus dem CRM-Modul, Standard false. Über die API nicht änderbar
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
do_not_contactboolean, kann null seinGesperrt für jede Ansprache
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
landing_page_urlstring, kann null seinURL der personalisierten Landingpage des Leads, null solange keine erzeugt wurde
personalized_video_urlstring, kann null seinURL des personalisierten Videos, null solange keins erzeugt wurde (POST /v1/leads/{id}/video)
personalized_video_thumbnailstring, kann null seinURL des Vorschaubilds zum personalisierten Video, null ohne Video
landingpage_url_qrcodestring, kann null seinURL eines QR-Code-Bilds, das auf landing_page_url zeigt (z. B. für Briefe), null solange keiner erzeugt wurde
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
last_activity_atstring (date-time), kann null seinZeitpunkt der letzten Aktivität am Lead (ISO 8601, UTC), null ohne Aktivität
archived_atstring (date-time), kann null seinZeitpunkt der Archivierung (ISO 8601, UTC), null bei aktiven Leads. GET /v1/leads zeigt archivierte nur mit include_archived
created_atstring (date-time)Anlagezeitpunkt (ISO 8601, UTC)
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"campaign_id": null,
"company_id": null,
"salutation": "Herr",
"academic_title": "Dr.",
"first_name": "Max",
"last_name": "Mustermann",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"email": "max.mustermann@beispiel.de",
"email_status": null,
"phone": "+49 3012 3456",
"company": "Beispiel GmbH",
"website": "https://beispiel.de",
"employees": "11-50",
"street": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country": "DE",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"linkedin_network_distance": "DISTANCE_2",
"status": "open",
"stage": "cold",
"outreach_status": "Ausstehend",
"score": 15,
"lead_source": "api",
"source_details": "Messe Köln 2026",
"notes": null,
"assigned_user_id": null,
"show_in_crm": false,
"crm_only": false,
"is_priority": false,
"do_not_contact": false,
"meeting_scheduled_at": null,
"meeting_type": null,
"next_action": null,
"next_action_at": null,
"landing_page_url": null,
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"landingpage_url_qrcode": null,
"utm_source": null,
"utm_medium": null,
"utm_campaign": null,
"utm_content": null,
"utm_term": null,
"last_activity_at": "2026-10-18T09:12:00.000Z",
"archived_at": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Lead ändern
/v1/leads/{id}write:leadsRecht: Leads anlegen/bearbeitenschreibtNur übergebene Felder werden geändert. null leert ein Feld. Gesperrte Felder (score, stage, do_not_contact …) sind nur lesbar. Eine neue E-Mail oder LinkedIn-URL, die schon ein anderer Lead nutzt, ergibt 409 mit existing_id; bei LinkedIn zählt dieselbe Person in jeder Schreibweise wie bei POST /v1/leads. Eine andere Schreibweise des eigenen Profils ist kein Konflikt.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
list_idstring (uuid), kann null seinListe, in der der Lead steht
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
statusstringVertriebsstatus
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedlead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
Felder der Antwort
idstring (uuid)ID des Leads
list_idstring (uuid), kann null seinListe, in der der Lead steht
campaign_idstring (uuid), kann null seinKampagne, der der Lead zugeordnet ist (Zuordnung über /v1/campaigns/{id}/leads)
company_idstring (uuid), kann null seinVerknüpfte CRM-Firma
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
email_statusstring, kann null seinErgebnis der E-Mail-Prüfung
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
linkedin_network_distancestring, kann null seinKontaktgrad zum verbundenen LinkedIn-Konto
statusstringVertriebsstatus
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedstagestring, kann null seinTemperatur aus dem Scoring: cold, warm, hot
outreach_statusstringOutreach-Status: Ausstehend (Standard), Brief (ein Brief ist in Produktion), Abgemeldet (bei Status opt_out), daneben Email, Linkedin, Beendet, Warten. LinkedIn-Kampagnen ändern ihn nicht, ihren Stand je Lead liefert GET /v1/campaigns/{id}/leads
AusstehendBriefEmailLinkedinBeendetWartenAbgemeldetscoreinteger, kann null seinLead-Score 0 bis 100
lead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
crm_onlyboolean, kann null seinMarkierung aus dem CRM-Modul, Standard false. Über die API nicht änderbar
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
do_not_contactboolean, kann null seinGesperrt für jede Ansprache
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
landing_page_urlstring, kann null seinURL der personalisierten Landingpage des Leads, null solange keine erzeugt wurde
personalized_video_urlstring, kann null seinURL des personalisierten Videos, null solange keins erzeugt wurde (POST /v1/leads/{id}/video)
personalized_video_thumbnailstring, kann null seinURL des Vorschaubilds zum personalisierten Video, null ohne Video
landingpage_url_qrcodestring, kann null seinURL eines QR-Code-Bilds, das auf landing_page_url zeigt (z. B. für Briefe), null solange keiner erzeugt wurde
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
last_activity_atstring (date-time), kann null seinZeitpunkt der letzten Aktivität am Lead (ISO 8601, UTC), null ohne Aktivität
archived_atstring (date-time), kann null seinZeitpunkt der Archivierung (ISO 8601, UTC), null bei aktiven Leads. GET /v1/leads zeigt archivierte nur mit include_archived
created_atstring (date-time)Anlagezeitpunkt (ISO 8601, UTC)
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung (ISO 8601, UTC)
Mögliche Fehler
curl -X PATCH "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "interested",
"next_action": "proposal",
"next_action_at": "2026-10-21T09:00:00+02:00"
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10", {
method: "PATCH",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"status": "interested",
"next_action": "proposal",
"next_action_at": "2026-10-21T09:00:00+02:00"
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"PATCH",
"https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"status": "interested",
"next_action": "proposal",
"next_action_at": "2026-10-21T09:00:00+02:00"
},
)
print(res.json()){
"ok": true,
"data": {
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"campaign_id": null,
"company_id": null,
"salutation": "Herr",
"academic_title": "Dr.",
"first_name": "Max",
"last_name": "Mustermann",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH | Digitalisierung im Mittelstand",
"email": "max.mustermann@beispiel.de",
"email_status": null,
"phone": "+49 3012 3456",
"company": "Beispiel GmbH",
"website": "https://beispiel.de",
"employees": "11-50",
"street": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country": "DE",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"linkedin_network_distance": "DISTANCE_2",
"status": "interested",
"stage": "cold",
"outreach_status": "Ausstehend",
"score": 15,
"lead_source": "api",
"source_details": "Messe Köln 2026",
"notes": null,
"assigned_user_id": null,
"show_in_crm": false,
"crm_only": false,
"is_priority": false,
"do_not_contact": false,
"meeting_scheduled_at": null,
"meeting_type": null,
"next_action": "proposal",
"next_action_at": "2026-10-21T07:00:00.000Z",
"landing_page_url": null,
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"landingpage_url_qrcode": null,
"utm_source": null,
"utm_medium": null,
"utm_campaign": null,
"utm_content": null,
"utm_term": null,
"last_activity_at": "2026-10-18T09:12:00.000Z",
"archived_at": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Lead endgültig löschen
/v1/leads/{id}delete:leadsRecht: Leads löschenlöschtLöscht den Lead mit allen Daten (Aktivitäten, Landingpage, Video, CRM-Verknüpfungen), wie das Löschen in der App. Nicht umkehrbar. Braucht den Scope delete:leads.
Wirkung: Löscht endgültig. Nicht umkehrbar.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Felder der Antwort
deletedbooleanImmer true, wenn der Lead gelöscht wurde
idstring (uuid)ID des gelöschten Leads
Mögliche Fehler
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"deleted": true,
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10"
},
"meta": {
"request_id": "req_7f3a…"
}
}Bis zu 100 Leads auf einmal anlegen
/v1/leads/bulkwrite:leadsRecht: Leads anlegen/bearbeitenschreibtLegt bis zu 100 Leads in einem Aufruf an, mit denselben Feldern und derselben Prüfung wie POST /v1/leads (Pflichtangaben, Telefon mit Ländervorwahl, Land als ISO-Code, Herkunft, Liste und Team-Mitglied des eigenen Kontos). Eine fehlerhafte Zeile hält die anderen nicht auf: results nennt für jede Zeile in Eingabe-Reihenfolge created, duplicate, invalid (mit errors) oder bei on_duplicate: "update" auch updated. Alle neuen Leads werden in einem Schritt geschrieben.
list_id oben gilt für jede Zeile ohne eigenes list_id; die Liste muss zum eigenen Konto gehören, sonst 400 und es wird nichts geschrieben.
Dubletten wie bei POST /v1/leads: gleiche E-Mail (Groß/Klein egal) oder dieselbe LinkedIn-Person im Konto (jede Schreibweise der Profil-URL, siehe dort), dazu dieselbe Angabe weiter oben in derselben Anfrage, auch in anderer Schreibweise (duplicate_of_index, die erste Zeile gewinnt). existing_id ist der älteste passende Lead.
on_duplicate: skip (Standard) überspringt vorhandene Personen, wie der CSV-Import der App, der bekannte Personen nie überschreibt. update füllt beim vorhandenen Lead nur Felder, die dort leer sind, wie das Zusammenführen von Dubletten in der App. Nichts wird überschrieben, Liste und Status bleiben. Wer gezielt überschreiben will, nutzt PATCH /v1/leads/{id} mit existing_id.
Nicht enthalten, wie bei POST /v1/leads: Der CSV-Import der App sortiert zusätzlich Kontakte auf der Ausschlussliste aus, startet danach die Anreden-Erkennung und legt bei CRM-Leads die Firma im CRM an.
Body höchstens 1 MB (für 100 Leads reicht das reichlich). Mit Test-Key kommt dieselbe Auswertung je Zeile, geschrieben wird nichts und neue Zeilen haben keine id.
Body
list_idstring (uuid)Liste für alle Zeilen ohne eigenes list_id
on_duplicatestringskip (Standard): vorhandene Leads bleiben unverändert. update: nur leere Felder des vorhandenen Leads füllen
skipupdateleadsListe aus objectPflichtmax. 100 Einträge1 bis 100 Leads
Felder anzeigen
list_idstring (uuid), kann null seinListe, in der der Lead steht
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
statusstringStandard: open
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedlead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
Felder der Antwort
summaryobjectZählung der Ergebnisse je status
Felder anzeigen
totalintegerZahl der Zeilen in leads
createdintegerZeilen mit status created
updatedintegerZeilen mit status updated
duplicateintegerZeilen mit status duplicate
invalidintegerZeilen mit status invalid
resultsListe aus objectEine Zeile je Eingabe, in derselben Reihenfolge
Felder anzeigen
indexintegerPosition in leads, ab 0
statusstringErgebnis der Zeile: created (neu angelegt), updated (vorhandener Lead ergänzt, nur bei on_duplicate update), duplicate (Dublette, nicht angelegt), invalid (Prüfung fehlgeschlagen)
createdupdatedduplicateinvalididstring (uuid)Nur bei created: ID des neuen Leads (mit Test-Key nicht gesetzt)
existing_idstring (uuid)duplicate oder updated: der vorhandene Lead im Konto
duplicate_of_indexintegerduplicate innerhalb dieser Anfrage: Position der ersten Zeile mit derselben Angabe
fieldstringWoran die Dublette erkannt wurde
emaillinkedin_urlupdated_fieldsListe aus stringNur bei updated: die vorher leeren Felder, die gefüllt wurden
errorsListe aus objectNur bei invalid: Feld und Grund
Felder anzeigen
fieldstringBetroffenes Feld der Zeile, (zeile) wenn die ganze Zeile scheiterte
messagestringGrund auf Deutsch
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/leads/bulk" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"on_duplicate": "skip",
"leads": [
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "erika@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 987654"
},
{
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de"
},
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "ERIKA@beispiel.de"
},
{
"first_name": "Jonas",
"company": "Muster AG"
}
]
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/bulk", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"on_duplicate": "skip",
"leads": [
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "erika@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 987654"
},
{
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de"
},
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "ERIKA@beispiel.de"
},
{
"first_name": "Jonas",
"company": "Muster AG"
}
]
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/leads/bulk",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"on_duplicate": "skip",
"leads": [
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "erika@beispiel.de",
"company": "Beispiel GmbH",
"phone": "030 987654"
},
{
"first_name": "Max",
"last_name": "Mustermann",
"email": "max.mustermann@beispiel.de"
},
{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "ERIKA@beispiel.de"
},
{
"first_name": "Jonas",
"company": "Muster AG"
}
]
},
)
print(res.json()){
"ok": true,
"data": {
"summary": {
"total": 4,
"created": 1,
"updated": 0,
"duplicate": 2,
"invalid": 1
},
"results": [
{
"index": 0,
"status": "created",
"id": "7d1e2f3a-4b5c-4d6e-8f70-81a2b3c4d5e6"
},
{
"index": 1,
"status": "duplicate",
"field": "email",
"existing_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10"
},
{
"index": 2,
"status": "duplicate",
"field": "email",
"duplicate_of_index": 0
},
{
"index": 3,
"status": "invalid",
"errors": [
{
"field": "email",
"message": "oder linkedin_url oder first_name + last_name"
}
]
}
]
},
"meta": {
"request_id": "req_7f3a…"
}
}Verlauf eines Leads
/v1/leads/{id}/activitiesread:leadsRecht: Leads einsehenliestAktivitäten wie gesendete LinkedIn-Nachrichten, Antworten, Anrufe, Notizen und Statuswechsel, neueste zuerst.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
channelstringNur Aktivitäten dieses Kanals
emaillinkedinphonedirect_mailweblandingpagetypestringmax. 100 ZeichenNur Aktivitäten dieser Art, exakter Wert wie im Feld type, z. B. linkedin_message_sent
Felder der Antwort
idstring (uuid)ID der Aktivität
typestringArt der Aktivität, z. B. linkedin_message_sent, call, note
channelstring, kann null seinKanal: email, linkedin, phone, direct_mail, web oder landingpage, null wenn keiner zugeordnet ist
subjectstring, kann null seinBetreff oder Kurztitel, null wenn die Aktivität keinen hat
contentstring, kann null seinInhalt, z. B. Nachrichtentext oder Notiz, null wenn leer
campaign_idstring (uuid), kann null seinKampagne, aus der die Aktivität stammt, null ohne Kampagne
metadataobject, kann null seinZusatzangaben je Art als freies JSON-Objekt, Schlüssel hängen von type ab
created_atstring (date-time)Zeitpunkt der Aktivität (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/activities" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/activities", {
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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/activities",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "9c7a1b2d-4e5f-4a6b-8c9d-0e1f2a3b4c5d",
"type": "linkedin_message_sent",
"channel": "linkedin",
"subject": null,
"content": "Hallo Herr Mustermann, …",
"campaign_id": null,
"metadata": {},
"created_at": "2026-10-18T09:12:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Heiße Leads
/v1/leads/hotread:leadsRecht: Leads einsehenliestLeads, deren Score die Schwelle „heiß“ des Kontos erreicht, wie der Schnellfilter „Hot“ in der Leads-Tabelle und die Kachel „Heiße Leads“ im Dashboard: Score mindestens die Hot-Schwelle aus den Einstellungen (Lead-Scoring, Standard 76), ohne archivierte Leads und ohne Demo-Leads.
Höchster Score zuerst, bei gleichem Score die jüngste Aktivität zuerst. Felder wie GET /v1/leads. Die Schwellen und die Wärme eines einzelnen Leads nennt GET /v1/leads/{id}/engagement.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
list_idstring (uuid)Nur Leads dieser Liste
campaign_idstring (uuid)Nur Leads, die dieser Kampagne zugeordnet sind (wie bei GET /v1/leads)
Felder der Antwort
idstring (uuid)ID des Leads
list_idstring (uuid), kann null seinListe, in der der Lead steht
campaign_idstring (uuid), kann null seinKampagne, der der Lead zugeordnet ist (Zuordnung über /v1/campaigns/{id}/leads)
company_idstring (uuid), kann null seinVerknüpfte CRM-Firma
salutationstring, kann null seinAnrede: Herr, Frau, Divers oder Unbekannt
HerrFrauDiversUnbekanntacademic_titlestring, kann null seinmax. 50 ZeichenAkademischer Titel, z. B. Dr.
first_namestring, kann null seinmax. 200 ZeichenVorname, in Texten der Platzhalter {{first_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit last_name Pflicht
last_namestring, kann null seinmax. 200 ZeichenNachname, in Texten der Platzhalter {{last_name}}. Beim Anlegen ohne email und linkedin_url zusammen mit first_name Pflicht
titlestring, kann null seinmax. 300 ZeichenPosition im Unternehmen
headlinestring, kann null seinmax. 500 ZeichenLinkedIn-Headline
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse, wird klein geschrieben gespeichert. Nutzt ein anderer Lead im Konto dieselbe Adresse (Groß/Klein egal), ist es eine Dublette: einzeln 409, in der Sammel-Anlage status duplicate
email_statusstring, kann null seinErgebnis der E-Mail-Prüfung
phonestring, kann null seinmax. 50 ZeichenWird wie in der App ins internationale Format gebracht, z. B. +49 3012 3456
companystring, kann null seinmax. 300 ZeichenFirmenname, in Texten der Platzhalter {{company}}
websitestring, kann null seinmax. 500 ZeichenWebsite der Firma, z. B. https://beispiel.de. Videos mit scrollender Website (POST /v1/leads/{id}/video) zeigen diese Seite
employeesstring, kann null seinmax. 50 ZeichenUnternehmensgröße, z. B. 11-50
streetstring, kann null seinmax. 300 ZeichenStraße und Hausnummer
postal_codestring, kann null seinmax. 20 ZeichenPostleitzahl
citystring, kann null seinmax. 200 ZeichenOrt, in Texten der Platzhalter {{city}}
countrystring, kann null seinmax. 100 ZeichenLand, wird zu ISO-Code normalisiert (DE, AT, CH …)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
linkedin_network_distancestring, kann null seinKontaktgrad zum verbundenen LinkedIn-Konto
statusstringVertriebsstatus
opencontactednot_reachedinterestedqualifiedfollow_upbookedwonlostdisqualifiedopt_outarchivedstagestring, kann null seinTemperatur aus dem Scoring: cold, warm, hot
outreach_statusstringOutreach-Status: Ausstehend (Standard), Brief (ein Brief ist in Produktion), Abgemeldet (bei Status opt_out), daneben Email, Linkedin, Beendet, Warten. LinkedIn-Kampagnen ändern ihn nicht, ihren Stand je Lead liefert GET /v1/campaigns/{id}/leads
AusstehendBriefEmailLinkedinBeendetWartenAbgemeldetscoreinteger, kann null seinLead-Score 0 bis 100
lead_sourcestring, kann null seinmax. 100 ZeichenHerkunft. System: lead_scout, lead_finder, csv_import, api, manual, webhook; eigene Werte aus den Einstellungen
source_detailsstring, kann null seinmax. 1000 ZeichenFreitext zur Herkunft, z. B. Messe Köln 2026
notesstring, kann null seinmax. 10000 ZeichenFreitext-Notiz am Lead
assigned_user_idstring (uuid), kann null seinZuständiges Team-Mitglied (siehe /v1/team)
show_in_crmboolean, kann null seinIm CRM anzeigen
crm_onlyboolean, kann null seinMarkierung aus dem CRM-Modul, Standard false. Über die API nicht änderbar
is_priorityboolean, kann null seinAls Priorität markiert. Die App sortiert solche Leads bei Wiedervorlagen und unter „Nächster Lead“ nach vorn
do_not_contactboolean, kann null seinGesperrt für jede Ansprache
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des vereinbarten Termins. Eintragen wie in der App (Art, optional Status booked) über PUT /v1/leads/{id}/meeting
meeting_typestring, kann null seinArt des Termins: setting, closing, demo oder other
settingclosingdemoothernext_actionstring, kann null seinNächster Schritt: call, email, meeting, proposal oder wait (Zeitpunkt in next_action_at)
callemailmeetingproposalwaitnext_action_atstring (date-time), kann null seinZeitpunkt für den nächsten Schritt aus next_action
landing_page_urlstring, kann null seinURL der personalisierten Landingpage des Leads, null solange keine erzeugt wurde
personalized_video_urlstring, kann null seinURL des personalisierten Videos, null solange keins erzeugt wurde (POST /v1/leads/{id}/video)
personalized_video_thumbnailstring, kann null seinURL des Vorschaubilds zum personalisierten Video, null ohne Video
landingpage_url_qrcodestring, kann null seinURL eines QR-Code-Bilds, das auf landing_page_url zeigt (z. B. für Briefe), null solange keiner erzeugt wurde
utm_sourcestring, kann null seinmax. 200 ZeichenUTM-Parameter utm_source der Herkunft (Quelle, z. B. newsletter)
utm_mediumstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_medium der Herkunft (Medium, z. B. email)
utm_campaignstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_campaign der Herkunft (Name der Werbekampagne)
utm_contentstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_content der Herkunft (Anzeige oder Link)
utm_termstring, kann null seinmax. 200 ZeichenUTM-Parameter utm_term der Herkunft (Suchbegriff)
last_activity_atstring (date-time), kann null seinZeitpunkt der letzten Aktivität am Lead (ISO 8601, UTC), null ohne Aktivität
archived_atstring (date-time), kann null seinZeitpunkt der Archivierung (ISO 8601, UTC), null bei aktiven Leads. GET /v1/leads zeigt archivierte nur mit include_archived
created_atstring (date-time)Anlagezeitpunkt (ISO 8601, UTC)
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/hot" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/hot", {
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/leads/hot",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"list_id": "1f4e2d3c-7b6a-4c5d-9e8f-0a1b2c3d4e5f",
"campaign_id": "7c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"company_id": null,
"salutation": "Herr",
"academic_title": null,
"first_name": "Max",
"last_name": "Mustermann",
"title": "Geschäftsführer",
"headline": "Geschäftsführer bei Beispiel GmbH",
"email": "max.mustermann@beispiel.de",
"email_status": null,
"phone": "+49 3012 3456",
"company": "Beispiel GmbH",
"website": "https://beispiel.de",
"employees": "11-50",
"street": null,
"postal_code": "10115",
"city": "Berlin",
"country": "DE",
"linkedin_url": "https://www.linkedin.com/in/max-mustermann",
"linkedin_network_distance": "DISTANCE_1",
"status": "interested",
"stage": "hot",
"outreach_status": "Ausstehend",
"score": 82,
"lead_source": "api",
"source_details": null,
"notes": null,
"assigned_user_id": null,
"show_in_crm": false,
"crm_only": false,
"is_priority": false,
"do_not_contact": false,
"meeting_scheduled_at": null,
"meeting_type": null,
"next_action": null,
"next_action_at": null,
"landing_page_url": "https://beispiel.dealsky.app/max-mustermann",
"personalized_video_url": null,
"personalized_video_thumbnail": null,
"landingpage_url_qrcode": null,
"utm_source": null,
"utm_medium": null,
"utm_campaign": null,
"utm_content": null,
"utm_term": null,
"last_activity_at": "2026-10-17T19:06:10.000Z",
"archived_at": null,
"created_at": "2026-10-01T08:00:00.000Z",
"updated_at": "2026-10-17T19:06:10.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Ereignisse eines Leads
/v1/leads/{id}/eventsread:leadsRecht: Leads einsehenliestWas der Lead selbst getan hat oder was mit ihm passiert ist, neueste zuerst: Landingpage besucht (pageview), Video gestartet und angesehen, Buttons geklickt, Buchungsseite geöffnet, Termin bestätigt, Briefe übermittelt und versendet. Das sind die Ereignisse, die die App im Reiter „Journey“ neben dem Verlauf zeigt; den Verlauf (Nachrichten, Anrufe, Notizen) liefert GET /v1/leads/{id}/activities, beides gemischt GET /v1/leads/{id}/journey.
Seitenaufrufe erkannter Bots und Link-Vorschauen werden nicht gespeichert. Ist das Tracking in den Einstellungen aus, entstehen keine Landingpage-Ereignisse.
Filter: type und channel (je kommagetrennt), from (einschließlich) und to (ausschließlich) als Zeitpunkt.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
typeListe aus stringEine oder mehrere Arten, kommagetrennt, z. B. pageview,booking_confirmed
pageviewvideo_startvideo_progressvideo_25video_50video_75video_90video_100cta_clickedmiddle_cta_clickedfinal_cta_clickedfinal_website_clickedbooking_page_openedbooking_confirmedexplainer_startexplainer_progressexplainer_cta_clickedsentdeliveredopenedclickedrepliedbouncedunsubscribedconnection_sentconnection_acceptedmessage_sentmessage_repliedinmail_sentinmail_repliedfollowlikeprofile_viewlinkedin_message_sentlinkedin_reply_receivedlinkedin_unknowncampaign_completedtag_addedtag_removedletter_plannedletter_productionletter_sentchannelListe aus stringEin oder mehrere Kanäle, kommagetrennt
emaillinkedinphonelettervideolandingpagefromstring (date-time)Nur Ereignisse ab diesem Zeitpunkt
tostring (date-time)Nur Ereignisse vor diesem Zeitpunkt
Felder der Antwort
idstring (uuid)ID des Ereignisses
typestringArt des Ereignisses, z. B. pageview (Landingpage besucht), video_progress, cta_clicked, booking_confirmed, letter_sent
pageviewvideo_startvideo_progressvideo_25video_50video_75video_90video_100cta_clickedmiddle_cta_clickedfinal_cta_clickedfinal_website_clickedbooking_page_openedbooking_confirmedexplainer_startexplainer_progressexplainer_cta_clickedsentdeliveredopenedclickedrepliedbouncedunsubscribedconnection_sentconnection_acceptedmessage_sentmessage_repliedinmail_sentinmail_repliedfollowlikeprofile_viewlinkedin_message_sentlinkedin_reply_receivedlinkedin_unknowncampaign_completedtag_addedtag_removedletter_plannedletter_productionletter_sentchannelstring, kann null seinKanal: landingpage, linkedin, letter, email, phone, video
emaillinkedinphonelettervideolandingpageoccurred_atstring (date-time)Zeitpunkt des Ereignisses
campaign_idstring (uuid), kann null seinKampagne, falls bekannt
subjectstring, kann null seinKurztext zum Ereignis, falls vorhanden (in der App Spalte „Details“)
score_deltanumber, kann null seinPunkte, die das Ereignis dem Lead-Score gegeben hat (in der Journey als +N)
video_progress_percentinteger, kann null seinNur bei video_progress und explainer_progress: wie weit das Video angesehen wurde (25, 50, 75 oder 100)
letter_pdf_urlstring, kann null seinNur bei Brief-Ereignissen: Link zum PDF des Briefs
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/events" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/events",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "0e1f2a3b-4c5d-4e6f-8a7b-9c0d1e2f3a4b",
"type": "booking_confirmed",
"channel": "landingpage",
"occurred_at": "2026-10-17T19:06:10.000Z",
"campaign_id": null,
"subject": null,
"score_delta": 50,
"video_progress_percent": null,
"letter_pdf_url": null
},
{
"id": "1f2a3b4c-5d6e-4f7a-8b9c-0d1e2f3a4b5c",
"type": "video_progress",
"channel": "landingpage",
"occurred_at": "2026-10-17T19:04:55.000Z",
"campaign_id": null,
"subject": null,
"score_delta": 18,
"video_progress_percent": 75,
"letter_pdf_url": null
},
{
"id": "2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c6d",
"type": "pageview",
"channel": "landingpage",
"occurred_at": "2026-10-17T19:02:31.000Z",
"campaign_id": null,
"subject": null,
"score_delta": 8,
"video_progress_percent": null,
"letter_pdf_url": null
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Engagement eines Leads
/v1/leads/{id}/engagementread:leadsRecht: Leads einsehenliestZusammenfassung wie im Lead-Panel: Score und Wärme (heiß, warm, kalt nach den Schwellen des Kontos, wie in der Leads-Tabelle), letzte Aktivität, Landingpage-Besuche, Video, Klicks, Buchungen und der LinkedIn-Stand (laufende Kampagne, Vernetzung, Antwort).
Alle Zahlen sind exakt gezählt, auch bei mehr als 1000 Ereignissen. Gezählt werden alle Ereignisse des Leads, auch von früheren Landingpages.
Der LinkedIn-Stand berücksichtigt nur Kampagnen auf LinkedIn-Konten, die die Person hinter dem Key in der App sehen darf.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Felder der Antwort
lead_idstring (uuid)ID des Leads
scorenumber, kann null seinLead-Score 0 bis 100
warmthstringWärme wie in der Leads-Tabelle: hot ab thresholds.hot, warm ab thresholds.warm, sonst cold (ohne Score: cold)
hotwarmcoldthresholdsobjectScore-Grenzen für warmth aus den Einstellungen des Kontos
Felder anzeigen
hotnumberAb diesem Score heiß (Einstellungen, Lead-Scoring; Standard 76)
warmnumberAb diesem Score warm (Standard 40)
last_activity_atstring (date-time), kann null seinLetzte Aktivität laut Lead (Spalte „Letzte Aktivität“)
last_event_atstring (date-time), kann null seinJüngstes Ereignis (Landingpage, Video, Brief …)
landing_pageobjectZählung der Landingpage-Ereignisse des Leads
Felder anzeigen
visitsintegerSeitenaufrufe (in der App „Besucht (Nx)“)
first_visit_atstring (date-time), kann null seinErster Seitenaufruf (Ereignis pageview), null ohne Besuch
last_visit_atstring (date-time), kann null seinLetzter Seitenaufruf (Ereignis pageview), null ohne Besuch
cta_clicksintegerKlicks auf die Buttons der Seite (Kopf, Mitte, Ende, Erklärvideo)
booking_page_opensintegerBuchungsseite geöffnet
bookingsintegerTermine über die Seite bestätigt
videoobjectStand des personalisierten Hauptvideos aus den Ereignissen video_start und video_progress
Felder anzeigen
startsintegerHauptvideo gestartet
max_progress_percentinteger, kann null seinHöchster gemeldeter Fortschritt des Hauptvideos (25, 50, 75, 100), null ohne Meldung
completedbooleanVideo bis zum Ende angesehen (Fortschritt 100)
meeting_scheduled_atstring (date-time), kann null seinGesetzter Termin am Lead
linkedinobjectNur Sequenzen auf LinkedIn-Konten, die der Key-Ersteller sehen darf
Felder anzeigen
active_campaignobject, kann null seinKampagne, in der der Lead gerade läuft (im Lead-Panel „LinkedIn Kampagne“), sonst null
Felder anzeigen
campaign_idstring (uuid), kann null seinID der laufenden Kampagne
campaign_namestring, kann null seinnull, wenn die Kampagne für den Key-Ersteller nicht sichtbar ist
sequence_statusstringpending, active, in_progress oder waiting_for_connection
connection_statusstring, kann null seinVernetzung laut jüngster Sequenz: unknown, not_connected, pending, connected, withdrawn
connected_atstring (date-time), kann null seinZeitpunkt der Vernetzung laut jüngster Sequenz, null wenn nicht vernetzt
repliedbooleanHat in einer LinkedIn-Kampagne geantwortet
replied_atstring (date-time), kann null seinZeitpunkt der Antwort (bei mehreren Kampagnen die jüngste)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/engagement" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/engagement", {
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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/engagement",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"score": 82,
"warmth": "hot",
"thresholds": {
"hot": 76,
"warm": 40
},
"last_activity_at": "2026-10-17T19:06:10.000Z",
"last_event_at": "2026-10-17T19:06:10.000Z",
"landing_page": {
"visits": 4,
"first_visit_at": "2026-10-15T08:31:12.000Z",
"last_visit_at": "2026-10-17T19:02:31.000Z",
"cta_clicks": 1,
"booking_page_opens": 1,
"bookings": 1
},
"video": {
"starts": 2,
"max_progress_percent": 75,
"completed": false
},
"meeting_scheduled_at": "2026-10-21T08:00:00.000Z",
"linkedin": {
"active_campaign": {
"campaign_id": "7c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"campaign_name": "Geschäftsführer DACH Q4",
"sequence_status": "active"
},
"connection_status": "connected",
"connected_at": "2026-10-14T10:12:00.000Z",
"replied": false,
"replied_at": null
}
},
"meta": {
"request_id": "req_7f3a…"
}
}Zeitleiste eines Leads
/v1/leads/{id}/journeyread:leadsRecht: Leads einsehenliestAlles zu einem Lead in einer Liste, wie der Reiter „Journey“ im Lead-Panel: Verlauf (Nachrichten, Anrufe, Notizen, Kampagnen-Schritte, source: activity), Ereignisse (Landingpage, Video, Briefe, source: event) und als ältester Eintrag „Lead angelegt“ (source: lead).
Neueste zuerst. Bei gleichem Zeitpunkt in derselben Reihenfolge wie die App: Aufnahme in die Kampagne, Aufnahme in die Sequenz, Sequenz gestoppt (Antwort, Termin, manuell), dann alles andere; Verlauf vor Ereignissen.
Seitenweise über meta.next_cursor. Der Cursor merkt sich die Stelle des letzten Eintrags, darum gibt es beim Blättern keine Doppelten und keine Lücken.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
Felder der Antwort
idstring (uuid)ID der Aktivität bzw. des Ereignisses; beim Eintrag lead_created die ID des Leads
sourcestringactivity (Verlauf, wie GET /v1/leads/{id}/activities), event (wie GET /v1/leads/{id}/events) oder lead (Lead angelegt)
activityeventleadtypestringArt, z. B. linkedin_message_sent, note, call_completed, pageview, booking_confirmed, lead_created
channelstring, kann null seinKanal, z. B. linkedin, email, phone, landingpage, letter, video; null wenn keiner zugeordnet ist (immer bei lead_created)
occurred_atstring (date-time)Zeitpunkt des Eintrags (ISO 8601, UTC); bei Aktivitäten deren created_at, bei Ereignissen der Ereigniszeitpunkt
campaign_idstring (uuid), kann null seinKampagne, aus der der Eintrag stammt, null ohne Kampagne
subjectstring, kann null seinBetreff der Aktivität bzw. Kurztext des Ereignisses, null wenn keiner vorhanden ist
contentstring, kann null seinNur bei Aktivitäten: Text, z. B. einer Notiz oder Nachricht
metadataobject, kann null seinNur bei Aktivitäten: Zusatzangaben wie bei GET /v1/leads/{id}/activities
score_deltanumber, kann null seinNur bei Ereignissen: Punkte für den Lead-Score
video_progress_percentinteger, kann null seinNur bei Video-Ereignissen mit Fortschritt
letter_pdf_urlstring, kann null seinNur bei Brief-Ereignissen: Link zum PDF
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/journey" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/journey", {
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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/journey",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "0e1f2a3b-4c5d-4e6f-8a7b-9c0d1e2f3a4b",
"source": "event",
"type": "booking_confirmed",
"channel": "landingpage",
"occurred_at": "2026-10-17T19:06:10.000Z",
"campaign_id": null,
"subject": null,
"content": null,
"metadata": null,
"score_delta": 50,
"video_progress_percent": null,
"letter_pdf_url": null
},
{
"id": "9c7a1b2d-4e5f-4a6b-8c9d-0e1f2a3b4c5d",
"source": "activity",
"type": "linkedin_message_sent",
"channel": "linkedin",
"occurred_at": "2026-10-16T09:12:00.000Z",
"campaign_id": "7c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"subject": null,
"content": "Hallo Herr Mustermann, danke fürs Vernetzen …",
"metadata": {},
"score_delta": null,
"video_progress_percent": null,
"letter_pdf_url": null
},
{
"id": "8b6a0c1d-3e4f-4a5b-9c8d-7e6f5a4b3c2d",
"source": "activity",
"type": "campaign_enrolled",
"channel": "linkedin",
"occurred_at": "2026-10-14T08:00:00.000Z",
"campaign_id": "7c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"subject": null,
"content": "In Kampagne aufgenommen",
"metadata": {},
"score_delta": null,
"video_progress_percent": null,
"letter_pdf_url": null
},
{
"id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"source": "lead",
"type": "lead_created",
"channel": null,
"occurred_at": "2026-10-01T08:00:00.000Z",
"campaign_id": null,
"subject": null,
"content": null,
"metadata": null,
"score_delta": null,
"video_progress_percent": null,
"letter_pdf_url": null
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Eigene Felder (Custom Fields) auflisten
/v1/custom-fieldsread:leadsRecht: Leads einsehenliestDie Felder, die das Konto unter Einstellungen → Felder für Leads angelegt hat, in der Reihenfolge der App (Gruppe, dann Feld). Standardmäßig nur aktive Felder, wie die App sie im Lead-Panel zeigt; include_inactive=true liefert auch deaktivierte. Anlegen und Ändern von Feldern geht nur in der App (dort der Leitung vorbehalten).
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
include_inactivebooleanAuch deaktivierte Felder liefern (Standard: nein)
Felder der Antwort
idstring (uuid)ID der Felddefinition
field_keystringSchlüssel des Felds, so wird es in /v1/leads/{id}/custom-fields angesprochen
field_namestringAnzeigename in der App
field_typestringTyp, bestimmt das erlaubte Format des Werts (siehe PUT /v1/leads/{id}/custom-fields)
texttextareanumberdecimalcurrencydateselectmultiselectcheckboxuserurlemailphonefield_optionsListe aus stringErlaubte Werte bei select und multiselect, sonst leer
is_requiredbooleanIn der App als Pflichtfeld markiert (Stern). Die App erzwingt es beim Speichern nicht, die API auch nicht.
category_namestringGruppe, unter der das Feld in der App steht
default_valuestring, kann null seinGespeicherter Standardwert der Definition. Die App legt Felder mit null an und setzt ihn nicht in Leads ein; meist null
is_activebooleanNur aktive Felder zeigt die App an, nur sie lassen sich setzen
display_statusesListe aus stringDie App zeigt das Feld im Lead-Panel nur bei Leads mit diesen Status; leer = immer. Lesen und Setzen per API gehen unabhängig davon.
created_atstring (date-time), kann null seinAngelegt am
updated_atstring (date-time), kann null seinZuletzt geändert am
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/custom-fields" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/custom-fields", {
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/custom-fields",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "2b3c4d5e-6f70-4a81-9b2c-3d4e5f6a7b8c",
"field_key": "budget",
"field_name": "Budget",
"field_type": "currency",
"field_options": [],
"is_required": false,
"category_name": "Qualifizierung",
"default_value": null,
"is_active": true,
"display_statuses": [],
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
},
{
"id": "3c4d5e6f-7081-4b92-8c3d-4e5f6a7b8c9d",
"field_key": "interesse",
"field_name": "Interesse an",
"field_type": "multiselect",
"field_options": [
"Video",
"Landingpage",
"Brief"
],
"is_required": false,
"category_name": "Qualifizierung",
"default_value": null,
"is_active": true,
"display_statuses": [],
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Werte der eigenen Felder eines Leads
/v1/leads/{id}/custom-fieldsread:leadsRecht: Leads einsehenliestEin Objekt mit dem Schlüssel jedes aktiven Felds und dem Wert beim Lead, null = kein Wert. Werte kommen als Text, so wie die App sie speichert, Mehrfachauswahl als Liste. Formate je Typ stehen bei PUT /v1/leads/{id}/custom-fields. Werte deaktivierter Felder zeigt die App nicht, die API auch nicht.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields", {
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/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"budget": "15000",
"entscheider": "true",
"interesse": [
"Video",
"Landingpage"
],
"naechster_termin": "2026-11-03",
"zustaendig": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"bemerkung": null
},
"meta": {
"request_id": "req_7f3a…"
}
}Werte der eigenen Felder eines Leads setzen
/v1/leads/{id}/custom-fieldswrite:leadsRecht: Leads anlegen/bearbeitenschreibtSetzt die übergebenen Felder, alle anderen bleiben unverändert. null, leerer Text oder eine leere Liste leeren ein Feld. Schlüssel aus GET /v1/custom-fields; unbekannte oder deaktivierte Felder und Werte im falschen Format ergeben 400 mit allen Fehlern in error.details, dann wird nichts geschrieben. Die Antwort ist der Stand danach wie bei GET.
Gespeichert wird wie im Lead-Panel der App: ein Wert je Lead und Feld, als Text. Kein Eintrag im Verlauf, keine weitere Wirkung. Pflichtfelder erzwingt die App beim Speichern nicht, die API auch nicht. Ob die App ein Feld nur bei bestimmten Status zeigt (display_statuses), spielt fürs Setzen keine Rolle.
| Typ | Wert beim Setzen | gespeichert und gelesen als |
|---|---|---|
| text, textarea | Text, höchstens 10.000 Zeichen | Text |
| number | ganze Zahl, z. B. 42 oder "42" | "42" |
| decimal | Zahl, Punkt als Trenner, z. B. 12.5 | "12.5" |
| currency | Betrag in Euro, höchstens zwei Nachkommastellen, z. B. 1500.5 oder "1500.50" | "1500.5" bzw. "1500.50" |
| date | JJJJ-MM-TT, gültiges Kalenderdatum | "2026-11-03" |
| select | genau eine der field_options | Text |
| multiselect | Liste aus field_options, z. B. ["A", "B"] | Liste |
| checkbox | true, false oder "unclear" (wie Ja, Nein, Unklar in der Qualifizierung) | "true", "false", "unclear" |
| user | ID eines Team-Mitglieds (GET /v1/team) | ID |
| url | vollständige URL mit http:// oder https:// | Text |
| email | E-Mail-Adresse (wird klein geschrieben) | Text |
| phone | Telefonnummer aus Ziffern, Leerzeichen, + ( ) / . - | Text wie übergeben |
Höchstens 200 Felder je Aufruf. Mit Test-Key kommt dieselbe Prüfung und die Liste der Änderungen, geschrieben wird nichts.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
Feld-Schlüssel → Wert. Format je Typ siehe Tabelle.
Mögliche Fehler
curl -X PUT "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"budget": 15000,
"entscheider": true,
"interesse": [
"Video",
"Landingpage"
],
"naechster_termin": "2026-11-03",
"bemerkung": null
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields", {
method: "PUT",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"budget": 15000,
"entscheider": true,
"interesse": [
"Video",
"Landingpage"
],
"naechster_termin": "2026-11-03",
"bemerkung": null
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/custom-fields",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"budget": 15000,
"entscheider": True,
"interesse": [
"Video",
"Landingpage"
],
"naechster_termin": "2026-11-03",
"bemerkung": None
},
)
print(res.json()){
"ok": true,
"data": {
"budget": "15000",
"entscheider": "true",
"interesse": [
"Video",
"Landingpage"
],
"naechster_termin": "2026-11-03",
"zustaendig": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"bemerkung": null
},
"meta": {
"request_id": "req_7f3a…"
}
}