Instagram Comment Export: Methods, Tools, and Workflows

You need to analyze a campaign, preserve a brand's comment history, or collect public feedback for research. The comments are visible in Instagram, but visibility doesn't mean they're easy to retrieve, structure, or reuse. Copying them manually loses thread relationships and metadata, while the wrong API or scraper can produce incomplete data, throttling, or a policy problem.
Instagram comment export isn't one tool decision. It's three different jobs: archiving information from your own account, pulling comments from media owned by a Business or Creator account you control, or researching posts published by someone else. Each job has a different access model, output format, and risk profile.
Table of Contents
- Which Instagram Comment Export Path Fits Your Job
- Using Instagram's Built-In Download for Your Own Comments
- Exporting Comments Through the Instagram Graph API
- Third-Party APIs and Scrapers for Posts You Do Not Own
- Shaping Instagram Comment Export Output Into CSV and JSON
- Rate Limits and Policy Constraints You Must Plan Around
- Picking the Right Workflow and Avoiding Costly Mistakes
Which Instagram Comment Export Path Fits Your Job
Start by identifying whose data you need and whether the workflow must run repeatedly.

Archive your own account
If you want a personal archive of comments you've posted and comments associated with your own posts, Instagram's built-in Download Your Information process is the appropriate starting point. Meta's help documentation describes a machine-readable export in HTML or JSON that can include comments, and the request can be made through Accounts Centre or Instagram settings. The export is account-scoped, which makes it useful for preservation and personal review, not for targeting arbitrary posts.
For a one-time archive, this route avoids scraping entirely. You're using Instagram's first-party privacy and portability feature, so the data originates from the platform rather than from a browser session or an undocumented endpoint. The trade-off is control. You won't get a live feed, custom polling schedule, or competitor-post access.
Analyze media you own
If you manage a professional Instagram account and need recurring exports for reporting, moderation, or research, the Instagram Graph API is the programmatic path. It returns structured comment data for media owned by the authenticated Business or Creator account, subject to permissions, tokens, pagination, and rate limits. You'll need an application and a pipeline that can persist cursors and recover from temporary failures.
This option works well for owned-media analytics because the access boundary matches the business relationship. It doesn't solve competitor monitoring. The official route doesn't provide comments from media owned by unrelated accounts, so building a script around an arbitrary post URL won't change that permission model.
Research posts you don't own
For public posts outside your account, teams typically evaluate hosted scraping APIs, browser automation, or manual sampling. You'll need to assess not only whether a tool can retrieve the comments, but also how it handles access restrictions, source disclosure, retention, deletion requests, and changes to Instagram's frontend.
A practical Instagram comment search workflow can help clarify the difference between finding public conversations and exporting them. Choose the job first, then choose the mechanism. That decision prevents the common mistake of treating an account archive, an owned-media API feed, and third-party public-post research as interchangeable tasks.
Using Instagram's Built-In Download for Your Own Comments
For an account archive, Instagram's own download flow is the cleanest option because it's first-party, account-controlled, and designed for data portability. It's not a public comment API, and it won't let you select another creator's post, but it gives you a defensible way to retrieve information associated with your account.

