Mit Sale-Callbacks ordnest du Verkäufe deines Shops den Link-Klicks zu, mit „Custom (API)“ schickst du Live-Daten aus eigenen Tools auf deine Page.
LinkHarbor nimmt Daten auch von außen an. Für zwei Fälle gibt es eigene Endpunkte mit eigenen Secrets – du brauchst dafür keinen API-Key: Sale-Callbacks melden Verkäufe aus deinem Shop, damit du in der Statistik siehst, welcher Link Umsatz gebracht hat. Die Integration „Custom (API)“ bringt Live-Daten aus eigenen Tools als Widget auf deine Page und kann Push-Nachrichten auslösen.
Sale-Callbacks: Verkäufe zuordnen
Wie Klick-ID (lt_click_id), Zuordnung und Auswertung zusammenhängen, erklärt Conversions und Verkäufe zuordnen; hier stehen alle Felder und Antworten für Entwickler. Kurz: LinkHarbor hängt beim Weiterleiten eines gezählten Klicks auf ein http- oder https-Ziel den Parameter lt_click_id an, dein Shop merkt ihn sich und schickt ihn nach dem Kauf zurück.
Callback-Secret anlegen
- Öffne „Callback & API“
- Klicke in der Karte „Callback-Secrets“ auf „+ Neuen Secret erstellen“
- Vergib optional einen Namen, zum Beispiel „Shop-Callback“, und klicke auf „Secret erstellen“
- Kopiere das Secret sofort – es wird nur einmal angezeigt
- Wer
- Eigentümer und Admins, ab Creator Pro. In Creator Free steht dort „Callback-Secrets sind ab Creator Pro verfügbar.“
- Anzahl
- Bis zu 5 Secrets pro Workspace, etwa eines pro Shop.
- „Bearbeiten“
- Name ändern und den Status auf „Aktiv“ oder „Inaktiv“ setzen. Mit einem inaktiven Secret lehnt die API Callbacks ab.
- „↺ Rotieren“
- Erzeugt ein neues Secret; das alte wird sofort ungültig.
- „Letzter Callback:“
- Zeigt, wann das Secret zuletzt erfolgreich genutzt wurde.
Callback senden
curl -X POST https://dock.at-harbor.com/v1/callbacks/sale \
-H "Content-Type: application/json" \
-H "X-Callback-Secret: $LH_CALLBACK_SECRET" \
-d '{
"click_id": "3f1c2a9e-8d4b-4a51-9f0e-6b7c1d2e3f40",
"order_id": "A-10023",
"amount": "49.90",
"currency": "EUR",
"occurred_at": "2026-11-01T10:15:00Z"
}'
# → {"ok":true,"conversion_id":123} | Feld | Pflicht | Bedeutung |
|---|---|---|
| click_id | Ja | Der Wert von lt_click_id (10–36 Zeichen) |
| order_id | Ja | Deine Bestellnummer (1–128 Zeichen); pro Workspace wird jede Bestellnummer nur einmal gezählt |
| amount | Ja | Betrag als Dezimalzahl, zum Beispiel "49.90"; keine negativen Werte |
| currency | Ja | Währung als dreistelliger Code, zum Beispiel EUR; Kleinbuchstaben wandelt die API um |
| occurred_at | Nein | Zeitpunkt des Kaufs (ISO 8601) |
| amount_base_minor, base_currency, fx_rate | Nein | Umgerechneter Betrag in kleinster Einheit, Basiswährung und Kurs, falls du in mehreren Währungen verkaufst |
| meta | Nein | Eigene Zusatzdaten als flaches Objekt: bis zu 50 Schlüssel mit 1–64 Zeichen; Werte sind Text (bis 500 Zeichen), Zahl, true/false oder null, verschachtelte Objekte und Listen werden abgelehnt |
| workspace_id | Nein | Deine Workspace-ID; mit ihr meldet die API eine unbekannte click_id als 404 statt 403 |
| Antwort | Bedeutung |
|---|---|
| 200 {"ok":true,"conversion_id":…} | Verkauf gespeichert – oder diese order_id war schon gespeichert (dann die ID der bestehenden Conversion) |
| 403 forbidden | Secret oder Signatur falsch, oder click_id unbekannt (ohne workspace_id) |
| 403 secret_inactive | Das Secret ist auf „Inaktiv“ gesetzt |
| 404 not_found | click_id unbekannt (nur mit workspace_id und gültigem Secret) |
| 413 request_too_large | Der Body ist größer als 1 MB |
| 422 validation_failed | Ein Feld fehlt oder ist ungültig, etwa ein zu langer oder verschachtelter Wert in meta |
| 429 rate_limited | Mehr als 120 Callbacks pro Minute von deiner IP-Adresse |
Optionale Signatur
Zusätzlich zum Secret kannst du den Header X-Callback-Signature senden. Er enthält sha256= und die HMAC-SHA256-Signatur des rohen Bodys in Hex. Als Schlüssel dient nicht das Secret selbst, sondern sein SHA-256-Hash in binärer Form. Schickst du den Header, muss er stimmen – sonst wird der Callback abgelehnt.
<?php
$body = json_encode($payload);
$key = hash('sha256', getenv('LH_CALLBACK_SECRET'), true); // binärer Hash des Secrets
$sig = 'sha256=' . hash_hmac('sha256', $body, $key);
// Header: X-Callback-Secret und X-Callback-Signature: $sig, Body: $body Wo du die Verkäufe siehst
Gemeldete Verkäufe erscheinen als Conversions in der Statistik, siehe Conversions und Verkäufe zuordnen. Über die API liest du sie mit read:stats unter /v1/stats/…/conversions/breakdown.
Custom (API): eigene Live-Daten
Mit der Integration „Custom (API)“ schickt jedes Programm, das HTTP-Anfragen senden kann – ein Spielserver-Plugin, ein Bot, ein Cron-Skript –, Daten an LinkHarbor. Daraus wird ein Live-Widget auf deiner Page, und über Push-Regeln können deine Follower benachrichtigt werden.
Verbinden
- Öffne im Workspace „Integrationen“
- Wähle „Custom (API)“ und gib einen Namen ein
- Nach dem Verbinden zeigt der Dialog „Ingest-URL“ und „Secret“ (mit „Secret anzeigen“)
- Hinterlege beides in deinem Tool
Integrationen gibt es ab Creator Pro. Ingest-URL und Secret sehen nur Eigentümer und Admins, auch später im Detailbereich der Integration. Trennen und neu verbinden erzeugt ein neues Secret. Wie du Integrationen allgemein verbindest, steht unter Integration verbinden.
Daten senden
curl -X POST "$INGEST_URL" \
-H "Authorization: Bearer $INGEST_SECRET" \
-H "Content-Type: application/json" \
-d '{
"event": "player.joined",
"event_id": "join-2026-11-01T20:01:02Z-steve",
"data": { "player": "Steve" },
"state": {
"type": "game_server",
"name": "Survival SMP",
"online": true,
"players_online": 3,
"players_max": 20
}
}'
# → {"ok":true,"event_id":4711,"duplicate":false,"event_type":"player.joined"} - event
- Freier Event-Name, zum Beispiel player.joined. Er wird in Kleinbuchstaben umgewandelt und ist der Name, auf den Push-Regeln reagieren. Ohne event heißt das Event state.updated.
- event_id
- Optionaler Schlüssel gegen doppelte Verarbeitung. Wird dieselbe event_id erneut geschickt, antwortet LinkHarbor mit duplicate: true und tut nichts.
- data
- Werte für die Platzhalter in Push-Texten, zum Beispiel {player}. Bis zu 40 Schlüssel, nur einfache Werte.
- state
- Der komplette Zustand des Widgets. Er ersetzt den bisherigen vollständig. type ist game_server (Spielserver-Karte) oder status (Status-Karte).
Statt Authorization: Bearer kannst du das Secret auch im Header X-LinkHarbor-Secret senden. Pro IP-Adresse sind 120 Aufrufe pro Minute erlaubt. Optional signierst du den Body: Der Header X-LinkHarbor-Signature enthält sha256= und die HMAC-SHA256-Signatur des rohen Bodys mit dem Secret als Schlüssel. Schickst du ihn, muss er stimmen.
| Antwort | Bedeutung |
|---|---|
| 200 {"ok":true,…} | Event gespeichert, bei bekannter event_id mit duplicate: true |
| 400 invalid_json | Der Body ist kein JSON-Objekt |
| 401 invalid_secret | Secret falsch oder Ingest-URL unbekannt |
| 401 signature_invalid | X-LinkHarbor-Signature passt nicht zum Body |
| 413 request_too_large | Der Body ist größer als 64 KB |
| 422 validation_failed | Weder event noch state im Body |
| 429 rate_limited | Mehr als 120 Aufrufe pro Minute von deiner IP-Adresse |
Das könnte auch helfen
Nichts gefunden?
Schreib uns dein Anliegen – unser Support hilft dir persönlich weiter.