API-Dokumentation
Ragfeed ist eine Web-Scraping-API für KI. Ihr Firecrawl-Code und die offiziellen SDKs laufen weiter, Sie tauschen Adresse und Schlüssel.
- Basis-URL
https://api.ragfeed.de- Anmeldung
Authorization: Bearer <API-Key>- Kostenlos
- 1.000 Credits im Monat, ohne Kreditkarte
Getestet mit den offiziellen firecrawl-py und firecrawl-js · im Konnektor-Verzeichnis von Claude gelistet · In Claude nutzen
- Kostenlos registrieren. Mit Ihrer E-Mail-Adresse unter Kostenlos starten. Nach dem Klick auf den Bestätigungslink sehen Sie Ihren API-Key. Er wird nur einmal angezeigt und nie per E-Mail verschickt; verloren? Neuen Key anfordern.
- Erste Seite abrufen.
curl -X POST https://api.ragfeed.de/v2/scrape \ -H "Authorization: Bearer sk-..." \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com", "formats": ["llmMarkdown"]}'Antwort{ "success": true, "data": { "llmMarkdown": "---\ntitle: Example Domain\nurl: \"https://example.com/\"\nlanguage: en\ntokens: 279\n---\n\nThis domain is for use in documentation examples …", "metadata": { "title": "Example Domain", "language": "en", "url": "https://example.com/", "statusCode": 200, "contentType": "text/html", "creditsUsed": 1 } } } - Weitermachen. Bestehenden Firecrawl-Code umstellen (Umstieg), Chunks für Ihre Vektordatenbank einstellen (Chunk-Werkstatt) oder ohne Code einbinden (Integrationen).
KI-gerechte Formate: llmMarkdown und Chunks
Zwei zusätzliche Formate liefern die Seite so, wie Sprachmodelle und Vektordatenbanken sie am besten verarbeiten. Sie kosten keine zusätzlichen Credits. Warum das Tokens spart und Antworten verbessert: KI-gerechte Daten.
{
"url": "https://example.com/leitfaden",
"formats": ["llmMarkdown", {"type": "chunks", "model": "openai-3", "profile": "balanced"}]
}
llmMarkdown: Markdown mit einem Kopf aus Titel, Adresse, Sprache, Abrufzeit und Tokenzahl. Linkziele stehen als nummerierte Liste am Ende, Bilder nur als Alternativtext. So bleibt der Text flüssig lesbar und spart Tokens.chunks: die Seite entlang ihrer Überschriften in fertige Datensätze für Ihre Vektordatenbank geteilt. Menüs, Linklisten und Brotkrumen-Navigation fallen weg. Einstellungen ausprobieren und als Aufruf kopieren: Chunk-Werkstatt.
Chunks im Detail
Eine Vektordatenbank speichert pro Eintrag eine ID, den Vektor, Metadaten und meist den Text. Einen gemeinsamen Standard gibt es nicht, deshalb hält sich
jeder Chunk an die strengsten Regeln der gängigen Datenbanken (Pinecone, Qdrant, Weaviate, Milvus, Chroma, pgvector). Den Vektor erzeugen Sie mit Ihrem
eigenen Embedding-Modell aus embedText.
{
"id": "87304409-1adc-5d47-b03a-60e4685d9d4c", // UUID: gleiche Seite + Position = gleiche ID
"index": 2,
"heading": "Regelungen zur Arbeitszeit › Arbeitszeiterfassung",
"text": "Das Bundesarbeitsgericht (BAG) hat …", // für Ihr Sprachmodell und die Quellenangabe
"embedText": "Das Bundesarbeitsgericht (BAG) hat …", // für das Embedding; mit "context" steht ein Vorspann davor
"tokens": 142, "embedTokens": 142,
"hash": "856bde94ee18",
"url": "https://www.bmas.de/…",
"metadata": { // flach: Text, Zahl, true/false, Liste von Texten
"url": "https://www.bmas.de/…", "title": "Regelungen zur Arbeitszeit", "heading": "…",
"language": "de", "pageId": "72a7249a-6785-58ea-b3a8-f141e7646523",
"chunkIndex": 2, "chunkCount": 5, "hash": "856bde94ee18", "tokens": 142,
"fetchedAt": "2026-09-29T19:27:49Z", "fetchedAtUnix": 1790710069,
"kategorie": "arbeitsrecht" // Ihre eigenen Felder aus "metadata"
}
}
Alle Optionen für Chunks
| Option | Wirkung |
|---|---|
model | Ihr Embedding-Modell: openai-3, mistral-embed, multilingual-e5, bge-m3, jina-v3,
cohere-v3, gemini. Jeder Chunk passt dann in dessen Eingabefenster. Bei multilingual-e5 und bge-m3 zählt
Ragfeed mit dem Tokenizer des Modells, bei den anderen bleibt ein Sicherheitsabstand von 30 %. |
profile | balanced (500 Tokens, Standard, in unserer Messung am treffsichersten),
precise (250, halb so viele Tokens pro Antwort; gut bei Modellen mit 512 Tokens, schwächer bei großem Eingabefenster),
broad (1.000, mehr Zusammenhang pro Chunk). |
maxTokens | Obergrenze pro Chunk, 100 bis 4.000, einschließlich eines Vorspanns in embedText. Eine harte Grenze, geschätzt mit 3,5 Zeichen pro Token. |
overlap | Tokens, die ein Chunk vom Ende des vorigen wiederholt, wenn ein langer Abschnitt geteilt wird (0 bis maxTokens/2, Standard 0). |
context | Was embedText vor den Text stellt: Liste aus title, headings, description,
oder true für Titel und Überschriftenpfad. Standard: nichts, embedText ist dann gleich text. In unserer
Messung fand die Suche ohne Vorspann gleich gut oder besser; er hilft bei vielen gleichnamigen Abschnitten. |
metadata | Bis zu 20 eigene Felder für jeden Chunk, etwa Kategorie oder Mandant zum Filtern. Werte: Text, Zahl, true/false oder Liste von Texten. |
idNamespace | Eigener Namensraum für IDs und pageId, damit dieselbe Seite in verschiedenen Projekten verschiedene IDs bekommt. |
shape | langchain liefert {id, page_content, metadata} für Document(**chunk), llamaindex liefert
TextNode(**chunk)-Felder. Standard ist das Ragfeed-Format oben. |
Seiten aktuell halten: Dieselbe Seite ergibt beim nächsten Abruf dieselben IDs, Ihre Datenbank überschreibt also statt zu doppeln.
Das gilt auch, wenn Sie sie über einen anderen Link abrufen: mit oder ohne www., Schrägstrich am Ende,
#Anker oder utm_-Parameter.
Wird eine Seite kürzer, löschen Sie zuerst alle Einträge mit ihrer pageId und schreiben dann neu. Über den
hash sehen Sie, welche Chunks sich geändert haben, und betten nur diese neu ein.
Die offiziellen Firecrawl-SDKs kennen diese beiden Formate nicht und lehnen sie teils vor dem Senden ab. Nutzen Sie dafür direkt HTTP (siehe cURL-Beispiel).
Limits und Credits
| Plan | Credits pro Monat | Parallele Anfragen | Anfragen pro Minute | Überwachung Beta | Preis pro Monat |
|---|---|---|---|---|---|
| Quelle | 1.000 | 2 | 10 | nicht enthalten | 0 € |
| Bach | 5.000 | 5 | 60 | nicht enthalten | 9 € |
| Fluss | 100.000 | 15 | 300 | alle 15 Min., 500 Seiten | 49 € |
| Strom | 500.000 | 30 | 600 | alle 15 Min., 2.000 Seiten | 199 € |
Eine Seite kostet 1 Credit (Markdown, KI-Markdown, Chunks, HTML, Links, Screenshot), jedes KI-Format 5 Credits zusätzlich
(Details unter KI-Auswertung). Fehlgeschlagene Seiten kosten nichts. Alle Preise: Wie viele Credits kostet was?
Verbleibende Credits liefert GET /v2/team/credit-usage. Wer das Limit pro Minute überschreitet, erhält
429 RATE_LIMIT_EXCEEDED mit der Wartezeit in der Meldung; ist das Guthaben aufgebraucht, antwortet die API mit 402.
Endpunkte auf einen Blick
Ragfeed versteht die Firecrawl-API in Version 1 und 2.
| Endpunkt | Wofür |
|---|---|
POST /v2/scrape | Eine Seite als Markdown, KI-Markdown, Chunks, HTML, Links, Screenshot oder JSON. JavaScript wird gerendert, PDFs als Text geliefert. |
POST /v2/crawl | Ganze Websites inklusive Sitemap, mit Pfadfiltern, Tiefenlimit und Webhooks pro Seite |
POST /v2/batch/scrape | Viele Adressen in einem Auftrag |
POST /v2/map | Alle Adressen einer Domain, optional nach Suchbegriff sortiert |
POST /v2/search | Websuche, optional mit direkt abgerufenen Treffern |
POST /v2/extract | Strukturierte Daten nach Ihrem JSON-Schema, auch über viele Seiten |
POST /v2/parse | Dokumente per Upload: PDF, Office, OpenDocument, EPUB, CSV |
POST /v2/monitor | Überwachung Beta: Seiten, Websites oder Websuchen nach Zeitplan prüfen und Änderungen melden;
verwalten und Ergebnisse abrufen unter /v2/monitor/{id} |
POST /v2/monitor/estimate | Kosten einer Überwachung vor dem Anlegen |
Umstieg von Firecrawl
Unterschiede im Detail: Ragfeed und Firecrawl im Vergleich
Die API ist kompatibel zu den Open-Source-SDKs firecrawl-py (Python) und @mendable/firecrawl-js (Node.js)
sowie zu Integrationen wie LangChain. Setzen Sie nur api_url bzw. apiUrl auf https://api.ragfeed.de
und verwenden Sie Ihren Ragfeed-Key. Der restliche Code bleibt gleich.
# pip install firecrawl-py
from firecrawl import Firecrawl
app = Firecrawl(
api_key="sk-...",
api_url="https://api.ragfeed.de", # ← die einzige Änderung
)
doc = app.scrape("https://example.com", formats=["markdown"])
print(doc.markdown)
// npm i @mendable/firecrawl-js
import Firecrawl from "@mendable/firecrawl-js";
const app = new Firecrawl({ apiKey: "sk-...", apiUrl: "https://api.ragfeed.de" });
const doc = await app.scrape("https://example.com", { formats: ["markdown"] });
console.log(doc.markdown);
curl -X POST https://api.ragfeed.de/v2/scrape \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "formats": ["markdown"]}'
Scrape – eine Seite
POST /v2/scrape
{
"url": "https://example.com/produkt",
"formats": ["markdown", "links", {"type": "screenshot", "fullPage": true}],
"onlyMainContent": true, // Navigation, Footer, Cookie-Banner entfernen
"waitFor": 1000, // ms warten (erzwingt Browser-Rendering)
"location": {"country": "DE"}, // Sprache/Accept-Language
"maxAge": 172800000 // Cache-Treffer bis 2 Tage alt sind ok
}
Formate: markdown, html, rawHtml, rawBase64, links,
images, screenshot, summary, changeTracking sowie die KI-Formate
{"type":"json","schema":{…},"prompt":"…"}, {"type":"question","question":"…"}, {"type":"highlights","query":"…"},
product und menu.
changeTracking vergleicht die Seite mit Ihrem letzten Abruf derselben URL und meldet
new, same oder changed; mit
{"type":"changeTracking","modes":["git-diff"]} kommt der Unterschied Zeile für Zeile dazu, mit
"tag" führen Sie getrennte Vergleichsreihen für dieselbe URL. Für den Vergleich wird die Seite immer frisch abgerufen,
nicht aus dem Zwischenspeicher, außer Sie setzen maxAge ausdrücklich.
KI-Formate lesen die ersten 25.000 Zeichen des Seiteninhalts. Die ersten 2.000 Token der Antwort
sind im Preis des Formats enthalten, je weitere angefangene 2.000 Token kosten noch einmal 5 Credits;
mehr als 8.000 Token ergeben den Fehler LLM_OUTPUT_TOO_LONG (weniger Felder anfragen oder das Schema aufteilen).
Mit einem bezahlten Plan oder gekauften Credits gibt es kein Tageslimit für KI-Formate, nur Ihre Credits zählen. Im kostenlosen Plan gilt ein
Tageskontingent von 100.000 Token; ist es aufgebraucht, liefert die Antwort bis Mitternacht (UTC) alle anderen Formate
und einen Hinweis in warning, KI-Credits werden dann nicht berechnet.
Browser-Aktionen
"actions": [
{"type": "click", "selector": "#suche"},
{"type": "write", "text": "Laptop"},
{"type": "press", "key": "Enter"},
{"type": "wait", "selector": ".ergebnisse"},
{"type": "scroll", "direction": "down"},
{"type": "screenshot", "fullPage": true},
{"type": "executeJavascript", "script": "return document.title"}
]
Crawl – ganze Website
POST /v2/crawl
{
"url": "https://docs.example.com",
"limit": 500,
"includePaths": ["^/guides/.*"],
"excludePaths": ["^/guides/archiv/.*"],
"maxDiscoveryDepth": 3,
"sitemap": "include", // include | skip | only
"scrapeOptions": {"formats": ["markdown"]},
"webhook": {"url": "https://ihr-server.de/hook", "events": ["page", "completed"]}
}
→ {"success": true, "id": "…", "url": "https://api.ragfeed.de/v2/crawl/…"}
GET /v2/crawl/{id} Status und Ergebnisse (seitenweise über "next")
GET /v2/crawl/{id}/errors fehlgeschlagene und per robots.txt gesperrte URLs
DELETE /v2/crawl/{id} abbrechen
Ohne crawlEntireDomain werden nur Unterseiten der Start-URL gecrawlt. Mit "prompt": "nur der Blog" erzeugt die KI passende Filter.
Webhooks prüfen
Jede Webhook-Nachricht (Crawl, Batch-Scrape und Überwachung) enthält den Header
X-Webhook-Signature: t=<Zeit>,v1=<Signatur>.
Die Signatur ist ein HMAC-SHA256 über <Zeit>.<Rohdaten> mit Ihrem Webhook-Schlüssel aus dem Dashboard.
Verwerfen Sie Nachrichten, deren Signatur nicht passt oder deren Zeitstempel älter als 5 Minuten ist. Für Empfänger, die Firecrawls Format erwarten, steht dieselbe
Prüfung ohne Zeitstempel in X-Firecrawl-Signature: sha256=<HMAC-SHA256 über die Rohdaten>
(Beispiel). Jede Nachricht trägt eine webhookId.
import hashlib, hmac, time
def is_valid(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
expected = hmac.new(secret.encode(), parts["t"].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"]) and abs(time.time() - int(parts["t"])) < 300
Ereignisse (Feld type, mit dem Präfix crawl. oder batch_scrape.):
started beim Start, page für jede fertige Seite (Inhalt in data) und
completed am Ende, auch wenn der Auftrag wegen des Limits oder des Guthabens vorzeitig endet.
Mit "events": ["page"] (oder dem vollen Namen "crawl.page") erhalten Sie nur die genannten Ereignisse.
Überwachungen senden monitor.page und monitor.check.completed, siehe
Meldungen per Webhook.
{"success": true, "type": "crawl.page", "id": "…", "data": [{"markdown": "…", "metadata": {…}}], "metadata": {/* Ihre Angaben aus webhook.metadata */}}
Dokumente einlesen
Datei hochladen (PDF inkl. gescannter Seiten, .docx, .xlsx, .xls, .pptx, .odt, .ods, .odp, .epub, .csv, .html) – oder einfach einen Link auf ein Dokument an /v2/scrape schicken.
curl -X POST https://api.ragfeed.de/v2/parse \
-H "Authorization: Bearer sk-..." \
-F "file=@vertrag.pdf" \
-F 'options={"formats": ["markdown"], "parsers": [{"type": "pdf", "mode": "auto"}]}'
# Python (firecrawl-py)
doc = app.parse("vertrag.pdf")
PDF-Modi: fast (nur Textebene), auto (Texterkennung für Seiten ohne Text, Standard), ocr (Texterkennung für jede Seite).
Alte Binärformate (.doc, .ppt, .rtf) werden nicht unterstützt.
Datenschutz: Die Datei wird nur im Arbeitsspeicher verarbeitet und nicht gespeichert. Nur mit changeTracking behalten wir den umgewandelten Text bis zu 90 Tage für den nächsten Vergleich. Im Nutzungsprotokoll stehen Dateityp und die ersten 8 Zeichen
ihrer SHA-256-Prüfsumme (zum Beispiel pdf · 3f9a1c2e), nie der Dateiname; auch eine KI-Auswertung erhält den Namen nicht.
Gesundheits- und Personaldaten sind nach den Nutzungsregeln ausgeschlossen. Enthält ein Dokument Hinweise darauf,
steht in warning ein Hinweis; umgewandelt wird trotzdem.
Möglichst wenig Spuren: zeroDataRetention
Mit "zeroDataRetention": true bei /v2/scrape, /v2/parse,
/v2/batch/scrape und /v2/crawl (bei Extract in scrapeOptions) behält Ragfeed so wenig wie möglich (Ausnahme: Schlägt ein Abruf fehl, steht die Adresse bis zu 7 Tage im Server-Protokoll):
- Der Abruf landet nicht im gemeinsamen Zwischenspeicher. Eine vorhandene Kopie bis 48 Stunden kann trotzdem ausgeliefert werden; für einen frischen Abruf zusätzlich
"maxAge": 0. - Im Nutzungsprotokoll steht statt der Adresse nur eine Kurzkennung.
- Ergebnisse von Crawl, Batch und Extract löschen wir rund 60 Minuten nach Ende des Auftrags statt nach 24 Stunden. Auftragsergebnisse sind nie in Sicherungskopien.
- Nicht kombinierbar mit
changeTrackingundscreenshot, weil beide nur funktionieren, wenn wir etwas aufbewahren (400ZERO_DATA_RETENTION_NOT_SUPPORTED). - KI-Formate gehen wie sonst an Scaleway in Paris, das Anfragen nicht speichert (Ausnahme: technische Fehler oder Verdacht auf Missbrauch, bis zu zwei Wochen).
Auch ohne diese Option gilt: Die Adresse eines Abrufs steht 13 Monate im Nutzungsprotokoll, danach nur noch Art, Credits und Datum.
Batch-Scrape – viele URLs
POST /v2/batch/scrape
{"urls": ["https://a.de", "https://b.de"], "formats": ["markdown"]}
GET /v2/batch/scrape/{id}
Map – alle URLs einer Domain
POST /v2/map
{"url": "https://example.com", "search": "preise", "limit": 1000}
→ {"success": true, "links": [{"url": "…", "title": "…"}]}
Search – Websuche
POST /v2/search
{"query": "beste Vektordatenbank 2026", "limit": 5, "sources": ["web", "news"],
"tbs": "qdr:m", "scrapeOptions": {"formats": ["markdown"]}}
Extract – strukturierte Daten über mehrere Seiten
POST /v2/extract
{
"urls": ["https://example.com/team/*"],
"prompt": "Alle Teammitglieder mit Rolle",
"schema": {"type": "object", "properties": {"people": {"type": "array", "items": {
"type": "object", "properties": {"name": {"type": "string"}, "role": {"type": "string"}}}}}}
}
GET /v2/extract/{id}
Überwachung Beta
Ragfeed prüft einzelne Seiten, ganze Websites oder Websuchen nach Ihrem Zeitplan selbst, vergleicht jede Prüfung mit der vorigen und meldet,
was neu, geändert oder entfernt ist: per Webhook an Ihren Ablauf, per E-Mail oder zum Abholen über die API. Auf Wunsch bewertet eine KI, ob eine
Änderung für Ihr Ziel wesentlich ist. Die Endpunkte sind kompatibel zur Überwachung von Firecrawl (/v2/monitor); das SDK
firecrawl-py funktioniert mit Ihrer Basis-URL (Beispiel). Ohne Code legen Sie Überwachungen im
Dashboard an oder lassen sie von Claude anlegen (Konnektor).
- Kein Echtzeit-Alarm. Geprüft wird nach Zeitplan, je nach Plan höchstens alle 15 Min. (Limits). Bei hoher Auslastung kann eine Prüfung später beginnen. Nach einer Unterbrechung läuft eine Prüfung sofort, verpasste Termine werden nicht einzeln nachgeholt.
- Nur öffentliche Seiten, immer live. Keine Logins, keine Browser-Aktionen, keine Archivkopien; robots.txt gilt (Regeln).
- Keine Überwachung von Personen. Profilseiten sozialer Netzwerke lassen sich nicht überwachen.
- Einmal zustimmen. Für die Überwachung gelten die Ergänzenden Bedingungen für die Überwachung (AGB Ziffer 2a).
Neue Konten nehmen sie mit den AGB an, ältere Konten einmal im Dashboard oder bei der Anmeldung in Claude. Bis dahin antwortet
POST /v2/monitormit403 MONITOR_TERMS_REQUIRED.
Endpunkte
| Endpunkt | Wofür |
|---|---|
POST /v2/monitor | Überwachung anlegen. Die Antwort enthält die id, den nächsten Termin (nextRunAt) und die Kostenschätzung. |
POST /v2/monitor/estimate | Nur bei Ragfeed: Kosten und Limits für denselben Body berechnen, ohne etwas anzulegen oder abzurufen |
GET /v2/monitor | Ihre Überwachungen, neueste zuerst (limit 1 bis 100, Standard 25; offset) |
GET /v2/monitor/{id} | Eine Überwachung |
PATCH /v2/monitor/{id} | Ändern, nur die gesendeten Felder. "status": "paused" pausiert, "active" setzt fort;
null entfernt webhook, notification, goal oder judgeEnabled |
DELETE /v2/monitor/{id} | Löschen, mit allen Prüfungen und gespeicherten Seitenständen |
POST /v2/monitor/{id}/run | Sofort prüfen, außerhalb des Zeitplans (Body leer oder beliebig). Geht auch bei pausierten Überwachungen, solange sie in Ihren Plan passen; je Konto eine manuelle Prüfung zur Zeit. Läuft schon eine Prüfung: 409 CHECK_ALREADY_RUNNING |
GET /v2/monitor/{id}/checks | Prüfungen, neueste zuerst (limit, offset, status) |
GET /v2/monitor/{id}/checks/{checkId} | Eine Prüfung mit ihren Seiten (limit, skip, status filtert nach Seitenstatus).
Weitere Seiten über die Adresse in next, die auch in data.next steht. |
Anlegen
Eine Seite jeden Morgen um 7 Uhr prüfen und Änderungen an die E-Mail-Adresse Ihres Kontos melden:
curl -X POST https://api.ragfeed.de/v2/monitor \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d '{
"name": "Preisseite",
"schedule": {"text": "daily at 7:00", "timezone": "Europe/Berlin"},
"targets": [{"type": "scrape", "urls": ["https://example.com/"]}],
"notification": {"email": {"enabled": true}}
}'
→ {"success": true, "data": {"id": "…", "status": "active",
"schedule": {"cron": "0 7 * * *", "timezone": "Europe/Berlin", "text": "daily at 7:00"},
"nextRunAt": "…", "creditsPerCheck": 1, "checksPerMonth": 30, "estimatedCreditsPerMonth": 30, …}}
Mit demselben Body an POST /v2/monitor/estimate sehen Sie die Kosten vorher: creditsPerCheck,
judgeCreditsPerCheck, checksPerMonth (Prüfungen in 30 Tagen), estimatedCreditsPerMonth
(Schätzung für 30 Tage, als würde die KI jede Seite bewerten; selbst ausgelöste Prüfungen, PDFs mit vielen Seiten und lange JSON-Antworten kosten mehr), estimatedCreditsPerMonthWithoutJudge, die Zahl der überwachten Seiten
(watchedUrls) und unter limits die Grenzen Ihres Plans mit den schon belegten Seiten.
Alle Felder an einem Beispiel
Drei Ziele in einer Überwachung: zwei bekannte Seiten, ein Bereich einer Website und zwei Suchanfragen. Speichern Sie den Body als
monitor.json und schicken Sie ihn mit -d @monitor.json; Umlaute kommen so auf jedem System richtig an.
{
"name": "Markt und Wettbewerb",
"schedule": {"cron": "0 7 * * 1-5", "timezone": "Europe/Berlin"},
"targets": [
{"type": "scrape",
"urls": ["https://example.com/preise", "https://example.com/lieferung"],
"scrapeOptions": {"onlyMainContent": true,
"formats": ["markdown", {"type": "chunks", "profile": "balanced"}]}},
{"type": "crawl",
"url": "https://example.com/produkte",
"crawlOptions": {"limit": 30, "maxDiscoveryDepth": 2, "excludePaths": ["^/produkte/archiv/.*"]}},
{"type": "search",
"queries": ["Example GmbH Preise", "Example GmbH neues Produkt"],
"searchWindow": "24h", "maxResults": 10, "excludeDomains": ["example.com"]}
],
"goal": "Wichtig sind neue oder geänderte Preise, neue Produkte und geänderte Lieferbedingungen. Layout, Datumsangaben und Tippfehler sind unwichtig.",
"webhook": {
"url": "https://example.com/ragfeed-webhook",
"headers": {"X-Ihr-Token": "geheim"},
"metadata": {"projekt": "markt"},
"events": ["monitor.page", "monitor.check.completed"]
},
"notification": {"email": {"enabled": true, "recipients": ["einkauf@example.com", "vertrieb@example.com"], "includeDiffs": true}},
"retentionDays": 60
}
curl -X POST https://api.ragfeed.de/v2/monitor \ -H "Authorization: Bearer sk-..." \ -H "Content-Type: application/json" \ -d @monitor.json
| Feld | Bedeutung |
|---|---|
name | Pflicht, bis 256 Zeichen |
schedule | Pflicht: cron oder text, dazu timezone (siehe Zeitplan) |
targets | Pflicht, 1 bis 50 Ziele, Typen mischbar. Jedes Ziel bekommt eine id. Schicken Sie beim Ändern die
id mit, behält das Ziel seine gespeicherten Seitenstände; ohne id übernimmt das Ziel desselben Typs mit den meisten gleichen Adressen sie. |
"type": "scrape" | urls: die Seiten, die Sie einzeln überwachen |
"type": "crawl" | url und crawlOptions: limit (Seiten pro Prüfung, Standard 50 oder weniger, wenn Ihr Plan
weniger erlaubt), maxDiscoveryDepth (0 bis 100), includePaths und excludePaths (reguläre Ausdrücke für den Pfad).
Gefunden wird wie bei Crawl: Startseite, Sitemap, dann die Links, auf demselben Host und unterhalb der Start-URL. |
"type": "search" | queries (1 bis 12, je bis 256 Zeichen), searchWindow
(5m, 15m, 1h, 6h, 24h, 7d; Standard 24h), maxResults (1 bis 50, Standard 10, für alle Suchanfragen zusammen),
includeDomains oder excludeDomains (je bis 50). Braucht ein goal oder "judgeEnabled": false. |
scrapeOptions | Für Seiten und Websites, wie bei Scrape, etwa onlyMainContent, includeTags,
waitFor, location, proxy. Verglichen wird immer der Hauptinhalt als Markdown. In formats wirken nur
changeTracking mit "modes": ["json"] (Felder nach Schema vergleichen) und die Einstellungen von chunks (für
chunkDiff); weitere Formate liefert die Überwachung nicht. |
goal, judgeEnabled | Ziel in Worten, bis 2.000 Zeichen. Mit Ziel ist die KI-Bewertung an,
außer bei "judgeEnabled": false. |
webhook | url (oder nur die Adresse als Text), headers (bis 20), metadata
(kommt in jeder Nachricht mit), events (Standard: beide). Werte der Header zeigt die API nur als ***; schicken Sie
*** zurück, bleibt der gespeicherte Wert. |
notification.email | enabled, recipients, includeDiffs (siehe E-Mail) |
retentionDays | Wie lange Prüfergebnisse bleiben: 1 bis 90 Tage, Standard 30 |
Das Beispiel zählt 2 + 30 + 10 = 42 überwachte Seiten. Zusätzliche Felder wie origin aus den SDKs werden ignoriert.
Zeitplan
Geben Sie genau eines an: cron (5 Felder: Minute, Stunde, Tag, Monat, Wochentag; mit Listen, Bereichen, Schritten und Namen wie
mon oder jan, dazu @hourly, @daily, @weekly,
@monthly) oder text. timezone ist ein IANA-Name wie
Europe/Berlin, Standard UTC. Die Antwort nennt immer den cron-Ausdruck, ein Text bleibt in
schedule.text stehen.
- Texte auf Englisch:
every 30 minutes,every 15 minutes starting at :07,hourly,every 2 hours,daily,daily at 9:00,daily at 9am,weekly,every monday at 8:00. - Auf Deutsch:
alle 30 Minuten,stündlich,alle 2 Stunden,täglich,täglich um 9 Uhr,wöchentlich,jeden Montag um 8:00. - Texte ohne feste Uhrzeit (etwa
hourly) bekommen eine feste Minute, die sich aus der ID der Überwachung ergibt. So starten nicht alle Prüfungen gleichzeitig. - Der kürzeste Abstand zwischen zwei Terminen muss zu Ihrem Plan passen (Limits), sonst
400 SCHEDULE_TOO_FREQUENT. Nach einem Wechsel in einen kleineren Plan hält der Zeitplaner dessen Abstand ein und lässt Termine aus. - Sommerzeit: Eine Uhrzeit, die in der Umstellungsnacht nicht existiert, läuft zum Zeitpunkt der Umstellung; eine doppelte Uhrzeit läuft einmal.
Ziel und KI-Bewertung
Mit einem goal bewertet eine KI jede geänderte Seite (anhand des Unterschieds, höchstens 12.000 Zeichen) und jeden
neuen Suchtreffer (Titel, Auszug, Suchanfrage): Ist die Änderung für Ihr Ziel wesentlich oder nicht wesentlich? Die Seite trägt dann
isMeaningful und eine judgment:
"judgment": {
"meaningful": true,
"confidence": "high", // high | medium | low
"reason": "Der Preis für den Tarif Basis steigt von 9 auf 12 Euro.",
"meaningfulChanges": [{"type": "changed", "before": "9 €", "after": "12 €", "reason": "Preiserhöhung"}] // added | removed | changed
}
- Kosten: 2 Credits pro bewerteter Seite oder bewertetem Treffer, berechnet nach einer verwertbaren Antwort.
- Wenn die KI nicht antworten kann (keine KI auf dem Server, Tageskontingent des kostenlosen Plans aufgebraucht, Dienst gestört, unbrauchbare Antwort, zu wenig Credits),
bleibt
judgmentleer, die Seite zählt als wesentlich (isMeaningful: true), damit nichts verloren geht, und es wird nichts berechnet.metadata.judgeDegradedist danntrue,metadata.judgeDegradedReasonnennt den Grund:llm_not_configured,free_ai_allowance_used,free_ai_budget_used,llm_unavailable,llm_error,invalid_answerodernot_enough_credits. - Kostenloser Plan: Die Bewertung zählt zum Tageskontingent der KI-Formate (100.000 Token, siehe KI-Auswertung).
- Wirkung: Webhooks bekommen jede gemeldete Seite mit
isMeaningful, Sie filtern selbst. Die E-Mail lässt nicht wesentliche Seiten weg und entfällt, wenn nichts Wesentliches übrig bleibt.
Prüfungen und Seiten
| Status der Prüfung | Bedeutung |
|---|---|
queued, running | Wartet oder läuft; summary und actualCredits zeigen den Zwischenstand |
completed | Alle Seiten geprüft, ohne Fehler |
partial | Einige Seiten mit Fehler |
failed | Alle Seiten mit Fehler, oder die Prüfung wurde unterbrochen |
skipped_overlap | Die vorige Prüfung lief noch. Nicht berechnet. |
skipped_no_credits | Das Guthaben reichte nicht für eine Seite. Nicht berechnet, die Überwachung bleibt aktiv (Credits). |
Jede Prüfung hat trigger (scheduled oder manual), scheduledFor,
startedAt, finishedAt, estimatedCredits (Schätzung), actualCredits,
billingStatus (confirmed: berechnet, not_applicable: nichts berechnet,
released: ausgesetzt), summary mit der Zahl der Seiten je Status, targetResults je Ziel,
notificationStatus (was mit der E-Mail geschah) und, wenn Webhooks verschickt wurden, webhookDeliveries
(Anzahl delivered, pending, failed, cancelled, bei
Problemen lastError und lastStatusCode).
| Status der Seite | Bedeutung |
|---|---|
same (unverändert) | Hauptinhalt wie bei der letzten Prüfung. Keine Meldung. |
new (neu) | Erste Prüfung der Seite, eine neu gefundene Seite der Website, ein neuer Suchtreffer oder eine Seite, die wieder erreichbar ist |
changed (geändert) | Hauptinhalt anders als zuletzt; der Unterschied steht in diff |
removed (entfernt) | Die Seite antwortet mit 404 oder 410, oder eine vollständige Prüfung der Website findet sie nicht mehr |
error (Fehler) | Nicht prüfbar: nicht erreichbar, HTTP-Fehler, Zugriff gesperrt, robots.txt. Nicht berechnet; der gespeicherte Stand bleibt. |
- Vergleich: Hauptinhalt als Markdown; Leerzeichen am Zeilenende und mehrere Leerzeilen zählen nicht. Mit
changeTrackingim JSON-Modus zählen nur die Felder Ihres Schemas, gemischt mit"modes": ["git-diff", "json"]beides. - diff:
diff.textist ein Unified Diff (--- previous,+++ current),diff.jsondieselben Änderungen als Struktur (files→chunks→changesmitadd,del,normalund Zeilennummern). Im JSON-Modus steht indiff.jsonpro geändertem Feld{"previous": …, "current": …}und insnapshot.jsondas ganze Ergebnis. Sehr lange Unterschiede werden bei 200.000 Zeichen gekürzt (metadata.diffTruncated). - metadata:
title,creditsUsed,judgeCredits,finalUrl(nach Weiterleitung),rebaselined(neuer Ausgangsstand nach geänderten Optionen des Ziels oder einer neuen Verarbeitung bei Ragfeed: unverändert, ohne Meldung),notFoundByCrawl; bei Suchtreffernquery,description,publishedAtundsearchStatus(alert: relevant oder nicht bewertet,ignored: als nicht wesentlich bewertet). - Websites: Entfernte Seiten meldet eine Prüfung nur, wenn sie die Website vollständig gesehen hat: keine Seite und keine Sitemap fehlgeschlagen, Limit nicht erreicht,
genug Credits (
targetResults[].removalCheck:doneoderskipped). Dazu stehen dortdiscovered,limitReached,robotsBlockedundbrokenLinks(Links auf Seiten, die es nie gab; sie erzeugen keine Fehlerseite). BrauchenincludePathsoderexcludePathszu viel Rechenzeit, folgt die Prüfung keinen weiteren Links (pathPatternsStopped: true; entfernte Seiten werden dann nicht gemeldet). - Suchen: Nur Treffer, die das Ziel noch nicht gemeldet hat, werden zu Seiten mit Status
new; bekannte zählen als unverändert.targetResultsnenntresultCount,newResults,matches,searchCreditsundjudgeCredits.
chunkDiff: die Vektordatenbank aktuell halten
Neue und geänderte Seiten tragen chunkDiff: welche Chunks der Seite neu, weg oder anders sind und was Ihre Vektordatenbank
dafür tun muss. Gerechnet wird mit den Einstellungen des Formats chunks im Ziel, ohne sie mit den Standardwerten.
Das Vorgehen dahinter, auch ohne Überwachung: Vektordatenbank aktuell halten.
"chunkDiff": {
"added": [{"id": "…", "hash": "…", "heading": "Preise › Basis"}], // Inhalt neu
"removed": [{"id": "…", "hash": "…", "heading": "Preise › Alt"}], // Inhalt weg
"changed": [{"id": "…", "hash": "…", "heading": "…", "previousHash": "…"}], // gleiche ID, anderer Inhalt
"upsert": ["…"], // diese IDs neu schreiben
"delete": ["…"] // diese IDs löschen
}
upsert und delete arbeiten mit den IDs, die von der Position abhängen: Kommt oben ein Abschnitt dazu, bekommen alle
folgenden IDs neuen Inhalt, und IDs über die neue Anzahl hinaus fallen weg. added, removed und
changed vergleichen dagegen den Inhalt über den hash; nur diese Abschnitte müssen Sie neu einbetten.
Die Texte selbst liefert die Überwachung nicht mit: Rufen Sie die Seite mit denselben Chunk-Einstellungen über /v2/scrape ab
(1 Credit) und schreiben Sie die Chunks, deren id in upsert steht. Passt ein
hash nicht, hat sich die Seite inzwischen erneut geändert; die nächste Prüfung meldet das.
Meldungen per Webhook
monitor.pagefür jede Seite, die nicht unverändert ist: neu, geändert, entfernt oder Fehler, auch wenn die KI sie als nicht wesentlich bewertet. Unveränderte Seiten senden nichts.monitor.check.completednach jeder Prüfung mit dem Statuscompleted,partial,failedoderskipped_overlap; nicht nachskipped_no_credits.- Mit
webhook.eventswählen Sie aus; die Kurzformenpageundcheck.completedgehen auch. Eine leere Liste lehnt die API ab (400); lassen Sieeventsweg, erhalten Sie beide.
{"success": true, "type": "monitor.page", "id": "<checkId>", "webhookId": "…",
"data": [{"monitorId": "…", "checkId": "…", "url": "https://example.com/preise", "status": "changed",
"previousScrapeId": "…", "currentScrapeId": "…", "error": null, "isMeaningful": true,
"judgment": {…}, "diff": {"text": "--- previous\n+++ current\n…", "json": {…}},
"chunkDiff": {…}, "pageId": "…", "targetId": "…", "statusCode": 200, "metadata": {…}, "createdAt": "…"}],
"error": null, "metadata": {"projekt": "markt"}}
monitor.check.completed enthält pro Prüfung monitorId, checkId, status,
summary, trigger, scheduledFor, startedAt, finishedAt,
actualCredits und error; success ist bei partial und
failed false.
- Signaturen: Jede Nachricht trägt
X-Webhook-Signature(wie unter Webhooks prüfen) undX-Firecrawl-Signature: sha256=<HMAC-SHA256 über die Rohdaten>, beide mit dem Webhook-Schlüssel Ihres Kontos aus dem Dashboard. Prüfen Sie eine davon, bevor Sie die Nachricht verarbeiten. - Zustellung: Ihr Endpunkt antwortet innerhalb von 10 Sekunden mit einem 2xx-Status. Weiterleitungen folgen wir nicht. Sonst versuchen wir es nach
1, 5 und 15 Minuten erneut, danach gilt die Zustellung als
fehlgeschlagen. Die Nachrichten einer Prüfung kommen in ihrer Reihenfolge an.
webhookIdbleibt bei Wiederholungen gleich; damit erkennen Sie doppelte Zustellungen. - Größe: Nachrichten über 1 MB verlieren zuerst den Text des Unterschieds,
dann
diff,chunkDiffundsnapshot, zuletzt Details; die Seite trägt dannpayloadTruncated: true. Vollständig bleibt die Prüfung über die API. - Absender: Webhooks kommen nicht von einer festen IP-Adresse. Sichern Sie Ihren Endpunkt über die Signatur und auf Wunsch einen eigenen Header in
webhook.headers. Die Adresse muss öffentlich erreichbar sein; wir prüfen sie vor jedem Versuch. - Ändern Sie die Webhook-Adresse, gehen ausstehende Wiederholungen an die neue. Ist die Überwachung oder ihr Webhook gelöscht, entfallen sie.
import hashlib, hmac
def firecrawl_signature_ok(raw_body: bytes, header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)
Meldungen per E-Mail
"notification": {"email": {"enabled": true}}schickt die Meldungen an die E-Mail-Adresse Ihres Kontos. Eine Seite, die dauerhaft nicht lesbar ist, meldet die E-Mail nur beim ersten Mal; Webhooks und die Prüfergebnisse zeigen sie bei jeder Prüfung.- Mit
recipientsbestimmen Sie die Empfänger selbst: Ihre Kontoadresse (falls sie dabei sein soll) und bis zu 5 weitere Adressen, sonst400 TOO_MANY_RECIPIENTS. Jede weitere Adresse erhält einmal eine sachliche Bitte um Bestätigung mit einem Link, der 7 Tage gilt. Erst danach bekommt sie Meldungen; ohne Bestätigung löschen wir sie nach 7 Tagen. Wegwerfadressen sind nicht erlaubt (RECIPIENT_NOT_ALLOWED). - Den Stand zeigt
emailRecipientSubscriptions:pending,confirmedoderunsubscribed, Quelleteam(Ihre Kontoadresse) oderopt_in. - Eine E-Mail kommt nach einer Prüfung mit neuen, geänderten, entfernten oder fehlerhaften Seiten, als Text mit Status, Adresse und der Begründung der KI.
Mit
includeDiffsstehen Auszüge der Unterschiede dabei (bis 2.000 Zeichen pro Seite, 20.000 pro E-Mail). - Jede E-Mail enthält einen Link zum Abmelden mit einem Klick (auch als
List-Unsubscribefür E-Mail-Programme) und einen Link, mit dem der Empfänger seine Adresse für alle Überwachungen bei Ragfeed sperrt. - Pro Konto gehen höchstens 50 Meldungs-E-Mails am Tag hinaus, jede Empfängeradresse zählt einzeln. Was mit der E-Mail einer Prüfung
geschah, steht in
notificationStatus.email.status, etwasent,suppressed(nichts Wesentliches),no_confirmed_recipientsoderaccount_limit.
Credits
| Vorgang | Credits |
|---|---|
| Geprüfte Seite (einzelne Seite oder Seite einer Website), auch wenn sie unverändert ist | Wie derselbe Abruf als Markdown über /v2/scrape: 1 pro Seite,
JSON-Modus von changeTracking +5, verstärkter Proxy +4, PDFs pro PDF-Seite |
| Suchziel | 2 je angefangene 10 Ergebnisse jeder Suchanfrage, wie /v2/search |
| KI-Bewertung | 2 pro bewerteter Seite oder bewertetem Treffer |
| Kostenlos | Seiten mit Fehler, gesperrte Seiten, entfernte Seiten, KI-Bewertungen ohne Ergebnis, Prüfungen skipped_overlap und skipped_no_credits, E-Mails und Webhooks |
Berechnet wird Seite für Seite nach dem Abruf; das Guthaben fällt nie unter null. Reicht es vor einer Prüfung nicht für eine Seite, endet sie als
skipped_no_credits. Geht es während einer Prüfung zu Ende, werden die übrigen Seiten als Fehler ohne Kosten gespeichert. Die Überwachung bleibt aktiv
und prüft zum nächsten Termin wieder, sobald Credits da sind. Ihre Kontoadresse erhält dazu einmal pro Abrechnungszeitraum einen Hinweis.
Limits je Plan
| Plan | Prüfen höchstens | Mit Suchziel höchstens | Überwachte Seiten |
|---|---|---|---|
| Fluss | alle 15 Min. | stündlich | 500 |
| Strom | alle 15 Min. | stündlich | 2.000 |
Überwachte Seiten zählen über alle aktiven Überwachungen Ihres Kontos: bei einzelnen Seiten jede Adresse, bei einer Website ihr limit, bei einer
Suche maxResults. Darüber hinaus: 400 TOO_MANY_WATCHED_URLS. Pro Überwachung höchstens 50 Ziele,
pro Konto höchstens 200 Überwachungen. Erlaubt Ihr Plan nach einem Wechsel weniger Seiten, pausiert Ragfeed die neuesten Überwachungen, bis es
wieder passt (pausedReason: "plan_limit"), und schreibt Ihnen. Sie bleiben pausiert, bis Sie sie fortsetzen. Ohne aktiven Plan
(Abo beendet) laufen keine Überwachungen.
Regeln: robots.txt, Personen, Zugangsdaten
- robots.txt: Überwachungen halten sich an
Disallowfür RagfeedBot und*sowie anCrawl-delay. Gesperrte Seiten lehnt schon das Anlegen ab (400 ROBOTS_DISALLOWED). Sperrt eine Website später, wird die Seite als Fehler gemeldet und Sie erhalten einmal einen Hinweis. Ist die robots.txt nicht lesbar (Serverfehler, keine Antwort), wird die Seite nicht abgerufen und nicht berechnet. - Widerspruch: Websites, deren Betreiber widersprochen haben, lassen sich nicht überwachen (
403 SITE_OPTED_OUT). - Profilseiten: Profilseiten sozialer Netzwerke sind ausgeschlossen (
400 URL_NOT_ALLOWED_FOR_MONITORING, siehe Nutzungsregeln); Suchziele filtern sie aus den Treffern. Gesperrt sind:linkedin.com/in/,linkedin.com/pub/,instagram.com/,facebook.com/,fb.com/,tiktok.com/@,x.com/,twitter.com/,xing.com/profile/,threads.net/@,bsky.app/profile/(auch mit Subdomain wie www. oder m.). - Weiterleitungen: Leitet eine Seite auf eine andere Adresse weiter, gelten diese Regeln auch für das Ziel. Verbietet die robots.txt des Ziels den Abruf, hat sein Betreiber widersprochen oder ist es eine Profilseite, wird die Seite als Fehler gemeldet und nicht berechnet.
- Keine Zugangsdaten: Überwachungen speichern ihre Optionen dauerhaft. Header, deren Name nach Anmeldung aussieht (auth, cookie, token, key, secret, session, password, passwd, credential), lehnt
die API ab (
SENSITIVE_HEADER_NOT_ALLOWED), ebensoactions(ACTIONS_NOT_SUPPORTED_FOR_MONITORS) undzeroDataRetention(ZERO_DATA_RETENTION_NOT_SUPPORTED), weil eine Überwachung den letzten Stand speichern muss. Adressen mit Name und Passwort (https://name:passwort@…) lehnt sie ebenso ab (CREDENTIALS_IN_URL_NOT_ALLOWED), auch als Webhook-Adresse. Die Header Ihres Webhooks gelten Ihrem eigenen Endpunkt; sie werden gespeichert und nur als***angezeigt.
Aufbewahrung
Prüfungen mit ihren Seiten und Unterschieden löscht Ragfeed nach retentionDays: Standard 30 Tage, wählbar
1 bis 90 (mehr ergibt 400 RETENTION_TOO_LONG). Den letzten Stand jeder Seite, mit dem verglichen wird, behalten wir, solange
die Überwachung besteht; ist sie länger als 90 Tage pausiert, löschen wir ihn, und die nächste Prüfung meldet die Seiten als neu.
Protokolle der Webhook- und E-Mail-Zustellung bleiben 30 Tage. Mit dem Löschen der Überwachung ist alles weg; Details stehen in der
Datenschutzerklärung.
Mit dem Firecrawl-SDK
# pip install firecrawl-py
from firecrawl import Firecrawl
app = Firecrawl(api_key="sk-...", api_url="https://api.ragfeed.de")
monitor = app.create_monitor(
name="Preisseite",
schedule={"text": "daily at 7:00", "timezone": "Europe/Berlin"},
targets=[{"type": "scrape", "urls": ["https://example.com/"]}],
goal="Preisänderungen und neue Tarife sind wichtig, Layout und Tippfehler nicht.",
notification={"email": {"enabled": True, "includeDiffs": True}},
retention_days=60,
)
print(monitor.id, monitor.next_run_at, monitor.estimated_credits_per_month)
check = app.run_monitor(monitor.id) # sofort prüfen, außerhalb des Zeitplans
# … wenn die Prüfung fertig ist (Webhook monitor.check.completed oder ein paar Sekunden später):
for c in app.list_monitor_checks(monitor.id, limit=5):
print(c.status, c.summary.changed, c.actual_credits)
detail = app.get_monitor_check(monitor.id, check.id)
for page in detail.pages:
print(page.status, page.url, page.judgment.reason if page.judgment else "")
app.update_monitor(monitor.id, status="paused") # "active" setzt fort
app.delete_monitor(monitor.id)
Das Node.js-SDK ruft dieselben Endpunkte auf (createMonitor, runMonitor, getMonitorCheck …).
Das Python-SDK lässt Felder mit None weg; um webhook, notification oder goal zu entfernen, schicken Sie null per HTTP.
Nur bei Ragfeed (die SDKs ignorieren unbekannte Felder): POST /v2/monitor/estimate, für eine Änderung
mit ?monitorId=… (die Seiten dieser Überwachung zählen dann nicht doppelt; bei einer pausierten sagt
resumeBlocked, warum sie sich so nicht fortsetzen ließe); an der Überwachung
creditsPerCheck, checksPerMonth, estimatedCreditsPerMonthWithoutJudge,
watchedUrls und pausedReason; an jeder Seite chunkDiff und isMeaningful;
die Angaben in targetResults und webhookDeliveries an jeder Prüfung; deutsche Zeitplan-Texte; die zusätzliche
Signatur X-Webhook-Signature.
Anders als bei Firecrawl: Unveränderte Seiten senden keinen Webhook, entfernte Seiten schon. Prüfergebnisse bleiben höchstens 90 Tage. E-Mails gehen an Ihre Kontoadresse und bis zu 5 weitere bestätigte Adressen. Der kürzeste Prüfabstand hängt vom Plan ab. Browser-Aktionen und Slack gibt es in der Beta nicht, Suchziele durchsuchen das Web.
Wenn eine Seite sich sperrt
- robots.txt: Crawl und Map überspringen gesperrte Pfade und halten
Crawl-delayein. Übersprungene Adressen stehen inGET /v2/crawl/{id}/errors. Einzelabrufe per Scrape beachten nurCrawl-delay. - Widerspruch des Betreibers: Domains, deren Betreiber bei uns widersprochen haben, liefern für alle Kunden
403 SITE_OPTED_OUT, auch nicht aus dem Zwischenspeicher. - Schutz vor automatischen Abrufen: Sperrt eine Seite den Abruf, steht der Grund in
metadata.errorund inwarning. Berechnet wird dann nichts, KI-Formate laufen nicht. Logins, Bezahlschranken und CAPTCHAs umgehen wir nicht. - Archiv: Gibt es von der gesperrten Seite eine öffentliche Aufnahme bei Common Crawl, liefert Ragfeed diese. Sie erkennen das an
metadata.archivedmitsourceundcapturedAtsowie an einem Hinweis inwarning. Prüfen Sie das Aufnahmedatum, bevor Sie den Inhalt als aktuell behandeln.
Eigene Zugangsdaten: Für Seiten, auf die Sie berechtigt sind, können Sie headers und Eingaben per actions mitschicken.
Header wie Authorization, Cookie oder API-Keys und Eingaben aus write-Aktionen halten wir bei Crawl, Batch und Extract
nur im Arbeitsspeicher; gespeichert wird ***. Zugangsdaten bitte nie in die Adresse selbst schreiben.
Startet unser Server während eines Auftrags neu, bricht der Auftrag mit einer Meldung ab und muss neu gestartet werden.
Integrationen
| Werkzeug | So verbinden Sie Ragfeed |
|---|---|
| Claude und andere MCP-Programme | Konnektor-Adresse https://api.ragfeed.de/mcp, Anmeldung per OAuth ohne API-Key (alternativ Key im Header
Authorization). Claude Code: claude mcp add --transport http ragfeed https://api.ragfeed.de/mcp. Über den Konnektor legt Claude auch
Überwachungen Beta an, ändert sie und liest ihre Ergebnisse. Anleitung: Ragfeed in Claude |
| n8n | Firecrawl-Knoten mit Basis-URL https://api.ragfeed.de/v2 oder HTTP-Request-Knoten auf /v2/scrape.
Anleitung mit Vorlagen: Webseiten in n8n abrufen |
| Make | Modul „HTTP – Make a request“ mit Header Authorization: Bearer sk-… |
| Überwachung Beta in n8n oder Make | Einen Webhook-Baustein (n8n „Webhook“, Make „Custom webhook“) als webhook.url
der Überwachung eintragen; jede Meldung monitor.page startet dann Ihren Ablauf. Signatur prüfen: Meldungen per Webhook |
| Dify | Wissensdatenbank mit der Datenquelle Firecrawl, Basis-URL https://api.ragfeed.de |
| LangChain | Chunks mit "shape": "langchain" direkt als Document(**chunk); der FireCrawlLoader nimmt die Basis-URL als api_url |
| LlamaIndex | Chunks mit "shape": "llamaindex" als TextNode(**chunk) |
Anleitungen Schritt für Schritt: So funktioniert's, Einbindung
Im Firmennetz
- Freigabe: ausgehend HTTPS (Port 443) zu
api.ragfeed.de, für Konto und Dashboard zuragfeed.de. Bitte nach Hostname freigeben; die IP-Adressen können wechseln. - Proxy: Python-Bibliotheken wie requests und httpx nutzen die Umgebungsvariablen
HTTPS_PROXYundNO_PROXY. In Node.js hängt es von der Bibliothek ab; das eingebautefetchnutzt den Proxy ab Node 22.21 bzw. 24.5 mitNODE_USE_ENV_PROXY=1.
TLS-Inspektion: Zertifikat Ihrer Firma einbinden
Prüft Ihre Firewall verschlüsselte Verbindungen (TLS-Inspektion), braucht Ihr Programm das Zertifikat Ihrer Firma:
# Bash – Python (requests und httpx; firecrawl-py nutzt beide, also beide setzen) export REQUESTS_CA_BUNDLE=/pfad/zu/ca-paket.pem export SSL_CERT_FILE=/pfad/zu/ca-paket.pem # Bash – Node.js (wird beim Programmstart gelesen) export NODE_EXTRA_CA_CERTS=/pfad/zu/firmen-ca.pem # PowerShell (Windows) $env:REQUESTS_CA_BUNDLE="C:\pfad\ca-paket.pem" $env:SSL_CERT_FILE="C:\pfad\ca-paket.pem" $env:NODE_EXTRA_CA_CERTS="C:\pfad\firmen-ca.pem"
REQUESTS_CA_BUNDLE und SSL_CERT_FILE ersetzen die mitgelieferten Zertifikate: Die Datei muss also auch die öffentlichen
Zertifizierungsstellen enthalten (Firmenzertifikat angehängt). NODE_EXTRA_CA_CERTS ergänzt nur, dort genügt das Firmenzertifikat.
Meldungen per Webhook prüfen Sie über ihre Signatur, nicht über die Absender-Adresse: Webhooks.
Konto
GET /v2/team/credit-usage verbleibende Credits GET /v2/team/credit-usage/historical Verbrauch pro Monat GET /v2/team/queue-status laufende Aufträge
Fehlercodes
| HTTP | Bedeutung |
|---|---|
| 400 | Ungültige Anfrage (Details im Feld details) |
| 401 | API-Key fehlt oder ist ungültig |
| 402 | Guthaben aufgebraucht (insufficient_credits) |
| 403 | Ziel-URL nicht erlaubt (z. B. interne Adressen) |
| 403 | SITE_OPTED_OUT: Der Betreiber der Website hat widersprochen |
| 413 | FILE_TOO_LARGE: Datei für /v2/parse größer als 25 MB |
| 415 | UNSUPPORTED_DOCUMENT: Dateityp wird nicht unterstützt |
| 422 | LLM_OUTPUT_TOO_LONG: KI-Antwort zu lang; weniger Felder anfragen oder das Schema aufteilen |
| 408 | Zeitüberschreitung beim Laden der Seite |
| 429 | RATE_LIMIT_EXCEEDED: zu viele Anfragen pro Minute für Ihren Plan (siehe Limits) |
| 501 | SEARCH_NOT_CONFIGURED, LLM_NOT_CONFIGURED, MONITORING_NOT_ENABLED: Funktion auf diesem Server nicht eingerichtet |
| 5xx | Zielseite nicht erreichbar oder interner Fehler. Einfach erneut versuchen. |
Fehlercodes der Überwachung Beta
| HTTP | Bedeutung |
|---|---|
| 400 | INVALID_SCHEDULE, SCHEDULE_TOO_FREQUENT: Zeitplan ungültig oder enger, als Ihr Plan erlaubt (Überwachung) |
| 400 | TOO_MANY_WATCHED_URLS, TOO_MANY_TARGETS, TOO_MANY_MONITORS, TOO_MANY_RECIPIENTS:
Grenze der Überwachung erreicht (Limits) |
| 400 | GOAL_REQUIRED: Suchziel ohne goal; RETENTION_TOO_LONG: mehr als 90 Tage;
RECIPIENT_NOT_ALLOWED: Wegwerfadresse als Empfänger |
| 400 | URL_NOT_ALLOWED_FOR_MONITORING: Profilseite eines sozialen Netzwerks; ROBOTS_DISALLOWED: robots.txt verbietet die Seite |
| 400 | SENSITIVE_HEADER_NOT_ALLOWED, ACTIONS_NOT_SUPPORTED_FOR_MONITORS, ZERO_DATA_RETENTION_NOT_SUPPORTED:
Option, die eine Überwachung nicht speichern darf (Regeln) |
| 400 | CREDENTIALS_IN_URL_NOT_ALLOWED: Adresse mit Name und Passwort (https://name:passwort@…), auch als Webhook-Adresse |
| 403 | MONITOR_TERMS_REQUIRED: Ergänzende Bedingungen für die Überwachung noch nicht angenommen (Dashboard) |
| 404 | MONITOR_NOT_FOUND, CHECK_NOT_FOUND: Überwachung oder Prüfung gibt es nicht (mehr) |
| 409 | CHECK_ALREADY_RUNNING: Diese Überwachung (oder eine andere manuelle Prüfung Ihres Kontos) prüft gerade |
Alle Fehler haben die Form {"success": false, "error": "…", "code": "…"}. Die älteren /v1/*-Endpunkte werden ebenfalls unterstützt.