Real ZIP forensics

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.

CheckMate upload screen analysing an Instagram ZIP locally in the browser
File paths and schema are read in the browser; the original ZIP is never sent to a server.

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.

TargetRepresentative shape observedWhat the parser must do
followers_N.jsonTop-level array or relationships_followersCollect every numbered file and unwrap
following.jsonrelationships_following objectRead the array inside the wrapper
Newer relationship entrieslabel_values + optional fbidSeparate display name from username; prefer fbid when present
Unknown wrapperFirst non-empty arrayIgnore unknown fields but record a section error
connections/
└── followers_and_following/
    ├── followers_1.json
    ├── followers_2.json   # present on some accounts
    └── following.json

2. 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.

FieldUsable forCaveat
fbidPrimary relationship matching when present in both filesNot present in every export
href usernameExtracting the displayed username from the profile pathNo guarantee the path is a permanent ID
title / valueSecondary username candidates in the old formatA mismatch is not confirmation of a rename
timestampObserved range within the list and the time of some eventsNot the account creation date nor a complete history window
displayNameDisplay onlyNever 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 screenHow it is computedWhat it can sayWhat it cannot say
followers 2,794 daysfollowers timestamp max minus minThe range of observed times in the fileThat every follower in that period is present
following 2,783 daysfollowing timestamp max minus minThe range of observed times in the fileThat the full following history is guaranteed
N missingActual follower count minus file entriesA quantitative warning at 10% or moreWho 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.

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.

Sources and how they were verified

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.

Read next

All-time JSON downloadRequest a correct ZIP again, including split relationship files.How reliable username-change tracking isHow far fbid and username candidates each go as evidence.Two-snapshot comparisonCompute real relationship-change candidates instead of a single current state.When the results look wrongQuickly diagnose timing gaps, split files and HTML-format problems.