A developer building a LlamaIndex pipeline that reads Airtable support articles or public documentation pages needs structured page data before passing it into a retrieval layer. Airtable support pages mix article content with navigation, sidebars, and related article links, and scraping them by hand requires CSS selectors that break when Airtable updates its theme. EnConvert Distill accepts up to 50 Airtable page URLs and a schema, then returns a results array normalised to exactly that schema in one synchronous call. The extracted content is ready to pass into LlamaIndex TextNode objects and a VectorStoreIndex with no HTML parsing.
How to Summarise Airtable with LlamaIndex
Use EnConvert Distill to extract structured data from Airtable support pages into a LlamaIndex pipeline from up to 50 URLs in one synchronous API call
Get API keyExample
python
import os
import requests
from llama_index.core import VectorStoreIndex
from llama_index.core.schema import TextNode
BASE_URL = "https://api.enconvert.com/v2"
headers = {
"X-API-Key": os.environ["ENCONVERT_API_KEY"],
"Content-Type": "application/json",
}
article_urls = [url.strip() for url in os.environ["AIRTABLE_ARTICLE_URLS"].split(",")] # public Airtable support or documentation page URLs
response = requests.post(
f"{BASE_URL}/distill",
headers=headers,
json={
"urls": article_urls,
"schema": {
"title": "The support article or documentation page title",
"body": "The main article content, excluding navigation and related article links",
"category": "The Airtable support category containing the article",
"product_area": "The Airtable product, feature, or workflow covered",
"last_updated": "The last updated date shown on the page, if available",
},
},
timeout=120,
)
if response.status_code == 402:
raise RuntimeError("Distill requires a paid plan")
response.raise_for_status()
# Each article is one unit — build TextNodes directly and skip the default splitter
nodes = []
for result in response.json()["results"]:
if result["status"] != "completed":
print(f"Skipped {result['url']}: {result['status']}")
continue
rq = result.get("render_quality", 1.0)
if rq < 0.5:
print(f"Low render quality for {result['url']}: {rq}")
continue
data = result.get("data") or {}
nodes.append(
TextNode(
text=f"{data.get('title')}\n\n{data.get('body')}",
id_=result["url"],
metadata={
"source_url": result["url"],
"title": data.get("title"),
"category": data.get("category"),
"product_area": data.get("product_area"),
"last_updated": data.get("last_updated"),
},
)
)
if not nodes:
raise RuntimeError("No Airtable pages passed the extraction checks")
# LlamaIndex's default embedding model and LLM read OPENAI_API_KEY from the environment
index = VectorStoreIndex(nodes)
query_engine = index.as_query_engine(similarity_top_k=3)
print(query_engine.query("Which Airtable product areas do these articles cover, and what does each one explain?"))
What you get back
Distill returns a results array with one entry per URL, each holding a data object normalised to the schema’s keys, regardless of the surrounding navigation or Airtable theme. Scraping Airtable support pages by hand requires CSS selectors that break when Airtable updates its theme, and passing raw page HTML into LlamaIndex fills the context with navigation and boilerplate that reduces retrieval precision.
Distill runs on paid plans only, and the free tier returns a 402 for this endpoint, so the free key covers EnConvert’s other endpoints.