Aktivitäten

Aktivitäten an Customer, Produktpartner oder Benutzer — Termine, Aufgaben, ToDos, Anrufe und Notizen. Full-CRUD top-level über `/v3/activities/{id}` plus parent-scoped Listing/Create unter `/v3/customers/{kid}/activities`, `/v3/products/{kid}/activities` und `/v3/users/{kid}/activities`.

Zuletzt geprüft: 14. Mai 2026

Übersicht

Eine Aktivität ist ein zeitbezogener Eintrag an einem CRM-Objekt — Termin, Aufgabe, Anruf, Notiz, ToDo. Aktivitäten haben einen Typ (art), einen Status (offen/erledigt), einen Owner-User, ein Datum und einen Bezug zum Parent (kid — Customer, Produktpartner oder Benutzer).

Die Aktivität hat eine global eindeutige id — alle CRUD-Operationen laufen daher top-level über /v3/activities/{id}, ohne Detour über den Parent:

  1. Top-Level Full-CRUD — /v3/activities (List, Create) und /v3/activities/{id} (Read, Update, Delete). Für Cross-Customer-Reports, Kalender-Sync, Workflow-Engines. kid steht optional im Body beim Top-Level-POST bzw. als Filter-Query (?kid=…) beim GET-List.
  2. Parent-scoped Listing + Create — GET/POST /v3/customers/{kid}/activities, GET/POST /v3/products/{kid}/activities und GET/POST /v3/users/{kid}/activities. Path-kid ist Source-of-Truth; Body darf kein kid-Feld tragen (sonst 400 body_kid_forbidden). Update und Delete laufen ausschließlich über die Top-Level-Route mit der Activity-id.

Alle Varianten nutzen denselben Scope v3:activities:* und dasselbe Datenmodell — die parent-scoped Routen unter /v3/products/{kid} und /v3/users/{kid} brauchen also v3:activities:*, nicht v3:products:*/v3:users:*.

Scopes

EndpointScope
GET /v3/activities / GET /v3/activities/<id>v3:activities:read
POST /v3/activitiesv3:activities:write
PATCH /v3/activities/<id>v3:activities:write
DELETE /v3/activities/<id>v3:activities:write
GET /v3/customers/<kid>/activitiesv3:activities:read
POST /v3/customers/<kid>/activitiesv3:activities:write
GET /v3/products/<kid>/activitiesv3:activities:read
POST /v3/products/<kid>/activitiesv3:activities:write
GET /v3/users/<kid>/activitiesv3:activities:read
POST /v3/users/<kid>/activitiesv3:activities:write
GET/POST /v3/activities/<id>/{comments|followers|tags}v3:activities:read / :write
DELETE /v3/activities/<id>/{comments|followers|tags}/<annotationId>v3:activities:write

Auth-Mechanik siehe Authentifizierung. Vollständige Scope-Referenz: Scopes.

Pagination & Limits

Identisch zu Customers > Pagination & Limits. Aktivitäten-Listen können in größeren Orgs sehr groß werden — mit ?limit=5000 arbeiten und im Idealfall mit Datum-Filtern eingrenzen.

Schema

DB-Tabelle: crm_aufgaben. Body-Felder werden columnMap-gefiltert; unbekannte Spalten werden still verworfen.

json
{
  "id": 9395,
  "kid": 12345,                       // Customer-ID (optional)
  "kategorie": 15,                    // numerische Aktivitäts-Kategorie (siehe `aktKategorie` select)
                                      // POST/PATCH: STRING ('aufgabe', 'termin', 'email', 'telefon', 'notiz')
                                      // — der Handler nutzt sie als Lookup-Key für erlaubte Felder
  "titel": "Beratungstermin Vorsorge",
  "beschreibung": "Wunsch: BU-Versicherung prüfen, Riester-Rente checken.",
  "start": "2024-06-20 10:00:00",     // timestamp (DB: `start`)
  "ende":  "2024-06-20 11:30:00",     // timestamp (DB: `ende`)
  "status": 0,                        // numeric (siehe `aktStatus` select)
  "verantwortlich": 4001,             // kid des zugewiesenen Benutzers (DB: `verantwortlich`)
  "ersteller": 1485503904,            // kid des Erstellers (auto, aus Auth)
  "erledigt_am": null,
  "erledigt_kid": 0,
  "ind_10000012": "Custom-Wert",      // 0-N benutzerdefinierte Felder
  "insert_datum": "2024-06-12 08:42:00",
  "edit_datum":   "2024-06-15 14:20:00"
}

Endpoints

Aktivitäten abfragen

Liefert paginierte Liste. Query-Parameter: page, limit, kid (Customer-Filter), kategorie (Integer aus aktKategorie), status (Integer aus aktStatus, einschließlich 0), verantwortlich (User-kid), with_comments, with_documents, with_contracts, with_damages, with_schema und flat. Kategorie und Status filtern die Liste in der Datenbank; bei gleichzeitiger Angabe gelten beide Filter.

bash
# Offene Aufgaben für einen User (Aufgabe = kategorie 15, Status offen = 0)
curl "https://www.api.i-planner.app/v3/activities?kategorie=15&status=0&verantwortlich=4001" \
  -H "Authorization: Bearer $IPLANNER_API_TOKEN"

Einzelne Aktivität abrufen

GET/v3/activities/<id> Im Playground testen ↗

