CRM
Notizen, Termine, Wiedervorlagen, Kontaktpersonen, Telefonate, Gesprächsleitfäden und Rufnummern
Notizen eines Leads
/v1/leads/{id}/notesread:crmRecht: Leads einsehenliestNeueste zuerst, wie im Notizen-Reiter der App. Enthält Notizen aus der App, aus dem CSV-Import und über die API. Andere Einträge des Verlaufs liefert GET /v1/leads/{id}/activities.
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 Notiz
contentstringmind. 1 Zeichenmax. 10000 ZeichenText der Notiz
created_bystring (uuid), kann null seinTeam-Mitglied, das die Notiz angelegt hat (bei der API: wer den Key erzeugt hat)
created_by_typestring, kann null seinuser (in der App angelegt) oder api
created_atstring (date-time)Zeitpunkt der Anlage
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/notes" \
-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/notes", {
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/notes",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"content": "Ruft nach der Messe zurück, Interesse an Paket Business.",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_by_type": "api",
"created_at": "2026-10-18T09:12:00.000Z"
},
{
"id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f70",
"content": "Erstkontakt auf der Messe",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_by_type": "user",
"created_at": "2026-10-16T15:40:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Notiz an einem Lead anlegen
/v1/leads/{id}/noteswrite:crmRecht: Leads anlegen/bearbeitenschreibtLegt eine Notiz an wie „Notiz hinzufügen“ im Lead-Panel. Sie erscheint im Notizen-Reiter und im Verlauf des Leads. Als Ersteller gilt die Person, die den API-Key erzeugt hat. Weitere Wirkung hat das Anlegen nicht.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
contentstringPflichtmind. 1 Zeichenmax. 10000 ZeichenText der Notiz
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/notes" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Ruft nach der Messe zurück, Interesse an Paket Business."
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/notes", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"content": "Ruft nach der Messe zurück, Interesse an Paket Business."
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/notes",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"content": "Ruft nach der Messe zurück, Interesse an Paket Business."
},
)
print(res.json()){
"ok": true,
"data": {
"id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"content": "Ruft nach der Messe zurück, Interesse an Paket Business.",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_by_type": "api",
"created_at": "2026-10-18T09:12:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Notiz löschen
/v1/leads/{id}/notes/{note_id}delete:crmRecht: Leads anlegen/bearbeitenlöschtLöscht die Notiz endgültig, wie das Papierkorb-Symbol im Notizen-Reiter. Wie in der App darf das jede Person mit dem Recht, Leads zu bearbeiten, nicht nur der Ersteller. Andere Einträge des Verlaufs lassen sich hier nicht löschen.
Wirkung: Löscht endgültig. Nicht umkehrbar.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
note_idstring (uuid)PflichtID der Notiz
Felder der Antwort
deletedbooleantrue: Die Notiz wurde gelöscht
idstring (uuid)ID der gelöschten Notiz
Mögliche Fehler
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/notes/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/notes/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/notes/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"deleted": true,
"id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f"
},
"meta": {
"request_id": "req_7f3a…"
}
}Wiedervorlage eines Leads lesen
/v1/leads/{id}/follow-upread:crmRecht: Leads einsehenliestZeitpunkt, Notiz, Grund und Zahl der Nachfass-Versuche, wie sie die App unter „Wiedervorlage“ zeigt. snoozed_until null heißt: keine Wiedervorlage gesetzt.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Felder der Antwort
lead_idstring (uuid)ID des Leads
statusstringVertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.
snoozed_untilstring (date-time), kann null seinZeitpunkt der Wiedervorlage. null = keine Wiedervorlage
follow_up_notestring, kann null seinNotiz zur Wiedervorlage
follow_up_reasonstring, kann null seinGrund der Wiedervorlage
schedulingno_show_settingno_show_closingdecision_pendingstakeholder_reviewcallback_requestedproposal_reviewfollow_up_attemptsinteger, kann null seinZahl der Nachfass-Versuche
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/follow-up" \
-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/follow-up", {
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/follow-up",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"status": "follow_up",
"snoozed_until": "2026-10-21T07:00:00.000Z",
"follow_up_note": "Angebot wird geprüft, Dienstag nachfassen",
"follow_up_reason": "proposal_review",
"follow_up_attempts": 2
},
"meta": {
"request_id": "req_7f3a…"
}
}Wiedervorlage setzen
/v1/leads/{id}/follow-upwrite:crmRecht: Leads anlegen/bearbeitenschreibtSetzt die Wiedervorlage wie „Wiedervorlage“ im Lead-Panel: Zeitpunkt snoozed_until und, wie in der App immer, den Status follow_up. Zum Zeitpunkt erscheint der Lead im CRM als fällig.
follow_up_note und follow_up_reason werden nur geändert, wenn sie übergeben werden; null leert sie. count_attempt: true zählt wie beim Gesprächsende einen Nachfass-Versuch hoch.
Den nächsten Schritt (next_action, next_action_at) setzt die Wiedervorlage in der App nicht; er bleibt über PATCH /v1/leads/{id} änderbar.
Wirkt nicht nach außen: Eine laufende Kampagne oder Sequenz des Leads läuft unverändert weiter, es wird nichts gesendet. Kostet keine Credits.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
snoozed_untilstring (date-time)PflichtZeitpunkt der Wiedervorlage, z. B. 2026-10-21T09:00:00+02:00
follow_up_notestring, kann null seinmax. 5000 ZeichenNotiz zur Wiedervorlage. Nicht übergeben = bleibt, null = leeren
follow_up_reasonstring, kann null seinGrund: scheduling (Terminfindung), no_show_setting, no_show_closing, decision_pending (Entscheidung ausstehend), stakeholder_review (Rücksprache mit Team), callback_requested (Rückruf vereinbart), proposal_review (Angebot wird geprüft). Nicht übergeben = bleibt, null = leeren
schedulingno_show_settingno_show_closingdecision_pendingstakeholder_reviewcallback_requestedproposal_reviewcount_attemptbooleantrue: Nachfass-Versuche um 1 erhöhen (Standard: false)
Felder der Antwort
lead_idstring (uuid)ID des Leads
statusstringVertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.
snoozed_untilstring (date-time), kann null seinZeitpunkt der Wiedervorlage. null = keine Wiedervorlage
follow_up_notestring, kann null seinNotiz zur Wiedervorlage
follow_up_reasonstring, kann null seinGrund der Wiedervorlage
schedulingno_show_settingno_show_closingdecision_pendingstakeholder_reviewcallback_requestedproposal_reviewfollow_up_attemptsinteger, kann null seinZahl der Nachfass-Versuche
Mögliche Fehler
curl -X PUT "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/follow-up" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"snoozed_until": "2026-10-21T09:00:00+02:00",
"follow_up_note": "Angebot wird geprüft, Dienstag nachfassen",
"follow_up_reason": "proposal_review",
"count_attempt": true
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/follow-up", {
method: "PUT",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"snoozed_until": "2026-10-21T09:00:00+02:00",
"follow_up_note": "Angebot wird geprüft, Dienstag nachfassen",
"follow_up_reason": "proposal_review",
"count_attempt": true
}),
});
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/follow-up",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"snoozed_until": "2026-10-21T09:00:00+02:00",
"follow_up_note": "Angebot wird geprüft, Dienstag nachfassen",
"follow_up_reason": "proposal_review",
"count_attempt": True
},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"status": "follow_up",
"snoozed_until": "2026-10-21T07:00:00.000Z",
"follow_up_note": "Angebot wird geprüft, Dienstag nachfassen",
"follow_up_reason": "proposal_review",
"follow_up_attempts": 2
},
"meta": {
"request_id": "req_7f3a…"
}
}Wiedervorlage entfernen
/v1/leads/{id}/follow-upwrite:crmRecht: Leads anlegen/bearbeitenschreibtWie „Wiedervorlage entfernen“ in der App: Zeitpunkt und Notiz werden geleert, Grund und Status bleiben. Mit reset_attempts=true stehen die Nachfass-Versuche wieder auf 0. Wirkt nicht nach außen: Eine laufende Kampagne oder Sequenz des Leads läuft unverändert weiter, es wird nichts gesendet. Kostet keine Credits.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Query-Parameter
reset_attemptsbooleanNachfass-Versuche auf 0 setzen (Standard: false)
Felder der Antwort
lead_idstring (uuid)ID des Leads
statusstringVertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.
snoozed_untilstring (date-time), kann null seinZeitpunkt der Wiedervorlage. null = keine Wiedervorlage
follow_up_notestring, kann null seinNotiz zur Wiedervorlage
follow_up_reasonstring, kann null seinGrund der Wiedervorlage
schedulingno_show_settingno_show_closingdecision_pendingstakeholder_reviewcallback_requestedproposal_reviewfollow_up_attemptsinteger, kann null seinZahl der Nachfass-Versuche
Mögliche Fehler
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/follow-up" \
-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/follow-up", {
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/follow-up",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"status": "follow_up",
"snoozed_until": null,
"follow_up_note": null,
"follow_up_reason": "proposal_review",
"follow_up_attempts": 2
},
"meta": {
"request_id": "req_7f3a…"
}
}Termin am Lead eintragen
/v1/leads/{id}/meetingwrite:crmRecht: Leads anlegen/bearbeitenschreibtTrägt Zeitpunkt und Art des Termins ein wie der Abschnitt „Termin & Meeting“ im Lead-Panel. Der Termin erscheint im CRM-Termin-Dashboard und in den Termin-Kennzahlen.
mark_booked: true setzt zusätzlich den Status booked wie „Termin gebucht“ im Status-Menü und entfernt dabei wie die App eine Wiedervorlage (Zeitpunkt, Notiz, Versuche). Steht der Lead schon auf booked, bleibt alles andere unverändert.
Anders als „Termin gelegt“ im Postfach oder eine Buchung über Calendly, TidyCal oder die Landingpage stoppt dieser Endpunkt keine Sequenz. Wer die LinkedIn-Sequenz nach einem Termin beenden will, tut das in der App im Postfach. Wirkt nicht nach außen: Eine laufende Kampagne oder Sequenz des Leads läuft unverändert weiter, es wird nichts gesendet. Kostet keine Credits.
Einen Verlaufseintrag schreibt die App hierbei nicht, die API auch nicht.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
scheduled_atstring (date-time)PflichtZeitpunkt des Termins, z. B. 2026-10-22T10:30:00+02:00
meeting_typestringPflichtsetting (Setting-Call), closing (Closing-Call), demo (Demo/Präsentation) oder other (Sonstiges)
settingclosingdemoothermark_bookedbooleantrue: Status auf booked setzen (Standard: false)
Felder der Antwort
lead_idstring (uuid)ID des Leads
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des Termins
meeting_typestring, kann null seinsetting, closing, demo oder other
settingclosingdemootherstatusstringVertriebsstatus des Leads
Mögliche Fehler
curl -X PUT "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/meeting" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scheduled_at": "2026-10-22T10:30:00+02:00",
"meeting_type": "setting",
"mark_booked": true
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/meeting", {
method: "PUT",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"scheduled_at": "2026-10-22T10:30:00+02:00",
"meeting_type": "setting",
"mark_booked": true
}),
});
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/meeting",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"scheduled_at": "2026-10-22T10:30:00+02:00",
"meeting_type": "setting",
"mark_booked": True
},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"meeting_scheduled_at": "2026-10-22T08:30:00.000Z",
"meeting_type": "setting",
"status": "booked"
},
"meta": {
"request_id": "req_7f3a…"
}
}Termin am Lead entfernen
/v1/leads/{id}/meetingwrite:crmRecht: Leads anlegen/bearbeitenschreibtLeert Zeitpunkt und Art des Termins. Der Status bleibt (ein booked lässt sich über PATCH /v1/leads/{id} ändern), ebenso die Zeitpunkte für durchgeführtes Setting und Closing. Wirkt nicht nach außen: Eine laufende Kampagne oder Sequenz des Leads läuft unverändert weiter, es wird nichts gesendet. Kostet keine Credits.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Felder der Antwort
lead_idstring (uuid)ID des Leads
meeting_scheduled_atstring (date-time), kann null seinZeitpunkt des Termins
meeting_typestring, kann null seinsetting, closing, demo oder other
settingclosingdemootherstatusstringVertriebsstatus des Leads
Mögliche Fehler
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/meeting" \
-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/meeting", {
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/meeting",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"meeting_scheduled_at": null,
"meeting_type": null,
"status": "booked"
},
"meta": {
"request_id": "req_7f3a…"
}
}Telefonate eines Leads
/v1/leads/{id}/callsread:crmRecht: Leads einsehenliestProtokollierte Anrufe, neueste zuerst, wie im Reiter Anrufe des Lead-Panels: aus der Calling Engine, aus der App protokolliert und über die API. Ohne Aufnahmen und Telefonnummern.
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 des Anruf-Eintrags
called_atstring (date-time)Zeitpunkt des Anrufs. Standard: jetzt
directionstringoutbound (ausgehend, Standard) oder inbound (eingehend)
outboundinboundoutcomestringErgebnis: reached_decision_maker (Entscheider erreicht), reached_gatekeeper (Gatekeeper erreicht), reached_other (andere Person erreicht), voicemail (Mailbox), not_reached (nicht erreicht), wrong_number (falsche Nummer), callback_requested (Rückruf erbeten)
reached_decision_makerreached_gatekeeperreached_othervoicemailnot_reachedwrong_numbercallback_requestedduration_secondsinteger, kann null seinab 0bis 86400Dauer in Sekunden
spoke_with_typestring, kann null seinGesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown
decision_makergatekeeperassistantcolleagueunknownspoke_with_namestring, kann null seinmax. 200 ZeichenName der Person am Telefon
notesstring, kann null seinmax. 10000 ZeichenNotiz zum Anruf, erscheint auch im Verlauf
created_bystring (uuid), kann null seinTeam-Mitglied, das den Anruf protokolliert hat (bei der API: wer den Key erzeugt hat)
created_atstring (date-time)Zeitpunkt, zu dem der Anruf protokolliert wurde (kann von called_at abweichen)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/calls" \
-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/calls", {
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/calls",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "6e7f8a9b-0c1d-4e2f-8a3b-4c5d6e7f8a9b",
"called_at": "2026-10-18T08:15:00.000Z",
"direction": "outbound",
"outcome": "reached_decision_maker",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken.",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_at": "2026-10-18T08:23:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Telefonat protokollieren
/v1/leads/{id}/callswrite:crmRecht: Leads anlegen/bearbeitenschreibtProtokolliert einen Anruf wie „Ausgehender Anruf protokollieren“ bzw. „Eingehender Anruf protokollieren“ im Lead-Panel: Der Anruf steht danach im Reiter Anrufe und als „Anruf durchgeführt“ im Verlauf; am Lead werden letzter Anruf, letztes Ergebnis und die Zahl der Anrufe fortgeschrieben.
Wie in der App ändert das Protokoll weder den Status noch die Wiedervorlage (dafür PUT /v1/leads/{id}/follow-up). Als Ersteller gilt die Person, die den API-Key erzeugt hat. Es wird nicht telefoniert. Wirkt nicht nach außen: Eine laufende Kampagne oder Sequenz des Leads läuft unverändert weiter, es wird nichts gesendet. Kostet keine Credits.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
outcomestringPflichtErgebnis: reached_decision_maker (Entscheider erreicht), reached_gatekeeper (Gatekeeper erreicht), reached_other (andere Person erreicht), voicemail (Mailbox), not_reached (nicht erreicht), wrong_number (falsche Nummer), callback_requested (Rückruf erbeten)
reached_decision_makerreached_gatekeeperreached_othervoicemailnot_reachedwrong_numbercallback_requesteddirectionstringoutbound (ausgehend, Standard) oder inbound (eingehend)
outboundinboundcalled_atstring (date-time)Zeitpunkt des Anrufs. Standard: jetzt
duration_secondsinteger, kann null seinab 0bis 86400Dauer in Sekunden
spoke_with_typestring, kann null seinGesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown
decision_makergatekeeperassistantcolleagueunknownspoke_with_namestring, kann null seinmax. 200 ZeichenName der Person am Telefon
notesstring, kann null seinmax. 10000 ZeichenNotiz zum Anruf, erscheint auch im Verlauf
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/calls" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"outcome": "reached_decision_maker",
"called_at": "2026-10-18T10:15:00+02:00",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken."
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/calls", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"outcome": "reached_decision_maker",
"called_at": "2026-10-18T10:15:00+02:00",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken."
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/calls",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"outcome": "reached_decision_maker",
"called_at": "2026-10-18T10:15:00+02:00",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken."
},
)
print(res.json()){
"ok": true,
"data": {
"id": "6e7f8a9b-0c1d-4e2f-8a3b-4c5d6e7f8a9b",
"called_at": "2026-10-18T08:15:00.000Z",
"direction": "outbound",
"outcome": "reached_decision_maker",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken.",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_at": "2026-10-18T08:23:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Anrufe über alle Leads
/v1/callsread:crmRecht: CRM PlattformliestAlle protokollierten Anrufe des Kontos, neueste zuerst: aus der Calling Engine, im Lead-Panel protokolliert und über POST /v1/leads/{id}/calls. Jeder Eintrag ist derselbe wie unter GET /v1/leads/{id}/calls, dazu lead_id. Ergebnis und Gesprächspartner sind dieselben Angaben, die das CRM-Dashboard im Reiter Anrufe zählt.
Filter: from (einschließlich) und to (ausschließlich) beziehen sich auf den Zeitpunkt des Anrufs; outcome (eines oder mehrere, kommagetrennt), direction, lead_id und user_id (wer den Anruf protokolliert hat, wie der Filter Mitarbeiter in der App). Ohne Filter liefert die API die Anrufe des ganzen Kontos, wie die App sie jedem mit CRM-Zugang zeigt.
Ohne Aufnahmen, Mitschriften und Telefonnummern: Die technischen Verbindungen der Browser-Telefonie (Wählversuche unter CRM, Verbindungen, mit Gegennummer, Aufnahme und Twilio-Kennungen) gibt die API nicht heraus. Liest nur, kostet nichts.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
fromstring (date-time)Nur Anrufe ab diesem Zeitpunkt
tostring (date-time)Nur Anrufe vor diesem Zeitpunkt
outcomeListe aus stringmax. 7 EinträgeEin oder mehrere Ergebnisse, kommagetrennt, z. B. reached_decision_maker,callback_requested
reached_decision_makerreached_gatekeeperreached_othervoicemailnot_reachedwrong_numbercallback_requesteddirectionstringoutbound (ausgehend) oder inbound (eingehend)
outboundinbounduser_idstring (uuid)Nur Anrufe, die dieses Team-Mitglied protokolliert hat (GET /v1/team)
lead_idstring (uuid)Nur Anrufe dieses Leads
Felder der Antwort
idstring (uuid)ID des Anrufs
lead_idstring (uuid)Lead, zu dem der Anruf gehört (GET /v1/leads/{id})
called_atstring (date-time)Zeitpunkt des Anrufs. Standard: jetzt
directionstringoutbound (ausgehend, Standard) oder inbound (eingehend)
outboundinboundoutcomestringErgebnis: reached_decision_maker (Entscheider erreicht), reached_gatekeeper (Gatekeeper erreicht), reached_other (andere Person erreicht), voicemail (Mailbox), not_reached (nicht erreicht), wrong_number (falsche Nummer), callback_requested (Rückruf erbeten)
reached_decision_makerreached_gatekeeperreached_othervoicemailnot_reachedwrong_numbercallback_requestedduration_secondsinteger, kann null seinab 0bis 86400Dauer in Sekunden
spoke_with_typestring, kann null seinGesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown
decision_makergatekeeperassistantcolleagueunknownspoke_with_namestring, kann null seinmax. 200 ZeichenName der Person am Telefon
notesstring, kann null seinmax. 10000 ZeichenNotiz zum Anruf, erscheint auch im Verlauf
created_bystring (uuid), kann null seinTeam-Mitglied, das den Anruf protokolliert hat (bei der API: wer den Key erzeugt hat)
created_atstring (date-time)Zeitpunkt, zu dem der Anruf protokolliert wurde (kann von called_at abweichen)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/calls" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/calls", {
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/calls",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "6e7f8a9b-0c1d-4e2f-8a3b-4c5d6e7f8a9b",
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"called_at": "2026-10-18T08:15:00.000Z",
"direction": "outbound",
"outcome": "reached_decision_maker",
"duration_seconds": 420,
"spoke_with_type": "decision_maker",
"spoke_with_name": "Max Mustermann",
"notes": "Interesse an Paket Business, Angebot bis Freitag schicken.",
"created_by": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"created_at": "2026-10-18T08:23:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Gesprächsleitfäden auflisten
/v1/call-scriptsread:crmRecht: CRM PlattformliestDie Gesprächsleitfäden des Kontos, wie sie die App beim Telefonieren im CRM anzeigt und unter Assets, Gesprächsleitfäden pflegt. Nur aktive: Löschen blendet einen Leitfaden in der App aus. Reihenfolge wie in der App, nach Position, dann Name.
content ist der Text mit Platzhaltern in doppelten geschweiften Klammern (z. B. {{first_name}}, {{anrede}}), Abschnitten {{section:Name}} und Entscheidungsknöpfen {{decision:id}}. Die App setzt die Daten des Leads beim Anruf ein, die API liefert den Text unverändert. for_statuses, target_persona und conditions bestimmen, bei welchem Lead die App den Leitfaden vorschlägt.
Hat das Konto noch keine Leitfäden, legt die App beim ersten Öffnen Standard-Leitfäden an; die API legt nichts an und liefert dann eine leere Liste. Anlegen und ändern geht nur in der App. Liest nur, kostet nichts.
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 des Gesprächsleitfadens
namestringName des Leitfadens
descriptionstring, kann null seinKurzbeschreibung
call_typestringArt des Gesprächs, z. B. standard, qualification, demo, closing, checkin
for_statusesListe aus stringLead-Status, bei denen die App den Leitfaden vorschlägt, z. B. open, contacted
target_personastringFür wen: universal (alle), decision_maker (Entscheider) oder gatekeeper (Vorzimmer)
universaldecision_makergatekeepercontentstringText des Leitfadens. Platzhalter wie {{first_name}} ersetzt die App beim Anruf, {{section:Name}} sind Abschnitte, {{decision:id}} die Entscheidungsknöpfe aus inline_decisions
questionsListe aus objectFragen zur Qualifizierung während des Gesprächs: id, question, type (text, number, select, checkbox), required, options
inline_decisionsListe aus objectEntscheidungsknöpfe im Text: id, question, options (id, label, color, action show_text, switch_script oder continue, response_text, target_script_id)
conditionsobjectBedingungen, wann die App den Leitfaden vorschlägt (z. B. follow_up_reason, last_call_persona). Leer = keine
variable_fallbacksobjectErsatztexte je Platzhalter, wenn der Lead den Wert nicht hat, z. B. first_name: Sie
linked_custom_field_idsListe aus string (uuid)Custom Fields, die die App im Leitfaden zur Qualifizierung zeigt (GET /v1/custom-fields)
is_defaultbooleanStandard-Leitfaden
sort_orderinteger, kann null seinPosition in der Liste der App
created_atstring (date-time), kann null seinZeitpunkt der Anlage
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/call-scripts" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/call-scripts", {
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/call-scripts",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "2f3e4d5c-6b7a-4891-8a0b-1c2d3e4f5a6b",
"name": "Entscheider Skript",
"description": "Nachdem man zum Entscheider durchgestellt wurde",
"call_type": "standard",
"for_statuses": [
"open",
"contacted",
"not_reached",
"interested"
],
"target_persona": "decision_maker",
"content": "Hallo {{anrede}} {{last_name}},\n\nhier ist {{my_first_name}} von Muster GmbH.\n\n{{section:Pitch}}\nWir haben Ihnen neulich eine persönliche Videonachricht gesendet. Hatten Sie schon die Möglichkeit, sie anzuschauen?\n\n{{decision:interesse}}",
"questions": [
{
"id": "q1",
"question": "Wie viele Vertriebler im Team?",
"type": "number",
"required": false
}
],
"inline_decisions": [
{
"id": "interesse",
"question": "Hat der Kontakt Interesse?",
"options": [
{
"id": "ja",
"label": "Ja",
"color": "green",
"action": "continue"
},
{
"id": "nein",
"label": "Nein",
"color": "red",
"action": "show_text",
"response_text": "Was wäre das Schlimmste, das in 10 Minuten passieren kann?"
}
]
}
],
"conditions": {},
"variable_fallbacks": {
"first_name": "Sie"
},
"linked_custom_field_ids": [],
"is_default": true,
"sort_order": 1,
"created_at": "2026-09-02T08:00:00.000Z",
"updated_at": "2026-10-10T14:30:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Gesprächsleitfaden lesen
/v1/call-scripts/{id}read:crmRecht: CRM PlattformliestEin Gesprächsleitfaden mit Text, Fragen und Entscheidungsknöpfen, wie unter GET /v1/call-scripts. Ein in der App gelöschter Leitfaden ergibt 404. Liest nur, kostet nichts.
Pfad-Parameter
idstring (uuid)PflichtID des Gesprächsleitfadens
Felder der Antwort
idstring (uuid)ID des Gesprächsleitfadens
namestringName des Leitfadens
descriptionstring, kann null seinKurzbeschreibung
call_typestringArt des Gesprächs, z. B. standard, qualification, demo, closing, checkin
for_statusesListe aus stringLead-Status, bei denen die App den Leitfaden vorschlägt, z. B. open, contacted
target_personastringFür wen: universal (alle), decision_maker (Entscheider) oder gatekeeper (Vorzimmer)
universaldecision_makergatekeepercontentstringText des Leitfadens. Platzhalter wie {{first_name}} ersetzt die App beim Anruf, {{section:Name}} sind Abschnitte, {{decision:id}} die Entscheidungsknöpfe aus inline_decisions
questionsListe aus objectFragen zur Qualifizierung während des Gesprächs: id, question, type (text, number, select, checkbox), required, options
inline_decisionsListe aus objectEntscheidungsknöpfe im Text: id, question, options (id, label, color, action show_text, switch_script oder continue, response_text, target_script_id)
conditionsobjectBedingungen, wann die App den Leitfaden vorschlägt (z. B. follow_up_reason, last_call_persona). Leer = keine
variable_fallbacksobjectErsatztexte je Platzhalter, wenn der Lead den Wert nicht hat, z. B. first_name: Sie
linked_custom_field_idsListe aus string (uuid)Custom Fields, die die App im Leitfaden zur Qualifizierung zeigt (GET /v1/custom-fields)
is_defaultbooleanStandard-Leitfaden
sort_orderinteger, kann null seinPosition in der Liste der App
created_atstring (date-time), kann null seinZeitpunkt der Anlage
updated_atstring (date-time), kann null seinZeitpunkt der letzten Änderung
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/call-scripts/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/call-scripts/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/call-scripts/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"id": "2f3e4d5c-6b7a-4891-8a0b-1c2d3e4f5a6b",
"name": "Entscheider Skript",
"description": "Nachdem man zum Entscheider durchgestellt wurde",
"call_type": "standard",
"for_statuses": [
"open",
"contacted",
"not_reached",
"interested"
],
"target_persona": "decision_maker",
"content": "Hallo {{anrede}} {{last_name}},\n\nhier ist {{my_first_name}} von Muster GmbH.\n\n{{section:Pitch}}\nWir haben Ihnen neulich eine persönliche Videonachricht gesendet. Hatten Sie schon die Möglichkeit, sie anzuschauen?\n\n{{decision:interesse}}",
"questions": [
{
"id": "q1",
"question": "Wie viele Vertriebler im Team?",
"type": "number",
"required": false
}
],
"inline_decisions": [
{
"id": "interesse",
"question": "Hat der Kontakt Interesse?",
"options": [
{
"id": "ja",
"label": "Ja",
"color": "green",
"action": "continue"
},
{
"id": "nein",
"label": "Nein",
"color": "red",
"action": "show_text",
"response_text": "Was wäre das Schlimmste, das in 10 Minuten passieren kann?"
}
]
}
],
"conditions": {},
"variable_fallbacks": {
"first_name": "Sie"
},
"linked_custom_field_ids": [],
"is_default": true,
"sort_order": 1,
"created_at": "2026-09-02T08:00:00.000Z",
"updated_at": "2026-10-10T14:30:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Eigene Rufnummern auflisten
/v1/phone-numbersread:crmRecht: Inhaber oder AdminliestDie Rufnummern des Kontos, wie sie unter Einstellungen, Telefonie (Call-Flow) stehen: Nummer, Land, Status und das Team-Mitglied, dem sie zugewiesen ist. Gelöschte Nummern fehlen wie in der App, neueste zuerst.
country leitet die API aus der Ländervorwahl ab (DE, AT, CH), bei anderen Vorwahlen ist es null. Twilio-Kennungen und Kosten gibt die API nicht heraus.
Recht wie in der App: Die Seite ist Inhabern und Admins vorbehalten. Ein Mitglied sieht in der App nur die eigene zugewiesene Nummer im Telefon und bekommt hier 403. Kaufen, zuweisen und freigeben geht nur in der App. Liest nur, kostet nichts.
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 Rufnummer
phone_numberstringRufnummer im Format E.164, z. B. +4930123456789
countrystring, kann null seinLand aus der Ländervorwahl (DE, AT, CH), sonst null
DEATCHstatusstringactive (bereit für Anrufe) oder pending (wartet auf die Dokumentenprüfung)
activependingassigned_user_idstring (uuid), kann null seinTeam-Mitglied, dem die Nummer zugewiesen ist (GET /v1/team). null = niemandem
purchased_atstring (date-time), kann null seinZeitpunkt der Freischaltung
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/phone-numbers" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/phone-numbers", {
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/phone-numbers",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"phone_number": "+4930123456789",
"country": "DE",
"status": "active",
"assigned_user_id": "8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5f60",
"purchased_at": "2026-09-15T10:20:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Kontaktpersonen eines Leads
/v1/leads/{id}/contactsread:crmRecht: Leads einsehenliestWeitere Ansprechpartner am Lead, wie im Lead-Panel der App: der primäre zuerst, dann nach Anlage. Die Person des Leads selbst steht in GET /v1/leads/{id}.
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 Kontaktperson
lead_idstring (uuid)Lead, zu dem die Kontaktperson gehört
first_namestringmind. 1 Zeichenmax. 200 ZeichenVorname (Pflicht, wie in der App)
last_namestring, kann null seinmax. 200 ZeichenNachname der Kontaktperson
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse der Kontaktperson, wird klein geschrieben gespeichert. Keine Dublettenprüfung, wie in der App
phonestring, kann null seinmax. 50 ZeichenWird so gespeichert, wie übergeben (wie in der App)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
titlestring, kann null seinmax. 300 ZeichenPosition, z. B. Assistenz der Geschäftsführung
is_primarybooleanPrimärer Kontakt des Leads. Der erste Kontakt wird es automatisch.
created_atstring (date-time)Angelegt am
updated_atstring (date-time)Zuletzt geändert am
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/contacts" \
-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/contacts", {
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/contacts",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "4d5e6f70-8192-4a3b-9c4d-5e6f7a8b9c0d",
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"first_name": "Erika",
"last_name": "Beispiel",
"email": "[email protected]",
"phone": "+49 30 1234567",
"linkedin_url": "https://www.linkedin.com/in/erika-beispiel",
"title": "Assistenz der Geschäftsführung",
"is_primary": true,
"created_at": "2026-10-18T09:12:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Kontaktperson am Lead anlegen
/v1/leads/{id}/contactswrite:crmRecht: Leads anlegen/bearbeitenschreibtLegt einen weiteren Ansprechpartner am Lead an, wie „Weiteren Kontakt hinzufügen“ im Lead-Panel, und schreibt den Eintrag „Neuer Kontakt hinzugefügt“ in den Verlauf. Nur der Vorname ist Pflicht. Eine Dublettenprüfung gibt es dabei nicht, auch nicht in der App.
Wie in der App wird der erste Kontakt eines Leads automatisch primär. Die Leads-Tabelle der App zeigt dann dessen Name und E-Mail statt der Angaben des Leads. LinkedIn-Outreach, Landingpages und Videos nutzen weiter die Felder des Leads.
Pfad-Parameter
idstring (uuid)PflichtID des Leads
Body
first_namestringPflichtmind. 1 Zeichenmax. 200 ZeichenVorname (Pflicht, wie in der App)
last_namestring, kann null seinmax. 200 ZeichenNachname der Kontaktperson
emailstring (email), kann null seinmax. 320 ZeichenE-Mail-Adresse der Kontaktperson, wird klein geschrieben gespeichert. Keine Dublettenprüfung, wie in der App
phonestring, kann null seinmax. 50 ZeichenWird so gespeichert, wie übergeben (wie in der App)
linkedin_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil-URL
titlestring, kann null seinmax. 300 ZeichenPosition, z. B. Assistenz der Geschäftsführung
Mögliche Fehler
curl -X POST "https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/contacts" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Erika",
"last_name": "Beispiel",
"email": "[email protected]",
"phone": "+49 30 1234567",
"linkedin_url": "https://www.linkedin.com/in/erika-beispiel",
"title": "Assistenz der Geschäftsführung"
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/contacts", {
method: "POST",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"first_name": "Erika",
"last_name": "Beispiel",
"email": "[email protected]",
"phone": "+49 30 1234567",
"linkedin_url": "https://www.linkedin.com/in/erika-beispiel",
"title": "Assistenz der Geschäftsführung"
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.dealsky.io/functions/v1/api/v1/leads/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/contacts",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"first_name": "Erika",
"last_name": "Beispiel",
"email": "[email protected]",
"phone": "+49 30 1234567",
"linkedin_url": "https://www.linkedin.com/in/erika-beispiel",
"title": "Assistenz der Geschäftsführung"
},
)
print(res.json()){
"ok": true,
"data": {
"id": "4d5e6f70-8192-4a3b-9c4d-5e6f7a8b9c0d",
"lead_id": "5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
"first_name": "Erika",
"last_name": "Beispiel",
"email": "[email protected]",
"phone": "+49 30 1234567",
"linkedin_url": "https://www.linkedin.com/in/erika-beispiel",
"title": "Assistenz der Geschäftsführung",
"is_primary": true,
"created_at": "2026-10-18T09:12:00.000Z",
"updated_at": "2026-10-18T09:12:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}