Learn

saved_posts.json: what is inside Instagram's export

Updated 2026-11-01

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.

Turn that file into the videos

Drop the zip into AllMySaves and every link in saved_posts.json is fetched while the post is still there — your own copy, transcribed in whatever language it was spoken, and indexed, so the list of addresses becomes a library you can search by what was said in it.

Open your vault and drop the zip in