Request the archive
Open your Instagram profile and enter the menu. From there, go to Accounts Centre, then Your information and permissions, and choose Download your information. Instagram may expose the same control through its settings, while the desktop flow gives you a clearer export configuration screen.
Select Create export and choose the Instagram profile involved. The important choice is the information type. Select Comments when you only need comment records rather than a complete account archive. Instagram's documented flow lets users choose how much information to download and can support transferring data to a destination instead of only saving it locally, depending on the available account options. Meta's documented Instagram data-download path is the canonical reference for that first-party process.
Choose HTML or JSON
Use HTML when a person needs to inspect the archive visually. It's easier for a marketing manager to open, search, and review without writing a parser.
Choose JSON when the export will enter a data pipeline. JSON preserves machine-readable structure and is a better starting point for normalization, deduplication, and loading into a database. You can also narrow the requested date range when Instagram presents that option, which reduces unnecessary processing and makes an archive easier to audit.
The resulting package may include comments you posted and comments connected to your own posts or Reels, depending on the information selected and what Instagram makes available for the account. The historical inclusion of comments in Instagram's downloadable archive is also documented in Lifehacker's explanation of Instagram's download request, which describes the archive as including photos, comments, profile information, and more.
After you submit the request, Instagram prepares the files and provides a download notification when they're ready. Download the archive promptly, verify the files, and store the original package before transforming it.
This method has a firm boundary: it's account-scoped. You can't use it to target one hashtag, isolate a competitor's post, or create a recurring export from another creator's profile. For those jobs, you need an owned-media API workflow or a separately assessed third-party collection method.
Exporting Comments Through the Instagram Graph API
The Graph API is designed for comments on media owned by the authenticated Business or Creator account. It's the right choice when your team controls the Instagram professional account, owns the application, and needs repeatable retrieval rather than a manually requested archive.
Prepare access before writing the worker
Create a Meta app, add the Instagram Graph API product, connect the Instagram professional account to a Facebook Page, and obtain the permissions required for the operation. Use a long-lived User access token and build token renewal into deployment rather than treating authentication as a one-time setup step.
You'll also need media IDs. A post URL is useful to a person, but the comments endpoint expects an Instagram media identifier. Once you have a known ID, a request can look like this:
`GET
The exact fields available can depend on permissions, account type, and API behavior, so your parser should tolerate absent values. A response contains a data array and a paging object. Continue requesting pages through the returned cursor, typically using paging.cursors.after or the supplied next URL, until no continuation is present.
Expect nested and optional fields
A useful normalized record might look like this:
{"id":"comment-id","text":"Example comment","username":"account_name","timestamp":"2026-08-20T12:00:00+0000","like_count":3,"parent_id":null}
Replies may arrive through a nested replies edge rather than as independent top-level records. If replies matter to the analysis, expand that edge and preserve the parent relationship. Don't assume that a top-level count means the entire thread has been collected.
The verified technical guidance for this route reports a default page size of 10 comments and a maximum of 50 comments per request. A thread containing 60,000 comments therefore requires about 1,200 paginated requests at the maximum page size, before retries and backoff are considered. See this Instagram Graph API comment pagination discussion for the operational constraint and ownership boundary.
| Field | Type | Returned by Default | Notes |
|---|---|---|---|
id |
String | Usually requested | Stable comment identifier for deduplication |
text |
String | Only when requested | Preserve UTF-8 text and normalize downstream |
username |
String | Only when requested | May be absent or restricted in some responses |
timestamp |
ISO datetime | Only when requested | Convert to UTC in your normalized layer |
like_count |
Integer | Only when requested | Treat missing values as null, not automatically zero |
parent_id |
String or null | Only when requested | Links a reply to its parent comment |
For implementation details beyond comments, the Instagram API guide for developers is useful when designing media discovery, authentication, and endpoint handling. Your worker should save every raw page, persist the cursor after successful writes, and make retries idempotent.
Third-Party APIs and Scrapers for Posts You Do Not Own
The official owned-media boundary leaves a gap for researchers, agencies, and analysts examining public posts from unrelated accounts. Third-party collection methods can fill that gap, but they change the engineering and compliance equation. You're no longer using a platform-controlled export for your account. You're relying on a service or browser process that may encounter login walls, changing page structures, or access restrictions.
Compare the main options
| Path | Cost / 1K comments | Compliance posture | Best-fit use case |
|---|---|---|---|
| Hosted scraper API | Vendor-dependent | Review terms, source disclosure, retention, and opt-out handling | One-off or scheduled public-post research |
| Browser automation | Infrastructure and proxy costs vary | Highest operational and policy exposure | Custom fields and workflows unavailable through a hosted API |
| Open-source scraper | Software may be free, operations aren't | Your team owns the full compliance burden | Controlled experiments and internal research |
| Manual sampling | Staff time | Narrowest technical footprint, limited scale | Small validation sets and qualitative review |
Hosted platforms such as Apify, ScraperAPI, and Bright Data Web Unlocker wrappers handle much of the browser, proxy, and retry machinery. That reduces setup, but your data passes through another provider, so review its terms, retention controls, source documentation, and deletion process before sending production workloads. A resource such as scrape Instagram emails with Outsoci can help teams evaluate a broader Instagram scraping workflow, although comment-specific coverage still needs testing against the exact post types and fields you require.
Browser automation with Playwright, Selenium Grid, stealth profiles, or residential proxy rotation gives you schema control. It also creates more moving parts. Instagram can change DOM structures or embedded JSON contracts without notice, and login-required flows can expose the account used for collection to restrictions or bans.
Open-source projects, including Instaloader and Instagram scraper forks, can be useful for prototyping. They're not a compliance exemption, and maintenance becomes your responsibility. Treat scraped datasets as non-PII by default, then review usernames, profile IDs, and free-text comments for personal data before sharing or using them for machine-learning work.
Practical rule: Use a hosted API for an ad-hoc marketing pull, browser automation only when custom fields justify the risk, and manual sampling to validate the dataset before scaling.
The Instagram comment scraper implementation guide is a useful reference point when comparing pagination, replies, and output handling across vendors. Don't choose on speed alone. Provenance and policy documentation matter just as much as whether a tool returns a CSV.
Shaping Instagram Comment Export Output Into CSV and JSON
Different sources label the same concept differently. One response may use text, another may place content under edge.node.body, and a third may expose a vendor-specific caption-like field. Normalize immediately so downstream analysts don't build separate logic for every exporter.

Define one internal record
A practical schema uses stable names and explicit nullability:
comment_id, a string containing the Instagram or vendor comment ID.post_id, a string identifying the parent media.parent_id, a nullable string for replies.author_usernameandauthor_id, retaining both display identity and identifier when available.text, normalized to UTF-8 NFC.like_countandreply_count, stored as integers when present.created_at, represented as ISO 8601 UTC.language, using a BCP-47 value when detected.has_media, a Boolean.source, restricted tonative,graph_api, orscraper.
This schema separates collection from analysis. Sentiment labels, topic assignments, and moderation decisions belong in later tables, not in the raw export record.
Normalize before writing files
A compact pandas approach can map several likely vendor shapes into one output:
import json
import re
import unicodedata
import pandas as pd
def clean_text(value):
if value is None:
return None
value = unicodedata.normalize("NFC", str(value))
return re.sub(r"[\ud800-\udfff]", "", value)
def normalize(row, source):
node = row.get("edge", {}).get("node", row)
text = node.get("text") or node.get("body") or node.get("caption")
return {
"comment_id": str(node.get("id")) if node.get("id") else None,
"post_id": str(node.get("post_id")) if node.get("post_id") else None,
"parent_id": node.get("parent_id"),
"author_username": node.get("username") or node.get("owner", {}).get("username"),
"author_id": node.get("user_id") or node.get("owner", {}).get("id"),
"text": clean_text(text),
"like_count": node.get("like_count"),
"reply_count": node.get("reply_count"),
"created_at": node.get("timestamp") or node.get("created_at"),
"language": node.get("language"),
"has_media": bool(node.get("media")),
"source": source,
}
with open("raw-comments.json", encoding="utf-8") as f:
raw = json.load(f)
records = [normalize(item, "scraper") for item in raw]
df = pd.DataFrame(records).drop_duplicates("comment_id")
columns = ["comment_id", "post_id", "parent_id", "author_username", "author_id",
"text", "like_count", "reply_count", "created_at", "language",
"has_media", "source"]
df[columns].to_csv("comments.csv", index=False, encoding="utf-8")
df[columns].to_json("comments.ndjson", orient="records", lines=True, force_ascii=False)
Use BOM-free UTF-8 for predictable ingestion. Excel users may need careful import settings, so these CSV opening tips from CleanMyList are helpful when a spreadsheet displays encoding or delimiter problems.
Convert timestamps to UTC before deduplication, and use comment_id as the primary key. For streaming systems, line-delimited JSON is easier to append and process incrementally than a single large array. The JSON versus CSV comparison can help teams decide which format belongs at each pipeline boundary.
For a nested export where replies live under replies.data, flatten the thread with a small jq transformation such as jq -r '.. | objects | select(has("id") and has("text")) | [.id,.text,.parent_id] | @csv' raw.json.
Rate Limits and Policy Constraints You Must Plan Around
A pipeline can be technically correct and still fail because its access assumptions are wrong. The Instagram Graph API only returns comments for media owned by the authenticated Business or Creator account, and the documented technical guidance reports a default page size of 10, with 50 as the maximum per request. That means a 60,000-comment thread needs about 1,200 requests at the maximum page size, before retries or backoff, as described in the Graph API pagination reference.
Instagram's built-in download is different. It's a platform-controlled privacy and portability feature, not a separate public API product. It may include comments in a user's own package, but it doesn't grant permission to retrieve another person's information or to automate access to arbitrary public posts. That distinction should shape your retention, consent, and access controls.

Build defensive operations
Before launching a collection job:
- Persist raw pages first: Store the original response before parsing so you can reproduce transformations and investigate missing records.
- Use exponential backoff: Add jitter, respect server responses, and persist pagination cursors after successful writes.
- Separate access from analysis: Restrict raw usernames and IDs to the people who need them, and produce minimized datasets for reporting.
- Document source and purpose: Record the post URL, collection method, retrieval time, and intended use.
- Stop on abnormal failure: A kill switch should pause a job when throttling or access errors indicate that the workflow is no longer behaving normally.
Third-party scrapers add another layer of uncertainty. Unofficial browser collection may trigger soft blocks, CAPTCHA challenges, or account restrictions, and frontend changes can invalidate selectors without warning. Read the platform terms and the provider's documentation before collecting data, especially when comments contain usernames, mentions, or sensitive free text.
The API rate-limit planning guide is useful for designing queueing, retries, and concurrency controls. Rate limits aren't merely a performance concern. A policy violation can affect application access and review status, not just slow one request.
Picking the Right Workflow and Avoiding Costly Mistakes
The correct workflow follows ownership.
| Reader job | Recommended path | What to validate |
|---|---|---|
| Own-account archive | Instagram Download Your Information | Selected information, date range, file format, and original archive retention |
| Owned Business or Creator media | Instagram Graph API | App permissions, token lifecycle, media ownership, cursors, and reply expansion |
| Posts you don't own | Vetted third-party service or manual sample | Terms, provenance, public visibility, retention, and opt-out handling |
For API pipelines, make pagination resumable. Persist the cursor with the media ID and export version, and write records idempotently using comment_id as the main key. If a source can reuse IDs across contexts, combine comment_id with the normalized timestamp for a deduplication key, but keep the original identifiers available for auditing.
Retries should use jittered exponential backoff, not a fixed sleep. Read the available rate-limit headers, lower concurrency when the remaining allowance falls, and preserve failed pages for replay. A fixed cadence can still synchronize multiple workers and create a burst that the service rejects.
Store raw data as an asset
Cache raw responses in object storage using a key built from the media ID and an export or schema version. That lets you re-run normalization when your schema changes without recollecting the source. It also creates a clear distinction between the immutable raw capture and the derived CSV, JSON, or analytics tables.
Several mistakes appear repeatedly in production:
- Wrong account type: A personal account doesn't provide the same owned-media API path as a connected professional account.
- Token assumptions: Tokens expire or lose validity, so workers need explicit health checks before a large export starts.
- Reply loss: A top-level comment fetch doesn't guarantee that nested replies have been expanded.
- False completion: A
total_countvalue isn't a substitute for following pagination until the API provides no next page. - Unversioned files: Overwriting
comments.csvmakes it difficult to explain why two reports differ.
Finish every deployment with three safeguards: version each export, hash the raw archive for integrity, and run a smoke test against a known fixture before promoting the worker to production. Those checks cost little and catch schema drift, missing replies, and broken cursor handling before they reach a client report.
Captapi provides an Instagram comments endpoint that returns structured comment data, including authors, text, likes, and reply threads, for collection into analytics or spreadsheet workflows. Visit Captapi to review the API and decide whether it fits your owned-media or public-post export pipeline.