dealsky.ioDocs
Zur App
API-Referenz

CRM

Notizen, Termine, Wiedervorlagen, Kontaktpersonen, Telefonate, Gesprächsleitfäden und Rufnummern

#

Notizen eines Leads

GET/v1/leads/{id}/notes
Scope read:crmRecht: Leads einsehenliest

Neueste 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)Pflicht

    ID des Leads

Query-Parameter

  • limitintegerab 1bis 100

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

Felder der Antwort
  • idstring (uuid)

    ID der Notiz

  • contentstringmind. 1 Zeichenmax. 10000 Zeichen

    Text der Notiz

  • created_bystring (uuid), kann null sein

    Team-Mitglied, das die Notiz angelegt hat (bei der API: wer den Key erzeugt hat)

  • created_by_typestring, kann null sein

    user (in der App angelegt) oder api

  • created_atstring (date-time)

    Zeitpunkt der Anlage

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

POST/v1/leads/{id}/notes
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Legt 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)Pflicht

    ID des Leads

Body

  • contentstringPflichtmind. 1 Zeichenmax. 10000 Zeichen

    Text der Notiz

Mögliche Fehler

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

DEL/v1/leads/{id}/notes/{note_id}
Scope delete:crmRecht: Leads anlegen/bearbeitenlöscht

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

    ID des Leads

  • note_idstring (uuid)Pflicht

    ID der Notiz

Felder der Antwort
  • deletedboolean

    true: Die Notiz wurde gelöscht

  • idstring (uuid)

    ID der gelöschten Notiz

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "ok": true,
  "data": {
    "deleted": true,
    "id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f"
  },
  "meta": {
    "request_id": "req_7f3a…"
  }
}
#

Wiedervorlage eines Leads lesen

GET/v1/leads/{id}/follow-up
Scope read:crmRecht: Leads einsehenliest

Zeitpunkt, 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)Pflicht

    ID des Leads

Felder der Antwort
  • lead_idstring (uuid)

    ID des Leads

  • statusstring

    Vertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.

  • snoozed_untilstring (date-time), kann null sein

    Zeitpunkt der Wiedervorlage. null = keine Wiedervorlage

  • follow_up_notestring, kann null sein

    Notiz zur Wiedervorlage

  • follow_up_reasonstring, kann null sein

    Grund der Wiedervorlage

    scheduling no_show_setting no_show_closing decision_pending stakeholder_review callback_requested proposal_review
  • follow_up_attemptsinteger, kann null sein

    Zahl der Nachfass-Versuche

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

PUT/v1/leads/{id}/follow-up
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Setzt 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)Pflicht

    ID des Leads

Body

  • snoozed_untilstring (date-time)Pflicht

    Zeitpunkt der Wiedervorlage, z. B. 2026-10-21T09:00:00+02:00

  • follow_up_notestring, kann null seinmax. 5000 Zeichen

    Notiz zur Wiedervorlage. Nicht übergeben = bleibt, null = leeren

  • follow_up_reasonstring, kann null sein

    Grund: 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

    scheduling no_show_setting no_show_closing decision_pending stakeholder_review callback_requested proposal_review
  • count_attemptboolean

    true: Nachfass-Versuche um 1 erhöhen (Standard: false)

Felder der Antwort
  • lead_idstring (uuid)

    ID des Leads

  • statusstring

    Vertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.

  • snoozed_untilstring (date-time), kann null sein

    Zeitpunkt der Wiedervorlage. null = keine Wiedervorlage

  • follow_up_notestring, kann null sein

    Notiz zur Wiedervorlage

  • follow_up_reasonstring, kann null sein

    Grund der Wiedervorlage

    scheduling no_show_setting no_show_closing decision_pending stakeholder_review callback_requested proposal_review
  • follow_up_attemptsinteger, kann null sein

    Zahl der Nachfass-Versuche

Mögliche Fehler

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

DEL/v1/leads/{id}/follow-up
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Wie „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)Pflicht

    ID des Leads

