saved_posts.json: what is inside Instagram's export
You asked Instagram for your data, the zip arrived, and somewhere inside it is
a file called saved_posts.json. It is the only file in the export
that knows what you saved — and opening it is a disappointment until you know
what you are looking at.
Where it is in the zip
Unzip the archive and look for
your_instagram_activity/saved/saved_posts.json. Older exports put
it under saved/saved_posts.json, and if you asked for HTML instead
of JSON you will have saved_posts.html and none of what follows
applies — ask again and
choose JSON.
What is actually in it
A list of links. Nothing else.
Each saved post is one entry, and each entry holds the account that posted it, the address of the post, and when you saved it:
{
"saved_saved_media": [
{
"title": "someaccount",
"string_map_data": {
"Saved on": {
"href": "https://www.instagram.com/reel/CwtJHZ-vGkY/",
"timestamp": 1699382400
}
}
}
]
}
Instagram has renamed these keys before, so an older or newer export may use
slightly different words. The shape holds: a list, and inside each item an
href and a timestamp.
The date is a number
That timestamp is a Unix time — seconds since 1 January 1970.
1699382400 is 7 November 2023. Any spreadsheet or language converts it; there
is nothing more to it than that, but it is the first thing that looks broken.
Why the text looks mangled
Account names with accents or emoji come out wrong — café
appears as café, and emoji become strings of symbols. The file is
not corrupt. Instagram writes UTF-8 text and then labels it as Latin-1, so every
reader faithfully shows you the wrong characters.
Reading the bytes back the way they were written fixes it:
def readable(s):
return s.encode("latin-1", "ignore").decode("utf-8", "ignore")
Getting the links out
If you only want the list of addresses, this prints them:
import json
with open("saved_posts.json", encoding="utf-8") as f:
data = json.load(f)
for item in data["saved_saved_media"]:
saved = item["string_map_data"]["Saved on"]
print(saved["href"])
For a few hundred posts, that is a usable list you can paste somewhere. For several thousand, it is a wall of addresses with nothing to tell them apart — no titles, no captions, no thumbnails. Which is the real limitation of this file.
What the file cannot do
It contains no videos and no images. Every entry is a pointer to something still living on Instagram's servers, not a copy of it.
Some of those pointers are already dead. A post deleted or made private since you saved it leaves a link that goes nowhere, and the file gives you no way to tell which. You find out by opening them.
There is nothing to search. You cannot look for the recipe you saved, because the words spoken in that video were never in this file and never will be.
That last point is worth sitting with. The export proves what you saved. It does not give you any of it back.
Why this is still worth having
A list of links is exactly what a tool needs to go and fetch each post properly, while the posts are still there. Every day between the export and doing something with it is a day more of them quietly disappearing — and once a post is gone, nobody can recover it, with or without this file.