404 not_found falls nicht existent oder soft-deleted.

Aktivität anlegen

POST/v3/activities Im Playground testen ↗

Body folgt dem Customer-POST-Pattern (Single, nicht Batch). Pflicht-Feld: kategorie (string, siehe Warning oben). Optional: kid (Customer-Verknüpfung), titel, start, ende, status, verantwortlich, beschreibung, ind_* Custom-Felder.

bash
curl -X POST https://www.api.i-planner.app/v3/activities \
  -H "Authorization: Bearer $IPLANNER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "kid": 12345,
    "kategorie": "termin",
    "titel": "Jahresgespräch",
    "start": "2024-07-15 09:00:00",
    "ende":  "2024-07-15 10:00:00",
    "verantwortlich": 4001,
    "status": 0
  }'

Response: 201 mit { success, id }.

Aktivität aktualisieren

PATCH/v3/activities/<id> Im Playground testen ↗

Verhalten wie Customer-PATCH. Response: { success, updated }.

bash
curl -X PATCH https://www.api.i-planner.app/v3/activities/71001 \
  -H "Authorization: Bearer $IPLANNER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "status": "erledigt" }'

Aktivität löschen

DELETE/v3/activities/<id> Im Playground testen ↗

Soft-Delete. Response: { success, soft_deleted, id }. Wiederholte DELETE-Aufrufe geben 404 not_found — idempotent. Volle Error-Tabelle in Fehler.

Parent-scoped Listing & Create

Aktivitäten lassen sich unter drei Parents listen und anlegen — Customer, Produktpartner und Benutzer. Praktisch für Detail-UIs, Workflow-Knoten mit kid aus dem Trigger-Kontext und Integrations-Pipelines, die zu einem konkreten Parent schreiben.

Update und Delete dagegen laufen ausschließlich über die Top-Level-Routen (PATCH /v3/activities/<id>, DELETE /v3/activities/<id>) — die Activity-id ist global eindeutig.

Path-Parameter: <kid> (Customer-, Product- oder User-ID, persistente Geschäfts-ID).

GET/v3/customers/<kid>/activities Im Playground testen ↗
POST/v3/customers/<kid>/activities Im Playground testen ↗
GET/v3/products/<kid>/activities Im Playground testen ↗
POST/v3/products/<kid>/activities Im Playground testen ↗
GET/v3/users/<kid>/activities Im Playground testen ↗
POST/v3/users/<kid>/activities Im Playground testen ↗

Body-Regel: POST-Bodies dürfen kid nicht tragen — Path-kid ist Source-of-Truth. Body-kid führt zu 400 body_kid_forbidden.

Listing-Filter: Zusätzlich zu page/limit unterstützen die parent-scoped GET-Listen den Query-Parameter ?verantwortlich=<userId> — filtert auf den Owner-User der Aktivität. Praktisch für „meine offenen Aufgaben am Customer X"-Workflows.

bash
curl -X POST 'https://www.api.i-planner.app/v3/customers/12345/activities' \
  -H "Authorization: Bearer $IPLANNER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "kategorie": "termin",
    "titel": "Jahresgespräch",
    "start": "2024-07-15 09:00:00",
    "ende":  "2024-07-15 10:00:00",
    "verantwortlich": 4001
  }'

Response-Shapes sind identisch zur top-level Variante. Volle Error-Tabelle in Fehler.

Annotationen

Aktivitäten haben eigene Annotationen — Comments, Followers und Tags. Verhalten, Felder und Response-Bodies sind identisch zu den Customer-Annotation-Pendants (siehe Customers > Comments / Followers / Tags). Beim Kommentar-POST ist autor_kid optional: mit einer aktiven Berater-KID wird dieser Berater als Autor angezeigt, ohne sie der Organisationstoken. Der Token bleibt in beiden Fällen im Änderungsprotokoll als ausführender Zugang erkennbar. Pfad-Pattern:

/v3/activities/<id>/{comments|followers|tags}[/<annotationId>]
  • <id> — Activity-Row-ID (global eindeutig)
  • <annotationId> — <commentId> / <followerId> / <tagId> je nach Annotation-Typ
GET/v3/activities/<id>/comments Im Playground testen ↗
POST/v3/activities/<id>/comments Im Playground testen ↗
GET/v3/activities/<id>/comments/<commentId> Im Playground testen ↗
PATCH/v3/activities/<id>/comments/<commentId> Im Playground testen ↗
DELETE/v3/activities/<id>/comments/<commentId> Im Playground testen ↗
GET/v3/activities/<id>/followers Im Playground testen ↗
POST/v3/activities/<id>/followers Im Playground testen ↗
DELETE/v3/activities/<id>/followers/<followerId> Im Playground testen ↗
GET/v3/activities/<id>/tags Im Playground testen ↗
POST/v3/activities/<id>/tags Im Playground testen ↗
DELETE/v3/activities/<id>/tags/<tagId> Im Playground testen ↗

Scope: v3:activities:* — die Berechtigung hängt an den Annotation-Daten, nicht am Parent. POST/PATCH-Bodies dürfen kein kid-Feld tragen (400 body_kid_forbidden).

bash
curl -X POST 'https://www.api.i-planner.app/v3/activities/71001/comments' \
  -H "Authorization: Bearer $IPLANNER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "text": "Termin verlegt auf nächsten Montag.", "autor_kid": 7 }'