How to Scrape Jira with AutoGen

Learn how to scrape Jira with AutoGen using EnConvert Distill to turn any Jira issue URL into a clean LLM-ready summary without custom parsing logic

Get API key

Developers who scrape Jira with AutoGen hit a wall fast. Jira’s API returns structured JSON with nested fields, markup-heavy description bodies, and comment threads that require parsing and normalisation before any LLM can reason over them. Preprocessing ticket bodies, stripping Atlassian Document Format markup, flattening comment threads, and writing glue code that breaks every time a ticket schema varies — all of that sits between the Jira API and a working agent. EnConvert Distill removes that step: pass a Jira page URL and get back a clean, LLM-ready summary in one API call, ready to inject directly into an AutoGen agent’s context.

Example

python
import asyncio
import os

import requests
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient

JIRA_ISSUE_URL = "https://your-domain.atlassian.net/browse/PROJ-123"

# Step 1: Submit the Jira issue URL to Enconvert Distill
response = requests.post(
    "https://api.enconvert.com/v2/distill",
    headers={
        "X-API-Key": os.environ["ENCONVERT_API_KEY"],
        "Content-Type": "application/json",
    },
    json={
        "urls": [JIRA_ISSUE_URL],
        "schema": {
            "summary": "one-paragraph summary of the issue",
            "problem": "the main problem described in the issue",
            "blockers": "list of blockers mentioned, if any",
            "next_actions": "list of next actions or open tasks",
        },
    },
    timeout=60,
)
response.raise_for_status()

# Step 2: Extract the structured data from the response
item = response.json()["results"][0]
if item.get("error") or not item.get("data"):
    raise RuntimeError(f"Distill failed for {JIRA_ISSUE_URL}: {item.get('error')}")
summary = item["data"]

print("Jira issue summary:")
print(summary)


# Step 3: Pass the extracted data into an AutoGen agent's context
async def main() -> None:
    model_client = OpenAIChatCompletionClient(
        model="gpt-4.1",
        api_key=os.environ["OPENAI_API_KEY"],
    )
    agent = AssistantAgent(
        name="jira_issue_agent",
        model_client=model_client,
        system_message=(
            "You analyse Jira issues. Use the supplied issue "
            "summary to identify the problem, blockers, and "
            "next actions. Do not invent missing details."
        ),
    )
    result = await agent.run(
        task=(
            "Analyse this Jira issue summary and identify "
            "the main problem, blockers, and next actions.\n\n"
            f"Source: {JIRA_ISSUE_URL}\n\n"
            f"Summary:\n{summary}"
        )
    )
    print(result.messages[-1].content)
    await model_client.close()


if __name__ == "__main__":
    asyncio.run(main())

What you get back

Jira API raw output

EnConvert Distill output

Structured JSON with nested fields

Clean text summary, single field

Atlassian Document Format markup in description bodies

Markup stripped, prose only

Comment threads as separate paginated objects

Comments consolidated into summary where relevant

Attachment metadata with no content

Attachment content included if accessible

Requires parsing, flattening, and normalisation

Ready to pass directly into agent context

AutoGen agents that need to reason over Jira content do not need custom parsing logic when EnConvert Distill is in the pipeline. Any Jira issue URL becomes an LLM-ready summary in one API call, with the same output structure regardless of ticket type, project, or schema variation. The agent receives clean text and can act on it immediately.

Get free API key — 500 ops per month, no card required.