Query-Parameter

  • reset_attemptsboolean

    Nachfass-Versuche auf 0 setzen (Standard: false)

Felder der Antwort
  • lead_idstring (uuid)

    ID des Leads

  • statusstring

    Vertriebsstatus des Leads. Eine Wiedervorlage setzt ihn wie die App auf follow_up.

  • snoozed_untilstring (date-time), kann null sein

    Zeitpunkt der Wiedervorlage. null = keine Wiedervorlage

  • follow_up_notestring, kann null sein

    Notiz zur Wiedervorlage

  • follow_up_reasonstring, kann null sein

    Grund der Wiedervorlage

    scheduling no_show_setting no_show_closing decision_pending stakeholder_review callback_requested proposal_review
  • follow_up_attemptsinteger, kann null sein

    Zahl der Nachfass-Versuche

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

PUT/v1/leads/{id}/meeting
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Trä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)Pflicht

    ID des Leads

Body

  • scheduled_atstring (date-time)Pflicht

    Zeitpunkt des Termins, z. B. 2026-10-22T10:30:00+02:00

  • meeting_typestringPflicht

    setting (Setting-Call), closing (Closing-Call), demo (Demo/Präsentation) oder other (Sonstiges)

    setting closing demo other
  • mark_bookedboolean

    true: Status auf booked setzen (Standard: false)

Felder der Antwort
  • lead_idstring (uuid)

    ID des Leads

  • meeting_scheduled_atstring (date-time), kann null sein

    Zeitpunkt des Termins

  • meeting_typestring, kann null sein

    setting, closing, demo oder other

    setting closing demo other
  • statusstring

    Vertriebsstatus des Leads

Mögliche Fehler

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

DEL/v1/leads/{id}/meeting
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Leert 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)Pflicht

    ID des Leads

Felder der Antwort
  • lead_idstring (uuid)

    ID des Leads

  • meeting_scheduled_atstring (date-time), kann null sein

    Zeitpunkt des Termins

  • meeting_typestring, kann null sein

    setting, closing, demo oder other

    setting closing demo other
  • statusstring

    Vertriebsstatus des Leads

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X DELETE "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

GET/v1/leads/{id}/calls
Scope read:crmRecht: Leads einsehenliest

Protokollierte 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)Pflicht

    ID des Leads

Query-Parameter

  • limitintegerab 1bis 100

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

Felder der Antwort
  • idstring (uuid)

    ID des Anruf-Eintrags

  • called_atstring (date-time)

    Zeitpunkt des Anrufs. Standard: jetzt

  • directionstring

    outbound (ausgehend, Standard) oder inbound (eingehend)

    outbound inbound
  • outcomestring

    Ergebnis: 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_maker reached_gatekeeper reached_other voicemail not_reached wrong_number callback_requested
  • duration_secondsinteger, kann null seinab 0bis 86400

    Dauer in Sekunden

  • spoke_with_typestring, kann null sein

    Gesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown

    decision_maker gatekeeper assistant colleague unknown
  • spoke_with_namestring, kann null seinmax. 200 Zeichen

    Name der Person am Telefon

  • notesstring, kann null seinmax. 10000 Zeichen

    Notiz zum Anruf, erscheint auch im Verlauf

  • created_bystring (uuid), kann null sein

    Team-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

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

POST/v1/leads/{id}/calls
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Protokolliert 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)Pflicht

    ID des Leads

Body

  • outcomestringPflicht

    Ergebnis: 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_maker reached_gatekeeper reached_other voicemail not_reached wrong_number callback_requested
  • directionstring

    outbound (ausgehend, Standard) oder inbound (eingehend)

    outbound inbound
  • called_atstring (date-time)

    Zeitpunkt des Anrufs. Standard: jetzt

  • duration_secondsinteger, kann null seinab 0bis 86400

    Dauer in Sekunden

  • spoke_with_typestring, kann null sein

    Gesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown

    decision_maker gatekeeper assistant colleague unknown
  • spoke_with_namestring, kann null seinmax. 200 Zeichen

    Name der Person am Telefon

  • notesstring, kann null seinmax. 10000 Zeichen

    Notiz zum Anruf, erscheint auch im Verlauf

