dealsky.ioDocs
Zur App
API-Referenz

Postfach

LinkedIn-Unterhaltungen lesen und pflegen

#

Unterhaltungen im Postfach

GET/v1/inbox/conversations
Scope read:inboxRecht: Nur Inboxliest

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

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

  • account_idstring (uuid)

    Nur Unterhaltungen dieses LinkedIn-Kontos

  • triagestring

    Nur Unterhaltungen mit diesem Status

    needs_reply waiting snoozed done
  • lead_idstring (uuid)

    Nur Unterhaltungen mit diesem Lead

  • qstringmax. 200 Zeichen

    Suche im Namen bei LinkedIn und in der letzten Nachricht, ohne Groß/Klein

  • orderstring

    newest (Standard) oder oldest, nach der letzten Nachricht

    newest oldest
Felder der Antwort
  • idstring (uuid)

    ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}

  • accountobject

    Eigenes LinkedIn-Konto der Unterhaltung

    Felder anzeigen
    • idstring (uuid)

      LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})

    • namestring, kann null sein

      Anzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist

  • counterpartobject

    Gesprächspartner auf LinkedIn

    Felder anzeigen
    • namestring, kann null sein

      Name bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)

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

      LinkedIn-Profil des Gegenübers, falls LinkedIn es liefert

    • lead_idstring (uuid), kann null sein

      Verknüpfter Lead, falls vorhanden

  • last_messageobject, kann null sein

    Letzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist

    Felder anzeigen
    • atstring (date-time), kann null sein

      Zeitpunkt der letzten Nachricht (ISO 8601, UTC)

    • directionstring, kann null sein

      inbound = vom Kontakt, outbound = von Ihnen

      inbound outbound
    • previewstring, kann null sein

      Vorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...

  • unread_countinteger

    Ungelesene eingehende Nachrichten (0 = gelesen)

  • triagestring

    needs_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.

    needs_reply waiting snoozed done
  • followup_scheduled_atstring (date-time), kann null sein

    Nächstes geplantes Follow-up, falls eines läuft

  • stateobject, kann null sein

    Von Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde

    Felder anzeigen
    • statusstring, kann null sein

      Manuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)

      done snoozed open
    • snooze_untilstring (date-time), kann null sein

      Bei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)

    • handled_atstring (date-time), kann null sein

      Zeitpunkt der letzten manuellen Änderung

    • tagsListe aus string

      Schlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)

    • sentimentstring, kann null sein

      Von Hand gesetzte Stimmung

      positiv neutral negativ
  • classificationobject, kann null sein

    KI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.

    Felder anzeigen
    • categorystring, kann null sein

      KI-Antwortkategorie, z. B. interesse, question, objection, not_interested

    • subcategorystring, kann null sein

      Feinere KI-Kategorie, null wenn keine vergeben ist

    • sentimentstring, kann null sein

      Stimmung laut KI

      positiv neutral negativ
    • stagestring, kann null sein

      Gesprächsphase laut KI

    • confidencenumber, kann null sein

      Sicherheit der KI zwischen 0 und 1

    • reasoningstring, kann null sein

      Begründung der KI für die Einordnung, Freitext auf Deutsch

    • classified_atstring (date-time), kann null sein

      Zeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)

  • created_atstring (date-time), kann null sein

    Zeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)

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/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())
Antwort 200
{
  "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

GET/v1/inbox/conversations/{chat_id}
Scope read:inboxRecht: Nur Inboxliest

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

    ID der Unterhaltung

Felder der Antwort
  • idstring (uuid)

    ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}

  • accountobject

    Eigenes LinkedIn-Konto der Unterhaltung

    Felder anzeigen
    • idstring (uuid)

      LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})

    • namestring, kann null sein

      Anzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist

  • counterpartobject

    Gesprächspartner auf LinkedIn

    Felder anzeigen
    • namestring, kann null sein

      Name bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)

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

      LinkedIn-Profil des Gegenübers, falls LinkedIn es liefert

    • lead_idstring (uuid), kann null sein

      Verknüpfter Lead, falls vorhanden

  • last_messageobject, kann null sein

    Letzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist

    Felder anzeigen
    • atstring (date-time), kann null sein

      Zeitpunkt der letzten Nachricht (ISO 8601, UTC)

    • directionstring, kann null sein

      inbound = vom Kontakt, outbound = von Ihnen

      inbound outbound
    • previewstring, kann null sein

      Vorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...

  • unread_countinteger

    Ungelesene eingehende Nachrichten (0 = gelesen)

  • triagestring

    needs_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.

    needs_reply waiting snoozed done
  • followup_scheduled_atstring (date-time), kann null sein

    Nächstes geplantes Follow-up, falls eines läuft

  • stateobject, kann null sein

    Von Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde

    Felder anzeigen
    • statusstring, kann null sein

      Manuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)

      done snoozed open
    • snooze_untilstring (date-time), kann null sein

      Bei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)

    • handled_atstring (date-time), kann null sein

      Zeitpunkt der letzten manuellen Änderung

    • tagsListe aus string

      Schlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)

    • sentimentstring, kann null sein

      Von Hand gesetzte Stimmung

      positiv neutral negativ
  • classificationobject, kann null sein

    KI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.

    Felder anzeigen
    • categorystring, kann null sein

      KI-Antwortkategorie, z. B. interesse, question, objection, not_interested

    • subcategorystring, kann null sein

      Feinere KI-Kategorie, null wenn keine vergeben ist

    • sentimentstring, kann null sein

      Stimmung laut KI

      positiv neutral negativ
    • stagestring, kann null sein

      Gesprächsphase laut KI

    • confidencenumber, kann null sein

      Sicherheit der KI zwischen 0 und 1

    • reasoningstring, kann null sein

      Begründung der KI für die Einordnung, Freitext auf Deutsch

    • classified_atstring (date-time), kann null sein

      Zeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)

  • created_atstring (date-time), kann null sein

    Zeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)

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/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())
Antwort 200
{
  "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

PATCH/v1/inbox/conversations/{chat_id}
Scope write:inboxRecht: Nur Inboxschreibt

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

    ID der Unterhaltung

Body

  • statusstring

    done = Schließen, snoozed = Wiedervorlage bis snooze_until, open = Wieder öffnen

    open snoozed done
  • snooze_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äge

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

    Fü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äge

    Entfernt Schlagwörter, die übrigen bleiben (nicht zusammen mit tags). Ein nicht vorhandenes ändert nichts

  • sentimentstring, kann null sein

    Stimmung von Hand, null = wieder automatisch (nur mit KI-Assistent)

    positiv neutral negativ
Felder der Antwort
  • idstring (uuid)

    ID der Unterhaltung, für /v1/inbox/conversations/{chat_id}

  • accountobject

    Eigenes LinkedIn-Konto der Unterhaltung

    Felder anzeigen
    • idstring (uuid)

      LinkedIn-Konto, über das die Unterhaltung läuft (GET /v1/linkedin/accounts/{id})

    • namestring, kann null sein

      Anzeigename des LinkedIn-Kontos in dealsky, null wenn das Konto nicht mehr verbunden ist

  • counterpartobject

    Gesprächspartner auf LinkedIn

    Felder anzeigen
    • namestring, kann null sein

      Name bei LinkedIn, sonst der Name des verknüpften Leads (wie in der App)

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

      LinkedIn-Profil des Gegenübers, falls LinkedIn es liefert

    • lead_idstring (uuid), kann null sein

      Verknüpfter Lead, falls vorhanden

  • last_messageobject, kann null sein

    Letzte Nachricht der Unterhaltung, null wenn noch keine bekannt ist

    Felder anzeigen
    • atstring (date-time), kann null sein

      Zeitpunkt der letzten Nachricht (ISO 8601, UTC)

    • directionstring, kann null sein

      inbound = vom Kontakt, outbound = von Ihnen

      inbound outbound
    • previewstring, kann null sein

      Vorschau wie in der Chat-Liste der App: höchstens 35 Zeichen, sonst gekürzt mit ...

  • unread_countinteger

    Ungelesene eingehende Nachrichten (0 = gelesen)

  • triagestring

    needs_reply (Zu beantworten), waiting (Wartet), snoozed (Geplant), done (Geschlossen). Regel wie im Postfach der App.

    needs_reply waiting snoozed done
  • followup_scheduled_atstring (date-time), kann null sein

    Nächstes geplantes Follow-up, falls eines läuft

  • stateobject, kann null sein

    Von Hand gepflegte Angaben, null wenn nie etwas gesetzt wurde

    Felder anzeigen
    • statusstring, kann null sein

      Manuell gesetzter Status in der App (Geschlossen, Später, Wieder geöffnet)

      done snoozed open
    • snooze_untilstring (date-time), kann null sein

      Bei status snoozed: bis wann die Unterhaltung zurückgestellt ist (ISO 8601, UTC)

    • handled_atstring (date-time), kann null sein

      Zeitpunkt der letzten manuellen Änderung

    • tagsListe aus string

      Schlagwörter der Unterhaltung (eigene und übernommene KI-Kategorien)

    • sentimentstring, kann null sein

      Von Hand gesetzte Stimmung

      positiv neutral negativ
  • classificationobject, kann null sein

    KI-Einordnung des Gesprächs. null, wenn der KI-Assistent des Postfachs ausgeschaltet ist oder noch nichts eingeordnet wurde.

    Felder anzeigen
    • categorystring, kann null sein

      KI-Antwortkategorie, z. B. interesse, question, objection, not_interested

    • subcategorystring, kann null sein

      Feinere KI-Kategorie, null wenn keine vergeben ist

    • sentimentstring, kann null sein

      Stimmung laut KI

      positiv neutral negativ
    • stagestring, kann null sein

      Gesprächsphase laut KI

    • confidencenumber, kann null sein

      Sicherheit der KI zwischen 0 und 1

    • reasoningstring, kann null sein

      Begründung der KI für die Einordnung, Freitext auf Deutsch

    • classified_atstring (date-time), kann null sein

      Zeitpunkt der letzten KI-Einordnung (ISO 8601, UTC)

  • created_atstring (date-time), kann null sein

    Zeitpunkt, zu dem dealsky die Unterhaltung erstmals gespeichert hat (ISO 8601, UTC)

Mögliche Fehler

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

GET/v1/inbox/conversations/{chat_id}/messages
Scope read:inboxRecht: Nur Inboxliest

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

    ID der Unterhaltung

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

  • orderstring

    oldest (Standard, wie in der App) oder newest

    oldest newest
Felder der Antwort
  • idstring (uuid)

    ID der Nachricht

  • conversation_idstring (uuid)

    ID der Unterhaltung (chat_id)

  • directionstring

    inbound = vom Kontakt, outbound = von Ihnen

    inbound outbound
  • textstring, kann null sein

    Nachrichtentext, null bei reinen Anhängen

  • typestring, kann null sein

    Art laut LinkedIn, z. B. text oder voice_note

  • transcriptionstring, kann null sein

    Abschrift einer Sprachnachricht, sobald vorhanden

  • attachmentsListe aus object

    Anhänge der Nachricht als Beschreibung ohne Download-Adresse, leer ohne Anhang

    Felder anzeigen
    • indexinteger

      Position des Anhangs in der Nachricht (0 = erster)

    • kindstring

      audio (auch Sprachnachricht), image, video, shared_post (geteilter LinkedIn-Beitrag) oder file

      audio image video shared_post file
    • mime_typestring, kann null sein

      Dateityp (MIME), z. B. image/jpeg, falls LinkedIn einen liefert

    • namestring, kann null sein

      Dateiname, falls LinkedIn einen liefert

    • size_bytesinteger, kann null sein

      Dateigröße in Bytes, falls bekannt

    • widthinteger, kann null sein

      Nur Bilder: Breite in Pixeln, falls bekannt

    • heightinteger, kann null sein

      Nur Bilder: Höhe in Pixeln, falls bekannt

    • duration_secondsnumber, kann null sein

      Nur Audio und Video, falls bekannt

    • unavailableboolean

      true, wenn LinkedIn den Inhalt nicht mehr liefert (z. B. gelöschter Beitrag)

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

      Nur shared_post: öffentlicher Link auf den Beitrag bei LinkedIn

  • sent_atstring (date-time)

    Sendezeitpunkt (ISO 8601, UTC)

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/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())
Antwort 200
{
  "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

GET/v1/inbox/tags
Scope read:inboxRecht: Nur Inboxliest

Die 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
  • valuestring

    Wert für tags, add_tags und remove_tags in PATCH /v1/inbox/conversations/{chat_id}

  • kindstring

    custom = eigenes Schlagwort des Postfachs, ai = KI-Kategorie

    custom ai
  • labelstring

    Anzeigename in der App

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/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())
Antwort 200
{
  "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

GET/v1/inbox/assistants
Scope read:inboxRecht: Assistent einrichten und bearbeitenliest

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

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

  • cursorstringmax. 200 Zeichen

    Wert aus meta.next_cursor der vorigen Seite

  • kindstring

    Nur Assistenten oder nur Kampagnen-Ergänzungen

    assistant campaign
  • account_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

  • kindstring

    assistant: ein Assistent, der für LinkedIn-Konten antwortet. campaign: Ergänzung für Unterhaltungen mit Leads einer Kampagne

    assistant campaign
  • namestring

    Wie auf der Seite: Standard-Assistent, der eigene Name, bei Kampagnen der Kampagnenname

  • is_defaultboolean

    Standard-Assistent: antwortet für alle Konten ohne eigenen Assistenten

  • campaignobject, kann null sein

    Nur bei kind campaign

    Felder anzeigen
    • idstring (uuid)

      ID der Kampagne (GET /v1/campaigns/{id})

    • namestring, kann null sein

      Name der Kampagne, null wenn sie keinen hat

  • modestring, kann null sein

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

    manual copilot
  • ai_enabledboolean

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

    LinkedIn-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 sein

      Anzeigename des LinkedIn-Kontos in dealsky

    • connection_statusstring, kann null sein

      Auch nicht verbundene Konten stehen hier, wie in der App

      connected pending_verification broken disconnected error reconnecting
  • briefingobject

    Inhalt des Briefings, wie ihn der Antwort-Agent liest. Felder ohne Eintrag sind null bzw. leer

    Felder anzeigen
    • anredestring, kann null sein

      du oder sie durchgängig. null: nicht festgelegt, die KI leitet die Ansprache aus dem Gesprächsverlauf ab (die Seite zeigt dann Du)

      du sie
    • offerstring, kann null sein

      Angebot: was angeboten wird und welcher Nutzen

    • pricingobject, kann null sein

      Umgang 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
      • modestring

        range: grober Rahmen, exact: konkreter Preis, after_call: nur im Gespräch, keine Zahl

        range exact after_call
      • valuestring, kann null sein

        Preisangabe bei range und exact, bei after_call immer null

      • notestring, kann null sein

        Zusatz, z. B. einmalige Einrichtung

    • materialsListe aus object

      Material, das angeboten werden darf. Leer: kein Material, der Assistent verweist auf Erfahrung statt auf Unterlagen

      Felder anzeigen
      • typestring

        loom (Video), case_study (Fallstudie oder PDF), testimonial, landingpage, other

        loom case_study testimonial landingpage other
      • labelstring, kann null sein

        Bezeichnung des Materials, wie auf der Seite eingetragen

      • urlstring, kann null sein

        Link, den der Assistent so an Kontakte weitergibt

    • objectionsListe aus object

      Hinterlegte Einwände mit Antwort, leer wenn keine hinterlegt sind

      Felder anzeigen
      • objectionstring, kann null sein

        Typischer Einwand

      • answerstring, kann null sein

        Gewünschte Antwort darauf

    • goalobject, kann null sein

      Ziel des Gesprächs. null: keins hinterlegt

      Felder anzeigen
      • typestring

        meeting: Termin buchen, send: etwas zuschicken, custom: eigenes Ziel

        meeting send custom
      • booking_linkstring, kann null sein

        Nur meeting: Kalender-Link, den der Assistent unverändert mitschickt

      • durationstring, kann null sein

        Nur meeting: Dauer, z. B. 20 Minuten

      • formatstring, kann null sein

        Nur meeting: telefon, zoom, google_meet, teams, vor_ort oder flexibel

        telefon zoom google_meet teams vor_ort flexibel
      • descriptionstring, kann null sein

        Beschreibung des Ziels bzw. was verschickt wird

    • writing_style_learnedboolean, kann null sein

      Hat 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 sein

      Ton und Persona

    • no_gosstring, kann null sein

      Was nie gesagt oder versprochen werden darf

    • custom_notesstring, kann null sein

      Eigene Hinweise

  • updated_atstring (date-time), kann null sein

    Letzte Änderung des Briefings (ISO 8601, UTC)

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/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())
Antwort 200
{
  "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

GET/v1/inbox/assistants/{id}
Scope read:inboxRecht: Assistent einrichten und bearbeitenliest

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

    ID des Assistenten oder der Kampagnen-Ergänzung

Felder der Antwort
  • idstring (uuid)

    ID des Assistenten oder der Kampagnen-Ergänzung

  • kindstring

    assistant: ein Assistent, der für LinkedIn-Konten antwortet. campaign: Ergänzung für Unterhaltungen mit Leads einer Kampagne

    assistant campaign
  • namestring

    Wie auf der Seite: Standard-Assistent, der eigene Name, bei Kampagnen der Kampagnenname

  • is_defaultboolean

    Standard-Assistent: antwortet für alle Konten ohne eigenen Assistenten

  • campaignobject, kann null sein

    Nur bei kind campaign

    Felder anzeigen
    • idstring (uuid)

      ID der Kampagne (GET /v1/campaigns/{id})

    • namestring, kann null sein

      Name der Kampagne, null wenn sie keinen hat

  • modestring, kann null sein

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

    manual copilot
  • ai_enabledboolean

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

    LinkedIn-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 sein

      Anzeigename des LinkedIn-Kontos in dealsky

    • connection_statusstring, kann null sein

      Auch nicht verbundene Konten stehen hier, wie in der App

      connected pending_verification broken disconnected error reconnecting
  • briefingobject

    Inhalt des Briefings, wie ihn der Antwort-Agent liest. Felder ohne Eintrag sind null bzw. leer

    Felder anzeigen
    • anredestring, kann null sein

      du oder sie durchgängig. null: nicht festgelegt, die KI leitet die Ansprache aus dem Gesprächsverlauf ab (die Seite zeigt dann Du)

      du sie
    • offerstring, kann null sein

      Angebot: was angeboten wird und welcher Nutzen

    • pricingobject, kann null sein

      Umgang 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
      • modestring

        range: grober Rahmen, exact: konkreter Preis, after_call: nur im Gespräch, keine Zahl

        range exact after_call
      • valuestring, kann null sein

        Preisangabe bei range und exact, bei after_call immer null

      • notestring, kann null sein

        Zusatz, z. B. einmalige Einrichtung

    • materialsListe aus object

      Material, das angeboten werden darf. Leer: kein Material, der Assistent verweist auf Erfahrung statt auf Unterlagen

      Felder anzeigen
      • typestring

        loom (Video), case_study (Fallstudie oder PDF), testimonial, landingpage, other

        loom case_study testimonial landingpage other
      • labelstring, kann null sein

        Bezeichnung des Materials, wie auf der Seite eingetragen

      • urlstring, kann null sein

        Link, den der Assistent so an Kontakte weitergibt

    • objectionsListe aus object

      Hinterlegte Einwände mit Antwort, leer wenn keine hinterlegt sind

      Felder anzeigen
      • objectionstring, kann null sein

        Typischer Einwand

      • answerstring, kann null sein

        Gewünschte Antwort darauf

    • goalobject, kann null sein

      Ziel des Gesprächs. null: keins hinterlegt

      Felder anzeigen
      • typestring

        meeting: Termin buchen, send: etwas zuschicken, custom: eigenes Ziel

        meeting send custom
      • booking_linkstring, kann null sein

        Nur meeting: Kalender-Link, den der Assistent unverändert mitschickt

      • durationstring, kann null sein

        Nur meeting: Dauer, z. B. 20 Minuten

      • formatstring, kann null sein

        Nur meeting: telefon, zoom, google_meet, teams, vor_ort oder flexibel

        telefon zoom google_meet teams vor_ort flexibel
      • descriptionstring, kann null sein

        Beschreibung des Ziels bzw. was verschickt wird

    • writing_style_learnedboolean, kann null sein

      Hat 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 sein

      Ton und Persona

    • no_gosstring, kann null sein

      Was nie gesagt oder versprochen werden darf

    • custom_notesstring, kann null sein

      Eigene Hinweise

  • updated_atstring (date-time), kann null sein

    Letzte Änderung des Briefings (ISO 8601, UTC)

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/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())
Antwort 200
{
  "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…"
  }
}