How Instagram Data Download Works: A Technical Look (2026)

A calm, technical explainer of how the Instagram data download actually works — request flow, ZIP contents, JSON vs HTML, and how trackers parse it.

8 min read

The Instagram data download is a request-driven export that bundles your account state into a ZIP file. The short answer: when you ask for it, Meta queues a server-side job, reads your data into structured files, packages them as a ZIP, and emails you a temporary link.

The rest of this post unpacks what happens between the request screen and the file landing on your computer — and what every folder inside is for. This is the same archive that tools like hooleft.me read to figure out who quietly left your followers list.

The request flow, step by step

Knowing how Instagram data download works at a low level helps explain quirks like the wait time, the format choice, and the multiple files for the same list.

When you submit a download request from Accounts Center, Instagram does roughly the following:

  1. The form posts your request to Meta's data-portability service. The payload includes the account ID, the categories you selected, the date range, and the format (JSON or HTML).
  2. The service queues a job. Most jobs finish in under four hours; the hard ceiling is forty-eight.
  3. A worker reads your account state, category by category, from Meta's primary stores. For followers that means a snapshot of the follow-edge table at the moment the worker runs.
  4. The worker serializes each category into one or more files. JSON exports use UTF-8 plain text; HTML exports add styled templates and copies of any media referenced.
  5. The files are written into a directory named after your account, then zipped. Larger archives split into multiple ZIP parts, but a typical follower export is a single file.
  6. The ZIP is uploaded to temporary cloud storage. Meta emails you a download link, a signed URL valid for about four days.
  7. You click the link, Instagram asks you to re-enter your password, and the ZIP downloads.

Two practical consequences fall out of this. The snapshot is taken at job-run time, not request time, so the wait directly shapes the data you receive. And the link is short-lived by design — save the file locally as soon as it arrives.

What is inside the ZIP

The archive's top-level structure is a folder named after your account. Inside, every category you selected becomes a sibling directory. The naming is stable across exports, so a parser built against one ZIP works on the next.

A typical full export includes the following directories — the exact set depends on the categories you ticked at request time.

FolderWhat it contains
connections/followers, following, close friends, blocked accounts, hidden stories, recent follow requests
messages/DM threads grouped by conversation, with per-thread folders for media
your_instagram_activity/posts, stories, reels, likes, comments, saved items, polls, search history
personal_information/profile data, account history, contact info, login activity, devices
media/image and video files referenced from the activity folders (only present for full archives)
preferences/notification settings, language, accessibility preferences
ads_information/advertisers Meta has matched to you, off-Instagram activity, audience inferences
security_and_login_information/recent logins, account access history, two-factor activity
apps_and_websites_off_of_instagram/linked third-party apps, OAuth grants, custom audience inclusions
logged_information/events Meta has recorded against your account (impressions, engagement, recommendations)

The first folder — connections/ — is the one most readers came for. It contains the follower-related files that every unfollower tracker reads, including hooleft.me.

JSON vs HTML — what the format choice actually changes

You pick the format at request time, and the choice changes everything downstream.

JSON is the source format. Meta serializes the raw data into UTF-8 text files, one per category (or per page when a category is large). The files are small, plain, and machine-readable. Every file is an object with a fixed top-level shape — a metadata block plus an array of entries.

HTML is a rendered view built from the same data. Meta runs the JSON through styled templates and ships a folder full of .html pages plus the CSS, fonts, and media they reference. The result is browsable, but the archive is several times larger and harder to read programmatically.

The data is identical — picking HTML does not give you access to anything JSON omits, and vice versa. Every tracker we know of reads JSON, and hooleft.me is no exception. If you plan to upload the ZIP anywhere, pick JSON. If you only want to scroll through your account history offline, HTML is the comfortable choice.

File structure: how the followers and following lists look inside

The files inside connections/followers_and_following/ are the most-read part of any export, so they are worth a closer look.

