A developer building a LlamaIndex pipeline over an Intercom help centre needs structured article data, meaning title, body, category, and tags, before passing it into a retrieval layer or agent. Intercom help centre pages mix the article with navigation, sidebars, and related article widgets, and scraping them by hand means maintaining CSS selectors that break when Intercom updates its theme. EnConvert’s Distill endpoint takes up to 50 Intercom article URLs and a schema defining the fields you need, and returns a results array with each URL’s extracted data normalised to exactly that schema in one synchronous call. The developer gets structured article data ready to pass into a LlamaIndex Document or VectorStoreIndex, with no HTML parsing or preprocessing.
How to Summarise Intercom Articles with LlamaIndex
Use EnConvert Distill to pull structured Intercom help centre article data into a LlamaIndex pipeline from up to 50 URLs in one call with no HTML parsing
Get API keyExample
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"]}
article_urls = [url.strip() for url in os.environ["INTERCOM_ARTICLE_URLS"].split(",")] # public Intercom Help Center article URLs
# One synchronous call: no job_id, no polling, no download step
response = requests.post(
f"{BASE_URL}/distill",
headers=headers,
json={
"urls": article_urls,
"schema": {
"title": "The article title",
"body": "The full article body text",
"category": "The help centre collection or category the article belongs to",
"tags": "The article's tags or labels, as a list",
},
},
timeout=120, # increase for larger batches
)
# Distill is available on paid plans only, and the free tier returns 402
if response.status_code == 402:
raise RuntimeError("Distill requires a paid plan")
response.raise_for_status()
# Failed pages come back as rows with a failed status, not as errors
nodes = []
for result in response.json()["results"]:
if result["status"] != "completed":
print(f"Skipped {result['url']}: {result['status']}")
continue
if result.get("render_quality", 1.0) < 0.5:
# a low score can mean a challenge page or login wall
print(f"Low render quality for {result['url']}: {result['render_quality']}")
continue
data = result.get("data") or {} # keys match schema exactly: title, body, category, tags
tags = data.get("tags")
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"),
"tags": ", ".join(tags) if isinstance(tags, list) else str(tags),
"render_quality": result.get("render_quality", 1.0),
},
)
)
# Each article is one unit — build nodes directly and skip the default splitter
# 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("How does a customer change their billing details?"))
What you get back
Distill returns a results array with one entry per URL, each containing a data object normalised to exactly the schema’s keys, which are title, body, category, and tags, regardless of the page’s surrounding navigation or Intercom theme. Scraping Intercom help centre pages by hand needs CSS selectors that break when Intercom 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.