Mögliche Fehler

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

GET/v1/calls
Scope read:crmRecht: CRM Plattformliest

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

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

  • cursorstringmax. 200 Zeichen

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

    Ein oder mehrere Ergebnisse, kommagetrennt, z. B. reached_decision_maker,callback_requested

    reached_decision_maker reached_gatekeeper reached_other voicemail not_reached wrong_number callback_requested
  • directionstring

    outbound (ausgehend) oder inbound (eingehend)

    outbound inbound
  • user_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

  • directionstring

    outbound (ausgehend, Standard) oder inbound (eingehend)

    outbound inbound
  • outcomestring

    Ergebnis: 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_maker reached_gatekeeper reached_other voicemail not_reached wrong_number callback_requested
  • duration_secondsinteger, kann null seinab 0bis 86400

    Dauer in Sekunden

  • spoke_with_typestring, kann null sein

    Gesprochen mit: decision_maker, gatekeeper, assistant, colleague oder unknown

    decision_maker gatekeeper assistant colleague unknown
  • spoke_with_namestring, kann null seinmax. 200 Zeichen

    Name der Person am Telefon

  • notesstring, kann null seinmax. 10000 Zeichen

    Notiz zum Anruf, erscheint auch im Verlauf

  • created_bystring (uuid), kann null sein

    Team-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

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

GET/v1/call-scripts
Scope read:crmRecht: CRM Plattformliest

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

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

Felder der Antwort
  • idstring (uuid)

    ID des Gesprächsleitfadens

  • namestring

    Name des Leitfadens

  • descriptionstring, kann null sein

    Kurzbeschreibung

  • call_typestring

    Art des Gesprächs, z. B. standard, qualification, demo, closing, checkin

  • for_statusesListe aus string

    Lead-Status, bei denen die App den Leitfaden vorschlägt, z. B. open, contacted

  • target_personastring

    Für wen: universal (alle), decision_maker (Entscheider) oder gatekeeper (Vorzimmer)

    universal decision_maker gatekeeper
  • contentstring

    Text 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 object

    Fragen zur Qualifizierung während des Gesprächs: id, question, type (text, number, select, checkbox), required, options

  • inline_decisionsListe aus object

    Entscheidungsknöpfe im Text: id, question, options (id, label, color, action show_text, switch_script oder continue, response_text, target_script_id)

  • conditionsobject

    Bedingungen, wann die App den Leitfaden vorschlägt (z. B. follow_up_reason, last_call_persona). Leer = keine

  • variable_fallbacksobject

    Ersatztexte 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_defaultboolean

    Standard-Leitfaden

  • sort_orderinteger, kann null sein

    Position in der Liste der App

  • created_atstring (date-time), kann null sein

    Zeitpunkt der Anlage

  • updated_atstring (date-time), kann null sein

    Zeitpunkt der letzten Änderung

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

GET/v1/call-scripts/{id}
Scope read:crmRecht: CRM Plattformliest

Ein 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)Pflicht

    ID des Gesprächsleitfadens

