Every Instagram analysis that goes beyond "scroll and screenshot" starts the same way: export Instagram comments to CSV. A CSV is the lowest common denominator — Excel opens it, Google Sheets imports it, pandas and R read it in one line, Looker Studio and Power BI treat it as a table. Once the comment section of a post is a CSV, every question about it (who comments most, what language the audience writes in, which hour of the day the replies land, which comment the creator pinned) becomes a sort or a pivot instead of a scrolling session.
This guide is the practical, column-by-column version. It covers what an Instagram comment CSV actually contains, four ways to produce one, the one Excel gotcha that silently corrupts your data, and how to load the file into the tools people really use. If you only need one takeaway: paste the post URL into the Instagram comment exporter, download CSV, and import it via Data → From Text/CSV with the ID columns set to Text.
What an Instagram comment CSV contains
A useful comment CSV has one row per comment and stable, machine-friendly column names. Here is the exact layout the ZocialComment exporter produces (the same header set is used for XLSX; JSON nests the same fields):
| Column | Type | What it holds | Typical use |
|---|---|---|---|
author | text | Display name of the commenter | Human-readable label in reports |
username | text | Instagram handle (without @) | Group by commenter, find repeat commenters, build a giveaway entry list |
avatar_url | URL | Profile picture link at export time | Dashboards, influencer shortlists |
text | text | The full comment, emoji and line breaks preserved | Sentiment, keyword search, word clouds |
likes | integer | Likes on the comment | Sort to surface the comments the audience agreed with |
replies | integer | Number of replies under the comment | Find the comments that started conversations |
created_at | ISO 8601 | When the comment was posted (UTC) | Time-of-day and velocity charts |
language | ISO code | Detected language of the text | Audience geography proxy, filter for translation |
is_pinned | boolean | Whether the creator pinned it | Separate creator curation from organic ranking |
id | text (long integer) | Instagram's comment ID | Deduplicate across re-exports, join to replies |
reply_to_id | text (long integer) | Parent comment id for replies, blank for top-level | Rebuild threads |
After those eleven core columns come the raw platform fields Instagram returned that are not already represented — things like user_id, is_verified, has_liked_comment, share_enabled and thread flags — converted to snake_case. You will rarely need them, but they are there so nothing is thrown away between Instagram and your spreadsheet.
The two columns people underestimate are language and reply_to_id. Language turns a comment dump into a rough audience-geography map without any profile scraping (a Reel whose comments are 40% Bahasa Indonesia and 25% Portuguese tells you where the audience is). reply_to_id is what lets you separate a creator's replies from fan replies and measure which top-level comments actually generated discussion.
Four ways to get Instagram comments into a CSV
1. A comment exporter (paste URL → download)
The fastest path and the one that works on posts you do not own. Open the Instagram comment exporter, paste the URL of any public post or Reel, and download the finished job as CSV, XLSX or JSON. The first 100 comments of a post are free with no signup; the $14 3-Day Pass covers unlimited posts at up to 10,000 comments each, pay-per-export is $1 per 100 comments (minimum $3), and Pro passes from $49 raise the cap to 100,000 comments per post and add AI analysis. Nothing is a subscription. Replies are optional and export as their own rows.
Use this when you need comments from other accounts (competitors, creators you are vetting, viral posts in your niche), when you need it today, or when you do not want to maintain code.
2. The Instagram Graph API (your own account only)
If you manage a Business or Creator account connected to a Facebook Page, the IG Media Comments endpoint returns comments on your own media as JSON: GET /{ig-media-id}/comments?fields=id,text,username,timestamp,like_count,replies. Page through the cursor, flatten the JSON, and write a CSV. It is free and officially supported, but the setup (Meta developer app, App Review for the instagram_basic and instagram_manage_comments permissions, token refresh every 60 days) is a day of work, and it cannot read anyone else's posts. Full walkthrough in the Instagram comments API explained.
3. Python (instaloader / requests)
Open-source libraries such as Instaloader can iterate post.get_comments() and write rows with csv.DictWriter. It works until Instagram changes an endpoint or rate-limits your session — which for logged-in scraping happens often enough that people maintaining these scripts spend more time on retries and cookies than on analysis. Reasonable for a one-off research project; painful as a weekly workflow. See how to scrape Instagram comments for the code and the caveats.
4. Browser extensions and copy-paste
Extensions inject a "download comments" button on the post page and dump what is currently loaded in the DOM. They are convenient for a few hundred comments but stall on long threads (Instagram lazy-loads in batches, and you must scroll everything into view first) and typically lose reply structure, timestamps or both. Copy-paste into a sheet is the fallback of last resort — it works for a dozen comments and falls apart after that. How to copy Instagram comments compares the manual routes honestly.
| Method | Other people's posts | Replies | Setup | Cost |
|---|---|---|---|---|
| Comment exporter | Yes | Yes (optional) | None | First 100 free; $14 pass |
| Graph API | No | Yes | Developer app + review | Free, your time |
| Python scraper | Yes, fragile | Usually | Code + session upkeep | Free, your time |
| Browser extension | Yes, partially | Rarely | Install | Free–$10/mo |
Opening the CSV without breaking it
CSV is simple, which is exactly why applications feel free to "help" when opening one. Three things go wrong with Instagram comment CSVs specifically.
Excel rounds comment IDs
Instagram comment IDs are 17-digit integers. Excel stores numbers as IEEE-754 doubles with 15 significant digits, so a double-clicked CSV shows 1.79E+16 and, if you save it, permanently replaces the last digits with zeros. Microsoft documents this in "Last digits are changed to zeros". Fix: Data → From Text/CSV → Transform Data, set id, reply_to_id and user_id to Text, then Load. Or download XLSX, where the exporter already types those columns as text.
Emoji and non-Latin text
The file is UTF-8. Excel on Windows sometimes assumes the system code page and shows Thai, Arabic or emoji as garbage. The same From Text/CSV import dialog lets you pick 65001: Unicode (UTF-8). Google Sheets, Numbers, pandas and R read UTF-8 by default.
Line breaks inside comments
Comments contain newlines. A correct CSV quotes those cells, and every proper importer handles it, but hand-rolled parsers that split on \n will break rows. If you write your own reader, use a real CSV library (Python's csv, readr in R, Papa Parse in JavaScript) rather than string splitting.
Loading the CSV into the tools you actually use
Google Sheets
File → Import → Upload, separator "Detect automatically", and untick "Convert text to numbers, dates and formulas" so IDs survive. Then =QUERY(A:K, "select B, count(B) group by B order by count(B) desc") gives you commenters ranked by comment count. The dedicated guide is export Instagram comments to Google Sheets.
Python / pandas
import pandas as pd
df = pd.read_csv("comments.csv", dtype={"id": str, "reply_to_id": str})
df["created_at"] = pd.to_datetime(df["created_at"])
top = df.sort_values("likes", ascending=False).head(20)
by_lang = df["language"].value_counts()
by_hour = df.set_index("created_at").resample("h").size()
R
library(readr); library(dplyr)
comments <- read_csv("comments.csv", col_types = cols(id = col_character(), reply_to_id = col_character()))
comments %>% count(username, sort = TRUE) %>% head(20)
Looker Studio, Power BI, Tableau
All three accept a CSV upload or a Google Sheet as a source. Set created_at as a date-time dimension and likes/replies as metrics. Because the file is one row per comment, a simple record count is your "comments" metric and a distinct count of username is "unique commenters" — the ratio between them is a quick engagement-quality signal (a healthy post has many unique commenters; a suspicious one has a handful of accounts posting dozens of times).
What to do with the CSV once you have it
- Giveaways. Filter to unique
username, drop your own account and any rows before the contest start time, then pick at random — or skip the spreadsheet and use the comment picker directly. Details in Instagram comment picker. - Sentiment and themes. Feed the
textcolumn into a sentiment model or an LLM prompt. Instagram comment sentiment analysis walks through it, including the Pro-pass AI analysis that runs on the export itself. - Competitor research. Export the last ten posts from a rival account and compare comment volume, language mix and reply rate against your own. See Instagram competitor analysis.
- Creator vetting. A CSV makes fake engagement obvious — repeated generic comments, clusters of usernames that co-comment on every post, timestamps bunched into a five-minute window. Our guide to detecting fake Instagram comments shows the exact checks.
- Archiving. Comments get deleted, accounts go private, posts disappear. A dated CSV per post is the only record you control. Paid exports stay downloadable for 30 days; keep your own copies beyond that.
Keeping exports up to date and combining posts
A single CSV is a snapshot. Comment sections keep growing for days after publishing, people delete comments, and creators pin or unpin. If you are tracking a campaign, export the same post again at 24 hours, 72 hours and one week, and use the id column to deduplicate: append the new file under the old one, remove duplicate id values keeping the latest row, and you have both the current state and a record of what disappeared. In pandas that is pd.concat([old, new]).drop_duplicates("id", keep="last"); in Sheets, Data → Data cleanup → Remove duplicates on the id column.
To compare many posts, add a post_url column to each CSV before merging (the exporter's job list shows the source URL, and the XLSX version already includes it in the sheet name). With one combined table you can pivot comments by post and by day, chart which posts drew replies rather than one-liners, and calculate a per-post unique-commenter count — the number that best predicts whether an audience is real. Agencies running this at scale should read the bulk export guide for the workflow across dozens of URLs.
Common problems and fixes
- The export returns zero comments. The account is private, the post has comments turned off, or the URL is a Story or Highlight (which have no public comments). Only public posts and Reels export.
- Fewer comments than Instagram shows. Instagram's displayed count includes deleted, hidden and restricted comments that are not served to anyone; the exporter can only return what the platform still delivers. A gap of a few percent is normal. On the free tier the export also stops at 100 comments per post — the CSV is not truncated randomly, it is capped, and a pass removes the cap.
- Timestamps look wrong.
created_atis UTC. Convert to the audience's time zone before drawing time-of-day charts, or the peak will appear shifted by several hours. - Emoji show as boxes. The file is fine; the font in your spreadsheet lacks those glyphs. Change the font or view in a browser-based tool.
- Reply rows have no parent. You exported without replies on one run and with replies on another. Re-export with replies enabled so every
reply_to_idresolves to anidin the same file.
Legal and privacy notes
Comments on public posts are public, but they are also personal data once you store them with usernames attached. Under GDPR, ICO guidance treats publicly available personal data as still protected — collection needs a lawful basis and a retention limit (ICO lawful-basis guidance). Practically: export only what you need, keep the CSV access-controlled, aggregate before you share, and delete raw files when the analysis is done. Meta's Terms of Use prohibit unauthorised automated collection, so prefer tools that respect rate limits and only touch public content, and never export from accounts you have to log in to see.
Summary
To export Instagram comments to CSV: copy the post URL, paste it into the Instagram comment exporter, download CSV, and import it with the ID columns typed as text. You get author, username, text, likes, replies, created_at, language, is_pinned, id and reply_to_id per row, plus every raw field Instagram returned. The Graph API is the right choice for automated pulls from your own account; scrapers and extensions are stopgaps. Related reading: export Instagram comments to Excel · 3 ways to get Instagram comments out of the app · how to analyze Instagram comments.
