Inside the Instagram Data ZIP: Dissecting followers and following With Real Files
A 613 MB Instagram data export and the test fixtures, parsed by hand: where the relationship JSON lives, how the wrappers differ, which identifiers exist, what the timestamp range observes, and the accuracy limits that follow.
CheckMate operator · First published · Facts reviewed · About 14 min read
An Instagram ZIP is not a simple "pull out two follower lists and you are done" file. The same relationship data can arrive as a top-level array, inside a relationships_followers wrapper, inside a relationships_following wrapper, or in the label_values format, depending on the export version and language. A parser that assumes one file name and one key will show zero people for some accounts, or read only the first file.
When the operator analysed a real 613 MB ZIP locally, the timestamp range of the followers records was 2,794 days and that of following was 2,783 days. The universal rule that "followers always cover roughly 365 days" therefore does not fit this file. The current version displays the difference between each list's minimum and maximum timestamp as an observed value and does not infer missing data from the range alone.
This article separates what is actually in the file from what cannot be known from it. Username, profile URL, timestamp and, in some newer files, fbid can be observed, but no export can be assumed to carry a permanent unique ID. That is why the current not-following-back calculation, the possible username change label, and actual past unfollow events must be treated with different levels of confidence.

1. Where the relationship files are, and why their names vary
In a Korean-language export the relationship files are usually found under connections/followers_and_following or its translated equivalent. But Meta can rename folders, and selecting "all information" may place them deeper, so CheckMate checks the tail of each ZIP entry path together with a list of known candidates. It does not stop at followers_1.json; it merges every numbered followers file.
The two relationship files can also be shaped differently. There are older followers files that begin directly with an array, and following files where the array sits under an object key named relationships_following. Some newer exports use label_values and fbid. Code that "casts both to the same type" tends to miss one of them.
| Target | Representative shape observed | What the parser must do |
|---|---|---|
| followers_N.json | Top-level array or relationships_followers | Collect every numbered file and unwrap |
| following.json | relationships_following object | Read the array inside the wrapper |
| Newer relationship entries | label_values + optional fbid | Separate display name from username; prefer fbid when present |
| Unknown wrapper | First non-empty array | Ignore unknown fields but record a section error |
connections/
└── followers_and_following/
├── followers_1.json
├── followers_2.json # present on some accounts
└── following.json2. The fields actually read from a single person entry
An old-style string_list_data entry has title, value, href and timestamp, together or only some of them. There are cases where title and value look like a previous name while the username taken from href looks like the current one, but that alone cannot confirm a username change: neither the generation time of the data nor how the fields are refreshed is guaranteed by any public contract.
In some newer entries an fbid was observed as a numeric-string account identifier. When both lists provide the same fbid it is the strongest key for linking a relationship even if the username differs. It is absent from older files, though, so the service description must not be rewritten as "100% tracking by unique ID". displayName is never used as a matching key because different people can share it.
| Field | Usable for | Caveat |
|---|---|---|
| fbid | Primary relationship matching when present in both files | Not present in every export |
| href username | Extracting the displayed username from the profile path | No guarantee the path is a permanent ID |
| title / value | Secondary username candidates in the old format | A mismatch is not confirmation of a rename |
| timestamp | Observed range within the list and the time of some events | Not the account creation date nor a complete history window |
| displayName | Display only | Never a matching key, because names collide |
{
"title": "sample_old_name",
"string_list_data": [{
"href": "https://www.instagram.com/_u/sample_name",
"value": "sample_name",
"timestamp": 1700000000
}]
}3. 2,794 days is neither a "complete data guarantee" nor a "365-day limit"
The observed range is the latest valid timestamp minus the earliest, divided by 86,400 seconds and truncated to whole days. That the real ZIP produced 2,794 days for followers and 2,783 for following means records exist across that span. It does not mean every date is covered or that every past follower from that period is included.
An earlier version used a heuristic that treated followers as truncated when following exceeded 400 days but followers fell below 400, plus a ratio rule that flagged followers below 30% of following as suspicious. Real ratios differ by account type, and the supplied ZIP contradicted the 365-day assumption. Both rules were removed in the Recovery Release.
The current partial-file check is used only when the actual follower count can be read from a separate audience insight. When the number of followers entries in the file is at least 10% below that actual count, a re-download prompt is shown. The exact 10% boundary is tested too. Without an actual count, neither the span nor the following ratio is used to declare that the file "is not all time".
| Value on screen | How it is computed | What it can say | What it cannot say |
|---|---|---|---|
| followers 2,794 days | followers timestamp max minus min | The range of observed times in the file | That every follower in that period is present |
| following 2,783 days | following timestamp max minus min | The range of observed times in the file | That the full following history is guaranteed |
| N missing | Actual follower count minus file entries | A quantitative warning at 10% or more | Who exactly is missing |
4. Mutuals and not-following-back are set comparisons, but the identifier is everything
The basic rule classifies accounts that are in following but not in followers as "accounts that currently do not follow me back". Accounts only in followers are "fans", and accounts in both are mutuals. Because this compares a snapshot taken when the export was generated, it does not tell you "who unfollowed me yesterday". Real changes require comparing two different snapshots.
Identity matching prefers fbid when present; otherwise the username extracted from href, plus the title and value candidates, are lower-cased and compared. When the identifiers within one entry disagree, the result may carry a "possible username change" badge, but deactivation, deletion and re-registration cannot be told apart.
- Current not-following-back: identifiers present in following but absent from followers
- Fans: identifiers present in followers but absent from following
- Mutuals: entries with the same fbid, or compatible username identifiers, on both sides
- Actual unfollow changes: the result of comparing two ZIPs from different dates with snapshot compare
5. Edge cases the parser must handle
For a JSON parser, isolating failures per section matters more than handling well-formed files. A change in the ads information format must not wipe out the relationship results, and one unknown field must not fail the whole ZIP. CheckMate records each insight's parse error and keeps showing the remaining results.
There are double-encoding cases where Korean labels look like mis-decoded latin1. They are reinterpreted only when they form a valid UTF-8 byte sequence; text that is already proper Unicode, or that fails to decode, is kept as-is. Timestamps can mix seconds, milliseconds and microseconds, so they are normalised to seconds based on magnitude.
- Merge every followers_N split file regardless of numeric order and normalise duplicates.
- Find the real label_values array that comes after an empty media array.
- Exclude timestamps of 0, negative values and NaN from the observed range.
- Never use display names as relationship keys because of the false-match risk.
- Degrade unknown sections to null instead of failing the relationship analysis with them.
Sources and how they were verified
- Meta Newsroom — Download Your Information moves into Accounts Center — Confirms the official location of the export feature.
- Instagram Help Center — Export a copy of your information — The official reference for the export feature itself. The file schema was verified separately by observing real ZIPs.
- CheckMate Terms of Service — result accuracy and limits — Discloses the current not-following-back rule, identifier mismatches, and file-time limits.
Frequently asked questions
If followers covers a shorter range than following, is the file truncated?
That difference alone cannot tell you. The two lists are different sets of events and their minimum and maximum timestamps can differ. A missing-data warning is shown only when a separate actual follower count differs by 10% or more.
Is the /_u/username in the profile URL a permanent unique ID?
No. The current parser uses it only as a compatibility format for extracting the username from the path. It is not assumed to be a permanent, immutable identifier; when fbid is present on both sides, that value takes priority.
Can a single ZIP tell me who recently unfollowed me?
No. One ZIP shows the current relationships at the moment it was generated. Real changes require comparing two snapshots from different dates under the same rules.
Is followers_2.json really required?
If it exists, it must be read. Using only the first file makes the follower count and the relationship calculation smaller than the real file.