Postfach
LinkedIn-Unterhaltungen lesen und pflegen
Unterhaltungen im Postfach
/v1/inbox/conversationsread:inboxRecht: Nur InboxliestDie LinkedIn-Unterhaltungen wie in der Chat-Liste des Postfachs, neueste Nachricht zuerst (order=oldest dreht es um, wie „Älteste zuerst“ in der App). Sichtbar sind wie in der App nur Unterhaltungen von verbundenen LinkedIn-Konten, auf die die Person, die den Key erzeugt hat, im Postfach Zugriff hat (Inhaber und Admins: alle Konten; Mitglieder: die ihnen zugewiesenen). Nur lesend: Die API synchronisiert nichts mit LinkedIn und markiert nichts als gelesen. Je Unterhaltung: Gegenüber, Vorschau der letzten Nachricht, Ungelesen, der Status nach der Regel des Postfachs (triage), von Hand gesetzte Angaben und, bei eingeschaltetem KI-Assistenten, die KI-Einordnung. Den vollständigen Verlauf liefert /v1/inbox/conversations/{chat_id}/messages. Suche (q) im Namen bei LinkedIn und im vollständigen Text der letzten Nachricht (ein Lead-Name, den die App nur ersatzweise anzeigt, wird nicht durchsucht). Mit triage prüft eine Anfrage höchstens 1000 Unterhaltungen; eine Seite kann dann weniger Einträge haben und trotzdem einen next_cursor.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
account_idstring (uuid)Nur Unterhaltungen dieses LinkedIn-Kontos
triagestringNur Unterhaltungen mit diesem Status
needs_replywaitingsnoozeddonelead_idstring (uuid)Nur Unterhaltungen mit diesem Lead
qstringmax. 200 ZeichenSuche im Namen bei LinkedIn und in der letzten Nachricht, ohne Groß/Klein
orderstringnewest (Standard) oder oldest, nach der letzten Nachricht
newestoldest
Felder der Antwort
idstring (uuid)ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}
accountobjectEigenes LinkedIn-Konto der Unterhaltung
Felder anzeigen
idstring (uuid)LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})
namestring, kann null seinAnzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist
counterpartobjectGesprächspartner auf LinkedIn
Felder anzeigen
namestring, kann null seinName bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)
profile_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil des Gegenübers, falls LinkedIn es liefert
lead_idstring (uuid), kann null seinVerknüpfter Lead, falls vorhanden
last_messageobject, kann null seinLetzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist
Felder anzeigen
atstring (date-time), kann null seinZeitpunkt der letzten Nachricht (ISO 8601, UTC)
directionstring, kann null seininbound = vom Kontakt, outbound = von Ihnen
inboundoutboundpreviewstring, kann null seinVorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...
unread_countintegerUngelesene eingehende Nachrichten (0 = gelesen)
triagestringneeds_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.
needs_replywaitingsnoozeddonefollowup_scheduled_atstring (date-time), kann null seinNächstes geplantes Follow-up, falls eines läuft
stateobject, kann null seinVon Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde
Felder anzeigen
statusstring, kann null seinManuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)
donesnoozedopensnooze_untilstring (date-time), kann null seinBei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)
handled_atstring (date-time), kann null seinZeitpunkt der letzten manuellen Änderung
tagsListe aus stringSchlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)
sentimentstring, kann null seinVon Hand gesetzte Stimmung
positivneutralnegativ
classificationobject, kann null seinKI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.
Felder anzeigen
categorystring, kann null seinKI-Antwortkategorie, z. B. interesse, question, objection, not_interested
subcategorystring, kann null seinFeinere KI-Kategorie, null wenn keine vergeben ist
sentimentstring, kann null seinStimmung laut KI
positivneutralnegativstagestring, kann null seinGesprächsphase laut KI
confidencenumber, kann null seinSicherheit der KI zwischen 0 und 1
reasoningstring, kann null seinBegründung der KI für die Einordnung, Freitext auf Deutsch
classified_atstring (date-time), kann null seinZeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)
created_atstring (date-time), kann null seinZeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/conversations" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/conversations", {
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/inbox/conversations",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "c4a1e2b3-5d6f-4a7b-8c9d-0e1f2a3b4c5d",
"account": {
"id": "7b2d9c41-3e5f-4a68-9b1c-2d3e4f5a6b7c",
"name": "Anna Beispiel"
},
"counterpart": {
"name": "Max Mustermann",
"profile_url": "https://www.linkedin.com/in/max-mustermann",
"lead_id": "5f1e2d3c-4b5a-4968-8776-655443322110"
},
"last_message": {
"at": "2026-10-18T09:41:12.000Z",
"direction": "inbound",
"preview": "Klingt spannend, wie läuft so ein E..."
},
"unread_count": 1,
"triage": "needs_reply",
"followup_scheduled_at": null,
"state": {
"status": null,
"snooze_until": null,
"handled_at": "2026-10-17T15:02:00.000Z",
"tags": [
"interesse",
"Messe"
],
"sentiment": null
},
"classification": {
"category": "interesse",
"subcategory": null,
"sentiment": "positiv",
"stage": "soft_pitch",
"confidence": 0.86,
"reasoning": "Der Kontakt fragt nach dem Ablauf und signalisiert Interesse am Angebot.",
"classified_at": "2026-10-18T09:42:03.000Z"
},
"created_at": "2026-09-02T10:15:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Eine Unterhaltung
/v1/inbox/conversations/{chat_id}read:inboxRecht: Nur InboxliestDieselben Angaben wie in der Liste. Sichtbar sind wie in der App nur Unterhaltungen von verbundenen LinkedIn-Konten, auf die die Person, die den Key erzeugt hat, im Postfach Zugriff hat (Inhaber und Admins: alle Konten; Mitglieder: die ihnen zugewiesenen). Nur lesend: Die API synchronisiert nichts mit LinkedIn und markiert nichts als gelesen. Eine Unterhaltung außerhalb dieser Konten oder eines anderen Kontos ergibt 404.
Pfad-Parameter
chat_idstring (uuid)PflichtID der Unterhaltung
Felder der Antwort
idstring (uuid)ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}
accountobjectEigenes LinkedIn-Konto der Unterhaltung
Felder anzeigen
idstring (uuid)LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})
namestring, kann null seinAnzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist
counterpartobjectGesprächspartner auf LinkedIn
Felder anzeigen
namestring, kann null seinName bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)
profile_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil des Gegenübers, falls LinkedIn es liefert
lead_idstring (uuid), kann null seinVerknüpfter Lead, falls vorhanden
last_messageobject, kann null seinLetzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist
Felder anzeigen
atstring (date-time), kann null seinZeitpunkt der letzten Nachricht (ISO 8601, UTC)
directionstring, kann null seininbound = vom Kontakt, outbound = von Ihnen
inboundoutboundpreviewstring, kann null seinVorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...
unread_countintegerUngelesene eingehende Nachrichten (0 = gelesen)
triagestringneeds_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.
needs_replywaitingsnoozeddonefollowup_scheduled_atstring (date-time), kann null seinNächstes geplantes Follow-up, falls eines läuft
stateobject, kann null seinVon Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde
Felder anzeigen
statusstring, kann null seinManuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)
donesnoozedopensnooze_untilstring (date-time), kann null seinBei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)
handled_atstring (date-time), kann null seinZeitpunkt der letzten manuellen Änderung
tagsListe aus stringSchlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)
sentimentstring, kann null seinVon Hand gesetzte Stimmung
positivneutralnegativ
classificationobject, kann null seinKI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.
Felder anzeigen
categorystring, kann null seinKI-Antwortkategorie, z. B. interesse, question, objection, not_interested
subcategorystring, kann null seinFeinere KI-Kategorie, null wenn keine vergeben ist
sentimentstring, kann null seinStimmung laut KI
positivneutralnegativstagestring, kann null seinGesprächsphase laut KI
confidencenumber, kann null seinSicherheit der KI zwischen 0 und 1
reasoningstring, kann null seinBegründung der KI für die Einordnung, Freitext auf Deutsch
classified_atstring (date-time), kann null seinZeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)
created_atstring (date-time), kann null seinZeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/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/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"id": "c4a1e2b3-5d6f-4a7b-8c9d-0e1f2a3b4c5d",
"account": {
"id": "7b2d9c41-3e5f-4a68-9b1c-2d3e4f5a6b7c",
"name": "Anna Beispiel"
},
"counterpart": {
"name": "Max Mustermann",
"profile_url": "https://www.linkedin.com/in/max-mustermann",
"lead_id": "5f1e2d3c-4b5a-4968-8776-655443322110"
},
"last_message": {
"at": "2026-10-18T09:41:12.000Z",
"direction": "inbound",
"preview": "Klingt spannend, wie läuft so ein E..."
},
"unread_count": 1,
"triage": "needs_reply",
"followup_scheduled_at": null,
"state": {
"status": null,
"snooze_until": null,
"handled_at": "2026-10-17T15:02:00.000Z",
"tags": [
"interesse",
"Messe"
],
"sentiment": null
},
"classification": {
"category": "interesse",
"subcategory": null,
"sentiment": "positiv",
"stage": "soft_pitch",
"confidence": 0.86,
"reasoning": "Der Kontakt fragt nach dem Ablauf und signalisiert Interesse am Angebot.",
"classified_at": "2026-10-18T09:42:03.000Z"
},
"created_at": "2026-09-02T10:15:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Status, Schlagwörter und Stimmung einer Unterhaltung setzen
/v1/inbox/conversations/{chat_id}write:inboxRecht: Nur InboxschreibtSetzt den Zustand einer Unterhaltung wie die Knöpfe im Postfach der App: Schließen (status: done), Wiedervorlage bis zu einem Zeitpunkt (status: snoozed mit snooze_until), Wieder öffnen (status: open), dazu Schlagwörter und Stimmung. Nicht übergebene Felder bleiben unverändert. Die Antwort ist die Unterhaltung wie bei GET /v1/inbox/conversations/{chat_id}; triage folgt danach der Regel des Postfachs (eine neue Antwort des Kontakts öffnet eine geschlossene Unterhaltung wieder, eine abgelaufene Wiedervorlage ebenso). Der Status zählt wie in der App für die Kennzahl „Unbeantwortete Antworten“ im Dashboard.
tags ersetzt die Schlagwörter vollständig (höchstens 20, [] entfernt alle). Erlaubt sind die eigenen Schlagwörter des Postfachs und, bei eingeschaltetem KI-Assistenten, die KI-Kategorien (beides liefert GET /v1/inbox/tags), außerdem die an der Unterhaltung schon gespeicherten. Solange an einer Unterhaltung nie Schlagwörter gespeichert wurden, zeigt die App bei eingeschaltetem KI-Assistenten die KI-Kategorie (classification.category) als Schlagwort an; wer sie behalten will, gibt sie mit. Ist der KI-Assistent aus, blendet die App gespeicherte KI-Kategorien aus und verwirft sie beim nächsten Speichern der Schlagwörter, die API ebenso.
add_tags und remove_tags ändern die Schlagwörter schrittweise, ohne die Liste zu ersetzen, etwa damit ein KI-Agent ein Schlagwort setzt und die übrigen stehen lässt (nicht zusammen mit tags, miteinander schon). Grundlage ist, was die App an der Unterhaltung anzeigt: die gespeicherten Schlagwörter oder, solange dort nie welche gespeichert wurden und der KI-Assistent eingeschaltet ist, die KI-Kategorie (classification.category). Wie mit den Schlagwort-Chips im Postfach wird zuerst entfernt, dann hinten angefügt. Erlaubt sind dieselben Werte wie bei tags, Groß/Klein egal; ein Schlagwort, das schon dran ist, bzw. eines, das nicht dran ist, ändert nichts. Ändert sich insgesamt nichts, wird nichts gespeichert (auch die nur angezeigte KI-Kategorie nicht), die Antwort zeigt den unveränderten Stand und der Test-Key fields: {}. Mehr als 20 Schlagwörter danach ergeben 400.
sentiment überschreibt die von der KI abgeleitete Stimmung, null stellt sie wieder auf automatisch. Wie in der App nur bei eingeschaltetem KI-Assistenten, sonst 422 mit reason: inbox_ai_disabled.
Änderbar sind wie in der App nur Unterhaltungen verbundener LinkedIn-Konten, auf die die Person, die den Key erzeugt hat, im Postfach Zugriff hat; alle anderen ergeben 404. Wirkt nicht nach außen: Es wird nichts gesendet, keine Sequenz gestoppt, kein Follow-up geändert und nichts mit LinkedIn synchronisiert; als gelesen markiert die API nichts. Einen Termin markiert dieser Endpunkt nicht. Kostet keine Credits. Mit Test-Key laufen alle Prüfungen, gespeichert wird nichts (would_update).
Pfad-Parameter
chat_idstring (uuid)PflichtID der Unterhaltung
Body
statusstringdone = Schließen, snoozed = Wiedervorlage bis snooze_until, open = Wieder öffnen
opensnoozeddonesnooze_untilstring (date-time)Nur mit status snoozed (dann Pflicht): Zeitpunkt in der Zukunft, ab dem die Unterhaltung wieder offen ist
tagsListe aus stringmax. 20 EinträgeErsetzt die Schlagwörter vollständig, [] entfernt alle. Werte aus GET /v1/inbox/tags oder bereits gespeicherte, Groß/Klein egal
add_tagsListe aus stringmax. 20 EinträgeFügt Schlagwörter hinten an, die vorhandenen bleiben (nicht zusammen mit tags). Werte wie bei tags; ein schon vorhandenes ändert nichts
remove_tagsListe aus stringmax. 20 EinträgeEntfernt Schlagwörter, die übrigen bleiben (nicht zusammen mit tags). Ein nicht vorhandenes ändert nichts
sentimentstring, kann null seinStimmung von Hand, null = wieder automatisch (nur mit KI-Assistent)
positivneutralnegativ
Felder der Antwort
idstring (uuid)ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}
accountobjectEigenes LinkedIn-Konto der Unterhaltung
Felder anzeigen
idstring (uuid)LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})
namestring, kann null seinAnzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist
counterpartobjectGesprächspartner auf LinkedIn
Felder anzeigen
namestring, kann null seinName bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)
profile_urlstring (uri), kann null seinmax. 2048 ZeichenLinkedIn-Profil des Gegenübers, falls LinkedIn es liefert
lead_idstring (uuid), kann null seinVerknüpfter Lead, falls vorhanden
last_messageobject, kann null seinLetzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist
Felder anzeigen
atstring (date-time), kann null seinZeitpunkt der letzten Nachricht (ISO 8601, UTC)
directionstring, kann null seininbound = vom Kontakt, outbound = von Ihnen
inboundoutboundpreviewstring, kann null seinVorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...
unread_countintegerUngelesene eingehende Nachrichten (0 = gelesen)
triagestringneeds_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.
needs_replywaitingsnoozeddonefollowup_scheduled_atstring (date-time), kann null seinNächstes geplantes Follow-up, falls eines läuft
stateobject, kann null seinVon Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde
Felder anzeigen
statusstring, kann null seinManuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)
donesnoozedopensnooze_untilstring (date-time), kann null seinBei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)
handled_atstring (date-time), kann null seinZeitpunkt der letzten manuellen Änderung
tagsListe aus stringSchlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)
sentimentstring, kann null seinVon Hand gesetzte Stimmung
positivneutralnegativ
classificationobject, kann null seinKI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.
Felder anzeigen
categorystring, kann null seinKI-Antwortkategorie, z. B. interesse, question, objection, not_interested
subcategorystring, kann null seinFeinere KI-Kategorie, null wenn keine vergeben ist
sentimentstring, kann null seinStimmung laut KI
positivneutralnegativstagestring, kann null seinGesprächsphase laut KI
confidencenumber, kann null seinSicherheit der KI zwischen 0 und 1
reasoningstring, kann null seinBegründung der KI für die Einordnung, Freitext auf Deutsch
classified_atstring (date-time), kann null seinZeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)
created_atstring (date-time), kann null seinZeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)
Mögliche Fehler
curl -X PATCH "https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "snoozed",
"snooze_until": "2026-10-26T09:00:00+01:00"
}'const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10", {
method: "PATCH",
headers: {
"X-API-Key": process.env.DEALSKY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"status": "snoozed",
"snooze_until": "2026-10-26T09:00:00+01:00"
}),
});
const { ok, data, error } = await res.json();import os, requests
res = requests.request(
"PATCH",
"https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
json={
"status": "snoozed",
"snooze_until": "2026-10-26T09:00:00+01:00"
},
)
print(res.json()){
"ok": true,
"data": {
"id": "c4a1e2b3-5d6f-4a7b-8c9d-0e1f2a3b4c5d",
"account": {
"id": "7b2d9c41-3e5f-4a68-9b1c-2d3e4f5a6b7c",
"name": "Anna Beispiel"
},
"counterpart": {
"name": "Max Mustermann",
"profile_url": "https://www.linkedin.com/in/max-mustermann",
"lead_id": "5f1e2d3c-4b5a-4968-8776-655443322110"
},
"last_message": {
"at": "2026-10-18T09:41:12.000Z",
"direction": "inbound",
"preview": "Klingt spannend, wie läuft so ein E..."
},
"unread_count": 1,
"triage": "snoozed",
"followup_scheduled_at": null,
"state": {
"status": "snoozed",
"snooze_until": "2026-10-26T08:00:00.000Z",
"handled_at": "2026-10-18T10:05:00.000Z",
"tags": [
"interesse",
"Messe"
],
"sentiment": null
},
"classification": {
"category": "interesse",
"subcategory": null,
"sentiment": "positiv",
"stage": "soft_pitch",
"confidence": 0.86,
"reasoning": "Der Kontakt fragt nach dem Ablauf und signalisiert Interesse am Angebot.",
"classified_at": "2026-10-18T09:42:03.000Z"
},
"created_at": "2026-09-02T10:15:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}Nachrichten einer Unterhaltung
/v1/inbox/conversations/{chat_id}/messagesread:inboxRecht: Nur InboxliestDer Verlauf einer Unterhaltung, älteste zuerst wie im Postfach der App (order=newest für die neuesten zuerst). Anders als die App, die den Verlauf in einem Stück lädt und bei 1000 Nachrichten abschneidet, blättert die API ohne Grenze. Sichtbar sind wie in der App nur Unterhaltungen von verbundenen LinkedIn-Konten, auf die die Person, die den Key erzeugt hat, im Postfach Zugriff hat (Inhaber und Admins: alle Konten; Mitglieder: die ihnen zugewiesenen). Nur lesend: Die API synchronisiert nichts mit LinkedIn und markiert nichts als gelesen. Anhänge werden nur beschrieben (Art, Typ, Name, Größe, Dauer); die Dateien selbst liefert die API nicht, sie sind im Postfach der App abrufbar. Nachrichten, die LinkedIn als Reaktion schickt (z. B. „reagiert mit 👍“), stehen wie geliefert im Verlauf.
Pfad-Parameter
chat_idstring (uuid)PflichtID der Unterhaltung
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
orderstringoldest (Standard, wie in der App) oder newest
oldestnewest
Felder der Antwort
idstring (uuid)ID der Nachricht
conversation_idstring (uuid)ID der Unterhaltung (chat_id)
directionstringinbound = vom Kontakt, outbound = von Ihnen
inboundoutboundtextstring, kann null seinNachrichtentext, null bei reinen Anhängen
typestring, kann null seinArt laut LinkedIn, z. B. text oder voice_note
transcriptionstring, kann null seinAbschrift einer Sprachnachricht, sobald vorhanden
attachmentsListe aus objectAnhänge der Nachricht als Beschreibung ohne Download-Adresse, leer ohne Anhang
Felder anzeigen
indexintegerPosition des Anhangs in der Nachricht (0 = erster)
kindstringaudio (auch Sprachnachricht), image, video, shared_post (geteilter LinkedIn-Beitrag) oder file
audioimagevideoshared_postfilemime_typestring, kann null seinDateityp (MIME), z. B. image/jpeg, falls LinkedIn einen liefert
namestring, kann null seinDateiname, falls LinkedIn einen liefert
size_bytesinteger, kann null seinDateigröße in Bytes, falls bekannt
widthinteger, kann null seinNur Bilder: Breite in Pixeln, falls bekannt
heightinteger, kann null seinNur Bilder: Höhe in Pixeln, falls bekannt
duration_secondsnumber, kann null seinNur Audio und Video, falls bekannt
unavailablebooleantrue, wenn LinkedIn den Inhalt nicht mehr liefert (z. B. gelöschter Beitrag)
post_urlstring (uri), kann null seinmax. 2048 ZeichenNur shared_post: öffentlicher Link auf den Beitrag bei LinkedIn
sent_atstring (date-time)Sendezeitpunkt (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/messages" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/messages", {
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/inbox/conversations/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10/messages",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "1b2c3d4e-5f60-4718-8293-a4b5c6d7e8f9",
"conversation_id": "c4a1e2b3-5d6f-4a7b-8c9d-0e1f2a3b4c5d",
"direction": "outbound",
"text": "Hallo Herr Mustermann, danke für die Vernetzung! Darf ich Ihnen kurz zeigen, wie wir Erstgespräche planen?",
"type": "text",
"transcription": null,
"attachments": [],
"sent_at": "2026-10-17T15:02:00.000Z"
},
{
"id": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"conversation_id": "c4a1e2b3-5d6f-4a7b-8c9d-0e1f2a3b4c5d",
"direction": "inbound",
"text": "Klingt spannend, wie läuft so ein Erstgespräch bei Ihnen ab?",
"type": "text",
"transcription": null,
"attachments": [],
"sent_at": "2026-10-18T09:41:12.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Schlagwörter des Postfachs
/v1/inbox/tagsread:inboxRecht: Nur InboxliestDie Schlagwörter, die der Tag-Picker im Postfach der App anbietet: die eigenen Schlagwörter des Kontos (älteste zuerst) und, nur bei eingeschaltetem KI-Assistenten, die KI-Kategorien. Diese Werte nimmt PATCH /v1/inbox/conversations/{chat_id} in tags und add_tags an, dazu die an einer Unterhaltung schon gespeicherten. Eigene Schlagwörter legt man in der App im Postfach an (Tag hinzufügen, Neuen Tag erstellen).
Felder der Antwort
valuestringWert für tags, add_tags und remove_tags in PATCH /v1/inbox/conversations/{chat_id}
kindstringcustom = eigenes Schlagwort des Postfachs, ai = KI-Kategorie
customailabelstringAnzeigename in der App
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/tags" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/tags", {
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/inbox/tags",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"value": "Messe",
"kind": "custom",
"label": "Messe"
},
{
"value": "Rückruf",
"kind": "custom",
"label": "Rückruf"
},
{
"value": "interesse",
"kind": "ai",
"label": "Interesse"
},
{
"value": "meeting_request",
"kind": "ai",
"label": "Termin-Wunsch"
}
],
"meta": {
"request_id": "req_7f3a…"
}
}KI-Assistenten des Postfachs
/v1/inbox/assistantsread:inboxRecht: Assistent einrichten und bearbeitenliestDie Assistenten wie auf der Seite Inbox-Assistent einrichten: Angebot, Preisregel, Material, Einwände, Ziel mit Buchungslink, Ton, No-Gos und eigene Hinweise, dazu Antwort-Modus und die LinkedIn-Konten, für die der Assistent antwortet. Damit weiß ein Agent, wie im Namen des Kunden geantwortet werden soll. Standard-Assistent zuerst, dann die weiteren wie in der App, danach die Kampagnen-Ergänzungen. Nur lesend, kostet nichts. Anlegen, ändern und zuweisen geht nur in der App.
So setzt dealsky die Antwort zusammen: Für eine Unterhaltung gilt der Assistent ihres LinkedIn-Kontos (sonst der Standard-Assistent). Läuft der Lead in einer Kampagne mit Ergänzung, gehen deren gefüllte Felder vor; Einwände und eigene Hinweise kommen zu denen des Assistenten dazu, Material ersetzt das des Assistenten nur, wenn die Ergänzung welches hat.
Mit account_id kommt der Assistent, der für dieses Konto antwortet, mit campaign_id die Ergänzung dieser Kampagne; beide zusammen liefern beide Schichten für eine Unterhaltung. Ein Konto oder eine Kampagne außerhalb des eigenen Zugriffs ergibt 404.
Recht wie die Seite: Assistent einrichten und bearbeiten (outreach.inbox.assistant). Inhaber und Admins sehen alle Assistenten; Mitglieder nur die, die für mindestens eines ihrer zugewiesenen LinkedIn-Konten antworten, und nur Kampagnen-Ergänzungen von Kampagnen, die sie sehen (enger als die App, die ihnen alle zeigt). Ist der Assistent für das Konto vom dealsky-Team gesperrt, zeigt die Seite keine Verwaltung und die API nichts.
Query-Parameter
limitintegerab 1bis 100Einträge pro Seite (Standard 25, höchstens 100)
cursorstringmax. 200 ZeichenWert aus meta.next_cursor der vorigen Seite
kindstringNur Assistenten oder nur Kampagnen-Ergänzungen
assistantcampaignaccount_idstring (uuid)Der Assistent, der für dieses LinkedIn-Konto antwortet
campaign_idstring (uuid)Die Ergänzung dieser Kampagne, falls es eine gibt
Felder der Antwort
idstring (uuid)ID des Assistenten oder der Kampagnen-Ergänzung
kindstringassistant: ein Assistent, der für LinkedIn-Konten antwortet. campaign: Ergänzung für Unterhaltungen mit Leads einer Kampagne
assistantcampaignnamestringWie auf der Seite: Standard-Assistent, der eigene Name, bei Kampagnen der Kampagnenname
is_defaultbooleanStandard-Assistent: antwortet für alle Konten ohne eigenen Assistenten
campaignobject, kann null seinNur bei kind campaign
Felder anzeigen
idstring (uuid)ID der Kampagne (GET /v1/campaigns/{id})
namestring, kann null seinName der Kampagne, null wenn sie keinen hat
modestring, kann null seinAntwort-Modus wie auf der Karte: manual (Vorschläge nur auf Klick) oder copilot (bei jeder neuen Antwort bereitet die App automatisch einen Vorschlag vor, 1 Credit je Vorschlag; gesendet wird nur per Klick). Bei Kampagnen-Ergänzungen null, dort gilt der Modus des Assistenten
manualcopilotai_enabledbooleanSchalter KI-Assistent oben auf der Seite, gilt für das ganze Konto und ist bei allen Einträgen gleich. false: kein Assistent arbeitet, keine Einordnung und keine Vorschläge
accountsListe aus objectLinkedIn-Konten, für die dieser Assistent antwortet (nur die, auf die die Person mit dem Key Zugriff hat). Bei Kampagnen-Ergänzungen leer
Felder anzeigen
idstring (uuid)LinkedIn-Konto (GET /v1/linkedin/accounts/{id})
namestring, kann null seinAnzeigename des LinkedIn-Kontos in dealsky
connection_statusstring, kann null seinAuch nicht verbundene Konten stehen hier, wie in der App
connectedpending_verificationbrokendisconnectederrorreconnecting
briefingobjectInhalt des Briefings, wie ihn der Antwort-Agent liest. Felder ohne Eintrag sind null bzw. leer
Felder anzeigen
anredestring, kann null seindu oder sie durchgängig. null: nicht festgelegt, die KI leitet die Ansprache aus dem Gesprächsverlauf ab (die Seite zeigt dann Du)
dusieofferstring, kann null seinAngebot: was angeboten wird und welcher Nutzen
pricingobject, kann null seinUmgang mit Preisfragen. Ein Preis wird nur auf ausdrückliche Nachfrage des Kontakts genannt, nie von sich aus. null: nichts hinterlegt, die KI nennt dann keine Zahl (die Seite zeigt Nur im Gespräch)
Felder anzeigen
modestringrange: grober Rahmen, exact: konkreter Preis, after_call: nur im Gespräch, keine Zahl
rangeexactafter_callvaluestring, kann null seinPreisangabe bei range und exact, bei after_call immer null
notestring, kann null seinZusatz, z. B. einmalige Einrichtung
materialsListe aus objectMaterial, das angeboten werden darf. Leer: kein Material, der Assistent verweist auf Erfahrung statt auf Unterlagen
Felder anzeigen
typestringloom (Video), case_study (Fallstudie oder PDF), testimonial, landingpage, other
loomcase_studytestimoniallandingpageotherlabelstring, kann null seinBezeichnung des Materials, wie auf der Seite eingetragen
urlstring, kann null seinLink, den der Assistent so an Kontakte weitergibt
objectionsListe aus objectHinterlegte Einwände mit Antwort, leer wenn keine hinterlegt sind
Felder anzeigen
objectionstring, kann null seinTypischer Einwand
answerstring, kann null seinGewünschte Antwort darauf
goalobject, kann null seinZiel des Gesprächs. null: keins hinterlegt
Felder anzeigen
typestringmeeting: Termin buchen, send: etwas zuschicken, custom: eigenes Ziel
meetingsendcustombooking_linkstring, kann null seinNur meeting: Kalender-Link, den der Assistent unverändert mitschickt
durationstring, kann null seinNur meeting: Dauer, z. B. 20 Minuten
formatstring, kann null seinNur meeting: telefon, zoom, google_meet, teams, vor_ort oder flexibel
telefonzoomgoogle_meetteamsvor_ortflexibeldescriptionstring, kann null seinBeschreibung des Ziels bzw. was verschickt wird
writing_style_learnedboolean, kann null seinHat der Assistent den Schreibstil aus echten Nachrichten gelernt? Den Stil selbst gibt die API nicht heraus. Bei Kampagnen-Ergänzungen null (der Stil gehört zum Assistenten)
tonestring, kann null seinTon und Persona
no_gosstring, kann null seinWas nie gesagt oder versprochen werden darf
custom_notesstring, kann null seinEigene Hinweise
updated_atstring (date-time), kann null seinLetzte Änderung des Briefings (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/assistants" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/assistants", {
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/inbox/assistants",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": [
{
"id": "6d1f2e3a-4b5c-4d6e-8f70-81a2b3c4d5e6",
"kind": "assistant",
"name": "Standard-Assistent",
"is_default": true,
"campaign": null,
"mode": "copilot",
"ai_enabled": true,
"accounts": [
{
"id": "7b2d9c41-3e5f-4a68-9b1c-2d3e4f5a6b7c",
"name": "Anna Beispiel",
"connection_status": "connected"
}
],
"briefing": {
"anrede": "sie",
"offer": "Wir planen für Steuerkanzleien in Bayern zwei bis vier Erstgespräche pro Woche mit Mandanten aus dem Mittelstand, ohne Kaltakquise am Telefon.",
"pricing": {
"mode": "range",
"value": "mittlerer vierstelliger Betrag pro Monat",
"note": "Einrichtung einmalig"
},
"materials": [
{
"type": "case_study",
"label": "Fallstudie Kanzlei Huber",
"url": "https://www.beispiel-agentur.de/fallstudie-huber"
}
],
"objections": [
{
"objection": "Wir haben gerade keine Zeit für neue Mandate.",
"answer": "Verständlich. Wir starten mit zwei Terminen im Monat und richten uns nach Ihrer Kapazität."
},
{
"objection": "Was kostet das?",
"answer": "Das hängt vom Umfang ab, im Gespräch klären wir das in zehn Minuten."
}
],
"goal": {
"type": "meeting",
"booking_link": "https://calendly.com/anna-beispiel/erstgespraech",
"duration": "20 Minuten",
"format": "google_meet",
"description": "Kurzes Kennenlernen, ob ein Pilot passt."
},
"writing_style_learned": true,
"tone": "Freundlich, sachlich, kurze Sätze, keine Emojis.",
"no_gos": "Keine Garantien für Umsatz oder Mandantenzahl versprechen.",
"custom_notes": "Bei Fragen zu Datenschutz auf den AV-Vertrag verweisen."
},
"updated_at": "2026-10-12T14:05:00.000Z"
},
{
"id": "9e8d7c6b-5a49-4f38-8a27-16f5e4d3c2b1",
"kind": "campaign",
"name": "Messe Steuerberatertag 2026",
"is_default": false,
"campaign": {
"id": "3c2b1a09-8f7e-4d6c-9b5a-493827160f5e",
"name": "Messe Steuerberatertag 2026"
},
"mode": null,
"ai_enabled": true,
"accounts": [],
"briefing": {
"anrede": null,
"offer": "Nachbesprechung vom Steuerberatertag: Messe-Angebot mit 20 Prozent Rabatt im ersten Quartal.",
"pricing": null,
"materials": [],
"objections": [],
"goal": null,
"writing_style_learned": null,
"tone": null,
"no_gos": null,
"custom_notes": "Auf das Gespräch am Stand Bezug nehmen."
},
"updated_at": "2026-10-15T09:30:00.000Z"
}
],
"meta": {
"request_id": "req_7f3a…",
"next_cursor": null,
"has_more": false
}
}Ein KI-Assistent
/v1/inbox/assistants/{id}read:inboxRecht: Assistent einrichten und bearbeitenliestDieselben Angaben wie in der Liste, für einen Assistenten oder eine Kampagnen-Ergänzung. Recht wie die Seite: Assistent einrichten und bearbeiten (outreach.inbox.assistant). Inhaber und Admins sehen alle Assistenten; Mitglieder nur die, die für mindestens eines ihrer zugewiesenen LinkedIn-Konten antworten, und nur Kampagnen-Ergänzungen von Kampagnen, die sie sehen (enger als die App, die ihnen alle zeigt). Ist der Assistent für das Konto vom dealsky-Team gesperrt, zeigt die Seite keine Verwaltung und die API nichts. Eine ID außerhalb davon ergibt 404. Kostet nichts.
Pfad-Parameter
idstring (uuid)PflichtID des Assistenten oder der Kampagnen-Ergänzung
Felder der Antwort
idstring (uuid)ID des Assistenten oder der Kampagnen-Ergänzung
kindstringassistant: ein Assistent, der für LinkedIn-Konten antwortet. campaign: Ergänzung für Unterhaltungen mit Leads einer Kampagne
assistantcampaignnamestringWie auf der Seite: Standard-Assistent, der eigene Name, bei Kampagnen der Kampagnenname
is_defaultbooleanStandard-Assistent: antwortet für alle Konten ohne eigenen Assistenten
campaignobject, kann null seinNur bei kind campaign
Felder anzeigen
idstring (uuid)ID der Kampagne (GET /v1/campaigns/{id})
namestring, kann null seinName der Kampagne, null wenn sie keinen hat
modestring, kann null seinAntwort-Modus wie auf der Karte: manual (Vorschläge nur auf Klick) oder copilot (bei jeder neuen Antwort bereitet die App automatisch einen Vorschlag vor, 1 Credit je Vorschlag; gesendet wird nur per Klick). Bei Kampagnen-Ergänzungen null, dort gilt der Modus des Assistenten
manualcopilotai_enabledbooleanSchalter KI-Assistent oben auf der Seite, gilt für das ganze Konto und ist bei allen Einträgen gleich. false: kein Assistent arbeitet, keine Einordnung und keine Vorschläge
accountsListe aus objectLinkedIn-Konten, für die dieser Assistent antwortet (nur die, auf die die Person mit dem Key Zugriff hat). Bei Kampagnen-Ergänzungen leer
Felder anzeigen
idstring (uuid)LinkedIn-Konto (GET /v1/linkedin/accounts/{id})
namestring, kann null seinAnzeigename des LinkedIn-Kontos in dealsky
connection_statusstring, kann null seinAuch nicht verbundene Konten stehen hier, wie in der App
connectedpending_verificationbrokendisconnectederrorreconnecting
briefingobjectInhalt des Briefings, wie ihn der Antwort-Agent liest. Felder ohne Eintrag sind null bzw. leer
Felder anzeigen
anredestring, kann null seindu oder sie durchgängig. null: nicht festgelegt, die KI leitet die Ansprache aus dem Gesprächsverlauf ab (die Seite zeigt dann Du)
dusieofferstring, kann null seinAngebot: was angeboten wird und welcher Nutzen
pricingobject, kann null seinUmgang mit Preisfragen. Ein Preis wird nur auf ausdrückliche Nachfrage des Kontakts genannt, nie von sich aus. null: nichts hinterlegt, die KI nennt dann keine Zahl (die Seite zeigt Nur im Gespräch)
Felder anzeigen
modestringrange: grober Rahmen, exact: konkreter Preis, after_call: nur im Gespräch, keine Zahl
rangeexactafter_callvaluestring, kann null seinPreisangabe bei range und exact, bei after_call immer null
notestring, kann null seinZusatz, z. B. einmalige Einrichtung
materialsListe aus objectMaterial, das angeboten werden darf. Leer: kein Material, der Assistent verweist auf Erfahrung statt auf Unterlagen
Felder anzeigen
typestringloom (Video), case_study (Fallstudie oder PDF), testimonial, landingpage, other
loomcase_studytestimoniallandingpageotherlabelstring, kann null seinBezeichnung des Materials, wie auf der Seite eingetragen
urlstring, kann null seinLink, den der Assistent so an Kontakte weitergibt
objectionsListe aus objectHinterlegte Einwände mit Antwort, leer wenn keine hinterlegt sind
Felder anzeigen
objectionstring, kann null seinTypischer Einwand
answerstring, kann null seinGewünschte Antwort darauf
goalobject, kann null seinZiel des Gesprächs. null: keins hinterlegt
Felder anzeigen
typestringmeeting: Termin buchen, send: etwas zuschicken, custom: eigenes Ziel
meetingsendcustombooking_linkstring, kann null seinNur meeting: Kalender-Link, den der Assistent unverändert mitschickt
durationstring, kann null seinNur meeting: Dauer, z. B. 20 Minuten
formatstring, kann null seinNur meeting: telefon, zoom, google_meet, teams, vor_ort oder flexibel
telefonzoomgoogle_meetteamsvor_ortflexibeldescriptionstring, kann null seinBeschreibung des Ziels bzw. was verschickt wird
writing_style_learnedboolean, kann null seinHat der Assistent den Schreibstil aus echten Nachrichten gelernt? Den Stil selbst gibt die API nicht heraus. Bei Kampagnen-Ergänzungen null (der Stil gehört zum Assistenten)
tonestring, kann null seinTon und Persona
no_gosstring, kann null seinWas nie gesagt oder versprochen werden darf
custom_notesstring, kann null seinEigene Hinweise
updated_atstring (date-time), kann null seinLetzte Änderung des Briefings (ISO 8601, UTC)
Mögliche Fehler
curl -X GET "https://api.dealsky.io/functions/v1/api/v1/inbox/assistants/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10" \
-H "X-API-Key: $DEALSKY_API_KEY"const res = await fetch("https://api.dealsky.io/functions/v1/api/v1/inbox/assistants/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/inbox/assistants/5b0c1e7a-3f1d-4a52-9c1e-8a7d2b6f4e10",
headers={"X-API-Key": os.environ["DEALSKY_API_KEY"]},
)
print(res.json()){
"ok": true,
"data": {
"id": "6d1f2e3a-4b5c-4d6e-8f70-81a2b3c4d5e6",
"kind": "assistant",
"name": "Standard-Assistent",
"is_default": true,
"campaign": null,
"mode": "copilot",
"ai_enabled": true,
"accounts": [
{
"id": "7b2d9c41-3e5f-4a68-9b1c-2d3e4f5a6b7c",
"name": "Anna Beispiel",
"connection_status": "connected"
}
],
"briefing": {
"anrede": "sie",
"offer": "Wir planen für Steuerkanzleien in Bayern zwei bis vier Erstgespräche pro Woche mit Mandanten aus dem Mittelstand, ohne Kaltakquise am Telefon.",
"pricing": {
"mode": "range",
"value": "mittlerer vierstelliger Betrag pro Monat",
"note": "Einrichtung einmalig"
},
"materials": [
{
"type": "case_study",
"label": "Fallstudie Kanzlei Huber",
"url": "https://www.beispiel-agentur.de/fallstudie-huber"
}
],
"objections": [
{
"objection": "Wir haben gerade keine Zeit für neue Mandate.",
"answer": "Verständlich. Wir starten mit zwei Terminen im Monat und richten uns nach Ihrer Kapazität."
},
{
"objection": "Was kostet das?",
"answer": "Das hängt vom Umfang ab, im Gespräch klären wir das in zehn Minuten."
}
],
"goal": {
"type": "meeting",
"booking_link": "https://calendly.com/anna-beispiel/erstgespraech",
"duration": "20 Minuten",
"format": "google_meet",
"description": "Kurzes Kennenlernen, ob ein Pilot passt."
},
"writing_style_learned": true,
"tone": "Freundlich, sachlich, kurze Sätze, keine Emojis.",
"no_gos": "Keine Garantien für Umsatz oder Mandantenzahl versprechen.",
"custom_notes": "Bei Fragen zu Datenschutz auf den AV-Vertrag verweisen."
},
"updated_at": "2026-10-12T14:05:00.000Z"
},
"meta": {
"request_id": "req_7f3a…"
}
}