Developer quickstart
Base URL https://api.ragfeed.de. Authenticate with Authorization: Bearer sk-… – keys always
start with sk-. The full interactive reference is at /docs (field descriptions partly in German).
Quickstart
- Get a key. Sign up with your e-mail address at /signup (German form: enter your address, click the confirmation link). Your key is shown once and never sent by e-mail.
- First request.
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"]}'Response{ "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 } } } - Keep going. Switch existing Firecrawl code (below), get chunks for your vector database (formats) or connect a tool without code (integrations).
Existing Firecrawl code: change one line
The API is compatible with the open-source SDKs firecrawl-py and @mendable/firecrawl-js. Set
api_url / apiUrl to https://api.ragfeed.de and use your Ragfeed key; the rest of your code stays.
Python:
# pip install firecrawl-py
from firecrawl import Firecrawl
app = Firecrawl(api_key="sk-...", api_url="https://api.ragfeed.de") # the only change
doc = app.scrape("https://example.com", formats=["markdown"])
Node.js:
// npm i @mendable/firecrawl-js
import Firecrawl from "@mendable/firecrawl-js";
const app = new Firecrawl({ apiKey: "sk-...", apiUrl: "https://api.ragfeed.de" }); // the only change
const doc = await app.scrape("https://example.com", { formats: ["markdown"] });
The official SDKs don't know llmMarkdown and chunks and may reject them before sending –
use plain HTTP for those two formats.
Formats: llmMarkdown and chunks
llmMarkdown– Markdown of the main content with a header (title, URL, language, fetch time, token count); link targets as a numbered list at the end, images as alt text only.chunks– the page split along its headings into ready records for a vector database. Each chunk has a stable UUID (same page + position = same id, so re-fetching overwrites instead of duplicating), the heading path,textandembedText, token count, hash and flat metadata that fits Pinecone, Qdrant, Weaviate, Milvus, Chroma and pgvector. You create the vector with your own embedding model.
{
"url": "https://example.com/guide",
"formats": ["llmMarkdown", {"type": "chunks", "model": "openai-3", "profile": "balanced"}]
}
| Option | Effect |
|---|---|
model | Your embedding model: openai-3, mistral-embed, multilingual-e5, bge-m3,
jina-v3, cohere-v3, gemini. Every chunk then fits its input window. |
profile | balanced (500 tokens, default), precise (250), broad (1,000) |
maxTokens, overlap | Upper limit per chunk (100 to 4,000) and tokens repeated from the previous chunk |
context | What embedText puts before the text: title, headings, description. Default: nothing. |
metadata | Up to 20 own fields per chunk, e.g. category or tenant for filtering |
idNamespace | Own namespace for ids, so the same page gets different ids in different projects |
shape | langchain → Document(**chunk), llamaindex → TextNode(**chunk) |
Both formats cost no extra credits.
Endpoints
Firecrawl API v2; the v1 paths work as well.
| Endpoint | What for |
|---|---|
POST /v2/scrape | One page as Markdown, llmMarkdown, chunks, HTML, links, screenshot or JSON. JavaScript is rendered, PDFs come back as text. |
POST /v2/crawl | Whole sites incl. sitemap, with path filters, depth limit and per-page webhooks |
POST /v2/batch/scrape | Many URLs in one job |
POST /v2/map | All URLs of a domain, optionally ranked by a search term |
POST /v2/search | Web search, optionally with the results fetched |
POST /v2/extract | Structured data following your JSON schema, also across many pages |
POST /v2/parse | Document upload: PDF, Office, OpenDocument, EPUB, CSV |
POST /v2/monitor | Monitoring Beta, from plan Fluss: check pages on a schedule and report changes, incl. which chunks changed |
Integrations
| Tool | How |
|---|---|
| Claude / any MCP client | https://api.ragfeed.de/mcp, OAuth 2.1 with dynamic client registration, or your API key as Bearer.
Claude Code: claude mcp add --transport http ragfeed https://api.ragfeed.de/mcp |
| n8n | Official Firecrawl node, credential Base URL https://api.ragfeed.de/v2 + your sk- key – or an HTTP Request node on /v2/scrape |
| LangChain | FireCrawlLoader(api_url=…); chunks with "shape": "langchain" → Document(**chunk) |
| LlamaIndex | Chunks with "shape": "llamaindex" → TextNode(**chunk) |
| Dify | Knowledge base, data source Firecrawl, base URL https://api.ragfeed.de |
| Make | “HTTP – Make a request” with header Authorization: Bearer sk-… |
Limits and credits
| Plan | Credits / month | Concurrent requests | Requests / min | Price / month |
|---|---|---|---|---|
| Quelle (free) | 1,000 | 2 | 10 | €0 |
| Bach | 5,000 | 5 | 60 | €9 |
| Fluss | 100,000 | 15 | 300 | €49 |
| Strom | 500,000 | 30 | 600 | €199 |
A page costs 1 credit (Markdown, llmMarkdown, chunks, HTML, links, screenshot), every AI format 5 credits extra. Failed pages cost nothing.
GET /v2/team/credit-usage returns your remaining credits. Over the per-minute limit you get
429 RATE_LIMIT_EXCEEDED with the wait time; out of credits, 402.
What's not supported
Formats branding, audio, video; persistent browser sessions. Sites that block
data-centre traffic stay blocked – we don't bypass logins, paywalls or CAPTCHAs. No SLA.
More (German)
The full German documentation covers crawl options, webhooks, document parsing, zero data retention and the monitoring beta with
chunkDiff: /entwickler.