A developer building an AI agent that reads web content needs clean, LLM-ready output from a single API call, not a scraping platform organised around actors, datasets, and storage. Apify is built for scale and automation workflows, so getting a page into an agent means choosing or writing an Actor, managing runs, and reading results from a dataset or key-value store before the agent sees any content. For an AI engineer who needs one URL turned into Markdown for a RAG pipeline or a context window, that is real overhead for a task that should be one request. EnConvert is a single REST endpoint that takes a URL and returns clean, LLM-ready Markdown, with no Actor selection, no dataset management, and no storage layer, so the content is ready to pass into an agent or vector store in one call.
Best Apify Alternative for Agentic Web Scraping
EnConvert is an Apify alternative for agentic web scraping that turns a URL into clean LLM-ready Markdown in one API call without actors or datasets
Get API keyExample
import os
import requests
from apify_client import ApifyClient # apify-client 3.x needs Python 3.11+
PAGE_URL = os.environ["PAGE_URL"] # the web page URL to turn into Markdown
# Step 1: Apify - pick an Actor, start a run, wait, read the dataset
apify = ApifyClient(os.environ["APIFY_API_TOKEN"])
run = apify.actor("apify/website-content-crawler").call(
run_input={
"startUrls": [{"url": PAGE_URL}],
"maxCrawlDepth": 0, # crawl only the start URL
"maxCrawlPages": 1,
"saveMarkdown": True,
}
)
if run is None or run.status != "SUCCEEDED":
raise RuntimeError(f"Apify run did not succeed for {PAGE_URL}")
items = apify.dataset(run.default_dataset_id).list_items().items
if not items:
raise RuntimeError(f"Apify returned no dataset items for {PAGE_URL}")
apify_markdown = items[0]["markdown"] # field name is specific to this Actor
# Apify also offers a synchronous endpoint that returns dataset items
# in one HTTP call (300 second limit), but Actor selection and per-Actor
# input/output field names still apply.
# Step 2: EnConvert - one POST to Perceive, then download the Markdown
response = requests.post(
"https://api.enconvert.com/v2/perceive",
headers={
"X-API-Key": os.environ["ENCONVERT_API_KEY"],
"Content-Type": "application/json",
},
json={
"url": PAGE_URL,
"outputs": ["markdown"],
"only_main_content": True,
},
timeout=60,
)
response.raise_for_status()
perceived = response.json()
# A blocked page or failed render comes back without a markdown output
if perceived.get("error") or "markdown" not in perceived.get("outputs", {}):
raise RuntimeError(
f"Perceive failed for {PAGE_URL}: "
f"{perceived.get('error') or perceived.get('warnings')}"
)
# The Markdown is a signed artifact URL (valid 15 minutes). Plain GET, no API key.
content_response = requests.get(perceived["outputs"]["markdown"]["url"], timeout=60)
content_response.raise_for_status()
enconvert_markdown = content_response.text
# Both results are plain Markdown strings, ready for an agent context or vector store
print(f"Apify: {len(apify_markdown)} characters of Markdown")
print(f"EnConvert: {len(enconvert_markdown)} characters of Markdown")
print(enconvert_markdown)
What you get back
Capability | EnConvert | Apify |
|---|---|---|
Setup required | API key and one endpoint | Account, API token, Actor selection, and per-Actor input configuration |
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 | Actor required; options range from HTTP-only to full browser-based crawlers |
LLM-ready output | Consistent Markdown schema across all endpoints | Actor dependent; several store Actors output Markdown, with field names that vary by Actor |
File ingestion (PDF, DOCX, XLSX) | Ingest: 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 | Actor required; availability depends on the Actor chosen |
Document conversion | Convert: 45+ conversion routes across documents, images, and data formats | Actor required |
Summarisation endpoint | Distill: any URL or file to a clean summary in one call | Not a platform endpoint; Actor required |
MCP server | Native, exposes full ingestion toolkit as MCP tools | Hosted MCP server that exposes Actors as tools |
Free tier | 500 ops per month, no card required | Free plan with monthly platform credit |
WHY ENCONVERT FOR AGENTIC WEB SCRAPING
A direct API means one call returns Markdown your agent can use immediately, and there is no platform layer to manage between the request and the content. The same API covers file ingestion and summarisation, so the integration does not change when your agent’s input surface grows beyond web pages. When the pipeline scales, every endpoint returns the same schema, so the code that handles Perceive output also handles Ingest output without branching.