Felder der Antwort
  • idstring (uuid)

    ID des Gesprächsleitfadens

  • namestring

    Name des Leitfadens

  • descriptionstring, kann null sein

    Kurzbeschreibung

  • call_typestring

    Art des Gesprächs, z. B. standard, qualification, demo, closing, checkin

  • for_statusesListe aus string

    Lead-Status, bei denen die App den Leitfaden vorschlägt, z. B. open, contacted

  • target_personastring

    Für wen: universal (alle), decision_maker (Entscheider) oder gatekeeper (Vorzimmer)

    universal decision_maker gatekeeper
  • contentstring

    Text 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 object

    Fragen zur Qualifizierung während des Gesprächs: id, question, type (text, number, select, checkbox), required, options

  • inline_decisionsListe aus object

    Entscheidungsknöpfe im Text: id, question, options (id, label, color, action show_text, switch_script oder continue, response_text, target_script_id)

  • conditionsobject

    Bedingungen, wann die App den Leitfaden vorschlägt (z. B. follow_up_reason, last_call_persona). Leer = keine

  • variable_fallbacksobject

    Ersatztexte 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_defaultboolean

    Standard-Leitfaden

  • sort_orderinteger, kann null sein

    Position in der Liste der App

  • created_atstring (date-time), kann null sein

    Zeitpunkt der Anlage

  • updated_atstring (date-time), kann null sein

    Zeitpunkt der letzten Änderung

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

GET/v1/phone-numbers
Scope read:crmRecht: Inhaber oder Adminliest

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

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

Felder der Antwort
  • idstring (uuid)

    ID der Rufnummer

  • phone_numberstring

    Rufnummer im Format E.164, z. B. +4930123456789

  • countrystring, kann null sein

    Land aus der Ländervorwahl (DE, AT, CH), sonst null

    DE AT CH
  • statusstring

    active (bereit für Anrufe) oder pending (wartet auf die Dokumentenprüfung)

    active pending
  • assigned_user_idstring (uuid), kann null sein

    Team-Mitglied, dem die Nummer zugewiesen ist (GET /v1/team). null = niemandem

  • purchased_atstring (date-time), kann null sein

    Zeitpunkt der Freischaltung

Mögliche Fehler

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

GET/v1/leads/{id}/contacts
Scope read:crmRecht: Leads einsehenliest

Weitere 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)Pflicht

    ID des Leads

Query-Parameter

  • limitintegerab 1bis 100

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

Felder der Antwort
  • idstring (uuid)

    ID der Kontaktperson

  • lead_idstring (uuid)

    Lead, zu dem die Kontaktperson gehört

  • first_namestringmind. 1 Zeichenmax. 200 Zeichen

    Vorname (Pflicht, wie in der App)

  • last_namestring, kann null seinmax. 200 Zeichen

    Nachname der Kontaktperson

  • emailstring (email), kann null seinmax. 320 Zeichen

    E-Mail-Adresse der Kontaktperson, wird klein geschrieben gespeichert. Keine Dublettenprüfung, wie in der App

  • phonestring, kann null seinmax. 50 Zeichen

    Wird so gespeichert, wie übergeben (wie in der App)

  • linkedin_urlstring (uri), kann null seinmax. 2048 Zeichen

    LinkedIn-Profil-URL

  • titlestring, kann null seinmax. 300 Zeichen

    Position, z. B. Assistenz der Geschäftsführung

  • is_primaryboolean

    Primä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

400 VALIDATION_ERROR401 INVALID_API_KEY402 PLAN_REQUIRED403 SCOPE_MISSING404 NOT_FOUND429 RATE_LIMITED
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/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())
Antwort 200
{
  "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

POST/v1/leads/{id}/contacts
Scope write:crmRecht: Leads anlegen/bearbeitenschreibt

Legt 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)Pflicht

    ID des Leads

Body

  • first_namestringPflichtmind. 1 Zeichenmax. 200 Zeichen

    Vorname (Pflicht, wie in der App)

  • last_namestring, kann null seinmax. 200 Zeichen

    Nachname der Kontaktperson

  • emailstring (email), kann null seinmax. 320 Zeichen

    E-Mail-Adresse der Kontaktperson, wird klein geschrieben gespeichert. Keine Dublettenprüfung, wie in der App

  • phonestring, kann null seinmax. 50 Zeichen

    Wird so gespeichert, wie übergeben (wie in der App)

  • linkedin_urlstring (uri), kann null seinmax. 2048 Zeichen

    LinkedIn-Profil-URL

  • titlestring, kann null seinmax. 300 Zeichen

    Position, z. B. Assistenz der Geschäftsführung

Mögliche Fehler

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