A small account's archive contains two files there: followers_1.json and following.json. The naming pattern is deliberate — your followers list is paginated, so it can grow into followers_2.json, followers_3.json, and so on as the account scales. Your following list is always a single file (you only follow so many accounts).

Both files share the same shape. The top-level object holds a relationships_followers (or relationships_following) key whose value is an array. Each entry represents one account and contains a string_list_data array with one item per relationship. That item holds the href (a profile link), the value (the username at export time), and a timestamp (when the follow edge was created, in Unix seconds).

Three details matter for anyone reading the file by hand or in code:

  • Timestamps are follow-creation times, not export times. If an account followed you in 2021, the timestamp says 2021 regardless of when you exported.
  • Usernames are point-in-time. If a follower renamed their account after following you, the file holds the old name. The href still resolves to the canonical profile.
  • Order is not meaningful. Entries are not sorted by date, alphabet, or interaction. A parser that wants chronological order has to sort by timestamp itself.

To find unfollowers, compare two exports: anyone whose value appears in the older followers_*.json but not in the newer one has left. If you just want a clean spreadsheet of this file rather than a diff, the Instagram followers list export walkthrough covers converting it to CSV.

How trackers parse the export

A follower tracker is, mechanically, a small program that opens the ZIP, finds the right files, reads them, and computes a diff. The interesting design decisions are about safety, not algorithms.

A safe parser does the work locally and never uploads the raw ZIP to a server. Browsers can unzip files in JavaScript using the standard streams API, so a tracker built into a web page can:

  1. Receive the ZIP via a file picker or drag-and-drop — the file stays on the user's machine.
  2. Walk the archive in memory, looking for connections/followers_and_following/followers_*.json and following.json.
  3. Stream-decode each JSON file, concatenating paginated followers files in numerical order.
  4. Extract the value and href fields into in-memory lists, then diff against a saved snapshot.
  5. Discard everything when the tab closes — no server-side copy ever existed.

This is the approach hooleft.me takes. The parser runs in your browser, the diff is computed against your previous snapshot, and the only thing the server sees is the result you choose to save. A tracker that asks you to upload the raw ZIP to its cloud is doing more than it has to — every operation needed to find unfollowers can happen locally.

FAQ

Is the Instagram data download generated live, or is it a cached snapshot?

It is generated on demand. When you submit the request, Meta queues a job, reads your account state at that moment, writes the files, and zips them. Two exports taken minutes apart can already show different follower counts if anyone unfollowed in between.

Are the JSON and HTML formats just visual styles of the same data?

The data underneath is the same. JSON is the structured source; HTML is a rendered view built from that source for readability. JSON files are smaller, easier to parse, and what every tracker reads.

Why does my archive sometimes split followers across multiple files?

Large lists are paginated to keep individual files reasonable in size. You will see filenames like followers_1.json and followers_2.json. A parser concatenates them in order before counting.

Does the export include accounts that blocked or hid me?

No. Your archive only includes data your account can see. Accounts that blocked you will not appear in your followers list, and there is no separate list of who blocked you.

The archive sits in temporary cloud storage. Meta expires the link to limit how long a sensitive copy of your data lives on their delivery servers — usually four days. After expiry you request a new export.

Now what

Knowing how the export is built makes it easier to read. A request becomes a job, a job becomes a snapshot, a snapshot becomes a ZIP, a ZIP becomes a few JSON files you can open in any text editor. No magic, no scraping — just a portable copy of data Meta already holds.

If you want the request flow with screenshots, our Instagram data export guide covers every screen. If you want to skip the manual diff, drop the ZIP into hooleft.me and the parser runs in your browser; hooleft.me lays out what the paid tier adds. And if you are still wondering whether you can find unfollowers at all, start with how to see who unfollowed you on Instagram.

See who isn't following you back.

No password. No DM scrape. Just your own data.

Try hooleft.me

Related