---
title: "Extract Intercom Articles into LlamaIndex | EnConvert"
description: "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"
canonical: "https://www.enconvert.com/solutions/extract-intercom-articles-into-llamaindex-enconvert"
locale: "en"
---

# How to Summarise Intercom Articles with LlamaIndex

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.

## Example

```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"]}

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?"))
```

## Output

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.

## Get started

[Get free API key — 500 ops per month, no card required](https://www.enconvert.com/auth?mode=signup)

## Related solutions

- [How to Scrape Wikipedia with LlamaIndex](https://www.enconvert.com/solutions/scrape-wikipedia-with-llamaindex-enconvert.md)
- [How to Ingest Markdown into LangChain with EnConvert](https://www.enconvert.com/solutions/ingest-markdown-into-langchain-with-heading-context.md)
- [Best JigsawStack Alternative for Structured Data Extraction](https://www.enconvert.com/solutions/jigsawstack-alternative-for-structured-data-enconvert.md)
- [How to Ingest Audio Transcripts into Qdrant with EnConvert](https://www.enconvert.com/solutions/ingest-audio-transcripts-into-qdrant-enconvert-api.md)
- [How to Ingest a CSV into pgvector Without Losing Row Context](https://www.enconvert.com/solutions/ingest-csv-into-pgvector-with-row-context-enconvert-api.md)
- [How to Ingest CSV into CrewAI with EnConvert](https://www.enconvert.com/solutions/ingest-csv-into-crewai-with-enconvert.md)
