A developer building a RAG pipeline needs an ingestion layer that handles the full input surface: web pages, PDFs, DOCX files, spreadsheets, and other document types, all returned as clean, structured, LLM-ready output. Tavily is a search and extraction tool. Its search endpoint returns ranked results with snippets, and its Extract, Crawl, and Map endpoints return page content from the web. That works well for query-time retrieval, but it does not cover file ingestion, document conversion, or the structured chunking a vector store needs at index time. When you need to ingest a PDF or convert a DOCX, you add a second tool, with its own key, schema, and failure modes. EnConvert is a REST API and MCP server with dedicated endpoints for web scraping, file ingestion, document conversion, and summarisation, all returning consistent LLM-ready output, so one ingestion layer covers the full RAG input surface without stitching tools together.
Best Tavily Alternative for RAG Pipeline Ingestion
EnConvert is a Tavily alternative for RAG pipeline ingestion that covers web pages, PDFs, DOCX, conversion, and summarisation behind one API and one schema
Get API keyExample
import json
import os
import time
import requests
from langchain_core.documents import Document
ENCONVERT_API_KEY = os.environ["ENCONVERT_API_KEY"]
HEADERS = {"X-API-Key": ENCONVERT_API_KEY}
# Step 1: Upload the PDF and submit an ingestion job (the form field is "files")
with open("/path/to/your/report.pdf", "rb") as f:
upload = requests.post(
"https://api.enconvert.com/v2/ingest/files",
headers=HEADERS,
files={"files": ("report.pdf", f, "application/pdf")},
timeout=60,
)
upload.raise_for_status()
job_id = upload.json()["job_id"]
# Step 2: Poll until the job completes
while True:
poll = requests.get(
f"https://api.enconvert.com/v2/ingest/{job_id}",
headers=HEADERS,
timeout=30,
)
poll.raise_for_status()
job = poll.json()
if job["status"] == "completed":
output_url = job["output_url"]
break
if job["status"] in ("failed", "canceled"):
raise RuntimeError(job.get("error_message") or f"Ingest job {job['status']}")
time.sleep(2)
# Step 3: Download the JSONL (a signed URL valid for 15 minutes; plain GET, no API key)
jsonl = requests.get(output_url, timeout=60)
jsonl.raise_for_status()
# Step 4: Load each chunk as a LangChain document
documents = []
for line in jsonl.content.decode("utf-8").split("\n"):
if not line.strip():
continue
chunk = json.loads(line)
metadata = chunk["metadata"]
# headings_path is a list; most vector stores accept only scalar metadata values
metadata["headings_path"] = " > ".join(metadata["headings_path"])
documents.append(Document(page_content=chunk["content"], metadata=metadata))
print(f"Loaded {len(documents)} chunks ready for embedding")
# vector_store.add_documents(documents)
What you get back
Capability | EnConvert | Tavily |
|---|---|---|
Web page extraction | Perceive: any URL to clean Markdown, including JavaScript-rendered pages; Ingest also accepts URL lists, sitemaps, and website crawls returning the same JSONL chunk schema as file ingestion | Confirmed: Extract returns page content as Markdown or text; Crawl and Map for site traversal |
File ingestion (PDF, DOCX, XLSX) | Confirmed: Ingest accepts PDF, DOCX, XLSX, CSV, Markdown, and plain text; chunks split at H1 to H3 boundaries, 512 word soft cap, tables and code blocks kept whole | Not documented as a file upload ingestion pipeline |
Document conversion | Confirmed: Convert covers 45+ conversion routes across documents, images, and data formats | Not documented |
RAG-ready chunked output | Ingest returns chunks split at H1 to H3 heading boundaries, 512 word default soft cap, tables and code blocks kept whole even when they exceed the cap; each chunk carries headings_path, section, chunk_index, and word_count | Not documented: no equivalent index-time file ingestion pipeline producing chunked JSONL |
Summarisation endpoint | Distill: any URL or file to a clean summary in one call | Not documented as a dedicated URL or file summarisation endpoint |
MCP server | Native, exposes full ingestion toolkit as MCP tools | Confirmed: official hosted remote MCP server for search and retrieval tools |
Free tier | 500 ops per month, no card required | 1,000 credits per month |
WHY ENCONVERT FOR RAG PIPELINES
A dedicated ingestion layer means EnConvert handles the full input surface at index time and returns the same structured output for every document type. Web pages and files go through one API and arrive in one schema, so the code that loads your vector store does not branch by source type. You do not combine a search tool with separate file parsers and your own chunking logic.