API-Referenz
Events
Alles, was sich in den letzten 30 Tagen geändert hat, als Liste. Um verpasste Webhooks nachzuholen oder um abzufragen, statt Webhooks zu verwenden.
Endpunkte
Events auflisten
GET
/api/v1/events
Die Events der letzten 30 Tage, neueste zuerst. Sie sehen nur Events zu Daten, auf die Ihr Schlüssel Leserechte hat. Mit sort=created_at und filter[created_since] holen Sie verpasste Events der Reihe nach nach.
- Scope
-
events.read— Events abrufen
Query-Parameter
| Name | Typ | Beschreibung |
|---|---|---|
limit
|
integer | Anzahl der Ergebnisse pro Seite. von 1 bis 100 · Standard: 50 |
cursor
|
string | Der next_cursor oder prev_cursor aus meta der vorherigen Antwort. |
sort
|
string | created_at hält die Reihenfolge ein, in der alles geschah, -created_at (Standard) zeigt das Neueste zuerst. einer von: -created_at, created_at · Standard: -created_at |
filter[type]
|
string | Nur diese Event-Typen, durch Kommas getrennt, zum Beispiel customer.created,deal.won. höchstens 500 Zeichen |
filter[created_since]
|
string (date-time) | Nur Events ab diesem Zeitpunkt: ISO 8601 mit Zeitzone, zum Beispiel 2026-09-14T10:15:00Z. |
Beispielanfrage
curl "https://app.klantly.com/api/v1/events?filter[type]=customer.created%2Cdeal.won&sort=created_at" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'events', [
'query' => [
'filter[type]' => 'customer.created,deal.won',
'sort' => 'created_at',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/events?filter[type]=customer.created%2Cdeal.won&sort=created_at', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/events",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
params={
"filter[type]": "customer.created,deal.won",
"sort": "created_at"
},
)
data = response.json()["data"]Antwort 200
Die Antwort ist eine Liste mit Cursor-Paginierung: data enthält die Objekte, meta die Paginierung.
{
"data": [
{
"object": "event",
"id": "evt_01j7zs1a2b3c4d5e6f7g8h9j0k",
"type": "customer.created",
"created_at": "2026-09-14T10:15:00Z",
"data": {
"object": {
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"type": "business",
"status": "lead",
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": "De Vries Bouw",
"vat_number": "NL123456789B01",
"coc_number": "12345678",
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL",
"email_unsubscribed": false,
"converted_at": null,
"last_activity_at": "2026-09-14T10:15:00Z",
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}
}
],
"meta": {
"limit": 50,
"next_cursor": "eyJpZCI6IjlkM2Y2YzFlIn0",
"prev_cursor": null
}
}Mögliche Fehler
-
403
insufficient_scope— Dieser API-Schlüssel hat keinen Zugriff auf diese Aktion. -
422
validation_failed— Die Eingabe ist ungültig.
Event abrufen
GET
/api/v1/events/{event}
Ein Event nach ID, zum Beispiel die webhook-id einer empfangenen Nachricht.
- Scope
-
events.read— Events abrufen
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
event erforderlich |
string | Die ID des Events (evt_…). |
Beispielanfrage
curl "https://app.klantly.com/api/v1/events/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'events/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/events/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/events/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
)
data = response.json()["data"]Antwort 200
{
"data": {
"object": "event",
"id": "evt_01j7zs1a2b3c4d5e6f7g8h9j0k",
"type": "customer.created",
"created_at": "2026-09-14T10:15:00Z",
"data": {
"object": {
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"type": "business",
"status": "lead",
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": "De Vries Bouw",
"vat_number": "NL123456789B01",
"coc_number": "12345678",
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL",
"email_unsubscribed": false,
"converted_at": null,
"last_activity_at": "2026-09-14T10:15:00Z",
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}
}
}Mögliche Fehler
-
403
insufficient_scope— Dieser API-Schlüssel hat keinen Zugriff auf diese Aktion. -
404
not_found— Nicht gefunden.
Das Objekt
Alle Felder sind immer vorhanden; ein Feld ohne Wert ist null.
| Feld | Typ | Beschreibung |
|---|---|---|
object |
string | Immer „event“. |
id |
string | Eindeutige ID (evt_…). Gleich dem Header webhook-id: Verwenden Sie sie, um doppelte Nachrichten zu erkennen. |
type |
string | Die Art des Events, zum Beispiel customer.created. einer von: customer.created, customer.updated, customer.converted, customer.deleted, deal.created, deal.updated, deal.stage_changed, deal.labels_changed, deal.won, deal.lost, deal.deleted, note.created, note.updated, note.deleted, appointment.created, appointment.updated, appointment.confirmed, appointment.cancelled, appointment.completed, appointment.deleted, task.created, task.updated, task.moved, task.labels_changed, task.completed, task.deleted, quote.created, quote.updated, quote.sent, quote.accepted, quote.rejected, quote.deleted, invoice.created, invoice.updated, invoice.sent, invoice.paid, invoice.cancelled, invoice.credited, invoice.deleted, order.created, order.updated, order.status_changed, order.paid, work_order.created, work_order.updated, work_order.status_changed, work_order.completed, work_order.signed, work_order.deleted, service.created, service.updated, service.status_changed, service.completed, service.signed, service.deleted, conversation.created, conversation.closed, message.received, message.sent, message.not_delivered, review.received, review.replied, review.updated, review.deleted, conversation.reopened, conversation.deleted, meta_copilot.alert_created, meta_copilot.stopped, meta_copilot.opportunity_created, meta_copilot.approval_requested, meta_copilot.approval_expiring, meta_copilot.action_applied, meta_copilot.action_failed, meta_copilot.briefing_created |
created_at |
string (date-time) | Wann es geschah (UTC). |
data |
object | Der Inhalt des Events. |
data.object |
object | Das Objekt, wie es nach der Änderung war, in derselben Form wie in der REST-API (bei note.deleted: wie es vor dem Löschen war). |