Einen zuverlässigen Feed-Abgleich entwickeln
Auf dieser Seite
Ein zuverlässiger Client muss zwei Aufgaben getrennt behandeln: neue Posts schnell übernehmen und regelmäßig feststellen, welche Inhalte nicht mehr zum Feed gehören. Ein einzelner Zeitfilter kann beides nicht leisten.
Empfohlene Strategie#
- Rufe zuerst
/api/v1/feedsab und prüfe den aktuellen Feed-Umfang. - Hole neu eingetroffene Posts mit
updated_since. - Führe regelmäßig einen vollständigen Durchlauf durch alle Cursor-Seiten aus.
- Entferne lokale Posts erst, wenn ein vollständiger Durchlauf erfolgreich abgeschlossen wurde.
- Behalte den lokalen Bestand bei Netzwerkfehlern, 5xx-Antworten oder einer unlesbaren Antwort unverändert.
Feed-Umfang zuerst abgleichen#
GET /api/v1/feeds liefert genau die Feeds, die das verwendete Token aktuell
abdeckt und die aktiv ausgeliefert werden. Verknüpfungen mit „Alle Feeds“ nehmen
auch später angelegte Feeds automatisch auf.
Eine gültige, wohlgeformte Antwort darf deinen lokalen Umfang verändern:
- Neue Feed-ID → lokalen Feed anlegen.
- Bekannte Feed-ID mit geändertem
updated_at→ Metadaten und Darstellung aktualisieren. - Lokal vorhandene Feed-ID fehlt → lokale Kopie entfernen oder deaktivieren.
Wichtig
Eine Zeitüberschreitung, ein Verbindungsfehler oder eine unlesbare Antwort ist
keine leere Feed-Liste. Nur eine erfolgreiche Antwort mit data als Array
darf zum Entfernen lokaler Feeds führen.
Neue Posts mit updated_since abrufen#
updated_since filtert nach dem Zeitpunkt, zu dem Feedivo einen Post erstmals
gesehen hat. Damit erfasst du auch Beiträge, die erst nach ihrem eigentlichen
Veröffentlichungszeitpunkt bei Feedivo angekommen sind.
GET /api/v1/feeds/{uuid}/posts?updated_since=2026-08-16T08:00:00Z
Speichere als Wasserzeichen den Startzeitpunkt des erfolgreichen Laufs, nicht dessen Ende:
run_started_at = now()
alle Cursor-Seiten mit updated_since=last_successful_run abrufen
erst nach vollständigem Erfolg:
last_successful_run = run_started_at
So werden Posts, die während eines längeren Laufs eintreffen, beim nächsten Durchgang nicht übersprungen.
Hinweis
updated_since bedeutet „erstmals gesehen“, nicht „zuletzt bearbeitet“.
Änderungen an älteren Posts und Löschungen erkennst du nur über einen
vollständigen Abgleich.
Warum since für einen Sync nicht genügt#
since filtert nach published_at, also nach dem Veröffentlichungszeitpunkt
auf der Plattform. Dieser kann deutlich vor dem Zeitpunkt liegen, zu dem der
Post bei Feedivo eintrifft. Setzt du since exakt auf den letzten Lauf, kann
ein verspätet eingetroffener Post unbemerkt fehlen.
Nutze since deshalb für fachliche Zeiträume wie „alle Posts seit dem
Monatsanfang“. Für die technische Synchronisierung ist updated_since die
richtige Achse.
Alle Cursor-Seiten vollständig durchlaufen#
Jede Post-Liste enthält:
{
"meta": {
"pagination": {
"next_cursor": "eyJ…",
"count": 25
}
}
}
Sende next_cursor unverändert als cursor an den nächsten Aufruf. Der Cursor
ist opak: nicht dekodieren, verändern oder selbst erzeugen. Erst
next_cursor: null bestätigt die letzte Seite.
Eine leere Seite ohne vorhandenen next_cursor-Schlüssel ist keine gültige
Abschlussmeldung. Behandle eine solche Antwort als fehlerhaft und behalte den
lokalen Bestand.
Entfernte Posts sicher erkennen#
Ein Vollabgleich läuft ohne updated_since über alle Seiten. Markiere dabei
jede lokal gefundene Kombination aus Feed-ID, Plattform und Post-ID als
gesehen. Erst wenn die letzte Seite erfolgreich erreicht wurde, entfernst du
lokale Zuordnungen, die in diesem Lauf nicht vorkamen.
Das erfasst unter anderem:
- auf der Plattform gelöschte Posts
- nachträglich ausgeblendete Posts
- Änderungen an Feed-Filtern
- zusammengefasste Duplikate
- eine verkleinerte Grenze bei Posts insgesamt
- abgelaufene Stories
Ein Post kann zu mehreren Feeds gehören. Lösche deine lokale Post-Kopie daher erst, wenn sie keinem aktiven Feed mehr zugeordnet ist.
Robuster Ablauf als Pseudocode#
feeds = fetch_and_validate('/api/v1/feeds')
if request_failed:
keep_everything()
retry_later()
for each feed in feeds:
run_started_at = now()
pages = fetch_all_pages(feed, updated_since=watermark[feed])
if every_page_valid:
upsert(pages.posts)
watermark[feed] = run_started_at
if full_reconciliation_due:
for each feed in feeds:
pages = fetch_all_pages(feed)
if every_page_valid:
replace_feed_membership(feed, pages.post_ids)
Fehlerbehandlung und Wiederholungsregeln stehen unter Fehler und Rate-Limits behandeln.
Frage nicht beantwortet? Schreib uns — wir ergänzen die Seite.