CommunicationOS
Exports11 August 20269 min readAdam Albastov

How to export your Instagram and Messenger conversations

The Meta Accounts Center download, step by step, plus the parts nobody warns you about: no per-thread scope, re-encoded media, mojibake in the JSON, and no export at all from Business Suite.

The short answer

Meta provides a self-service tool to download your Instagram direct messages and Facebook Messenger conversations through the Accounts Center. The export delivers JSON or HTML files containing message text, timestamps, sender names, and folders of voice notes and images. You cannot pick a single conversation to export, text encoding often mangles non-ASCII characters, and any message deleted before you request the download is missing from the folder.

How to request the download from Meta

The export tool lives inside the Meta Accounts Center. You can open it in a desktop web browser at accountscenter.meta.com, or reach it through the settings screen of the Instagram or Facebook mobile app.

From the Accounts Center menu, select "Your information and permissions", then click "Download your information". The interface offers two paths: a complete copy of everything Meta stores about your accounts, or a custom export where you choose specific data types. Select the custom option so you can isolate messages from activity logs, ad tracking files, and profile changes.

On the configuration screen you set four things.

  1. Accounts. Tick the Instagram and Facebook profiles you need to pull data from.
  2. Date range. Choose between your complete account history or a custom window such as the previous calendar month.
  3. Format. Select JSON if you plan to write code against the files, load them into a database, or import them into another shared inbox. Choose HTML only if you want to click through files inside a web browser, because the markup is not a stable contract and parsing it will break the next time Meta changes a class name.
  4. Media quality. Meta offers high, medium, and low. Pick high. The low setting compresses images heavily, turning photos of parcel labels, serial numbers, and receipts into unreadable thumbnails, and the photograph of the damaged box was probably the reason you wanted the export at all.

Meta asks you to re-enter your account password when you submit the request. Processing happens on Meta servers in the background. For accounts with years of message history, packaging takes several hours and produces multiple numbered zip files. Meta sends a notification when the archives are ready.

You enter your password a second time to download the zip files. The download link expires after a few days, so retrieve and unpack the archives as soon as the notification arrives. Starting one on a Friday afternoon is a good way to lose it.

What the export contains and what it leaves out

The downloaded archive organizes communication records into an inbox directory. Inside that directory, each conversation gets its own folder named after the participant.

A conversation folder contains one or more files named message_1.json, message_2.json, and upward as the conversation grows. Three subfolders sit alongside the JSON files to hold binary media: photos, videos, and audio_files. The JSON records reference these media files through relative file paths.

inbox/
  customername_123456789/
    message_1.json
    message_2.json
    photos/
      photo_001.jpg
    audio_files/
      audio_001.mp4
    videos/

Inside each JSON file, individual messages appear as objects containing a sender_name, an epoch millisecond integer named timestamp_ms, and a string field called content whenever the message contains plain text. Shared links, image attachments, call entries, and emoji reactions populate separate keys inside the object. Voice messages appear as audio files in the audio subfolder without an accompanying text transcript.

Included in Meta export Missing from Meta export
Message text and timestamps Messages deleted by either party
Voice note audio files Transcripts of voice recordings
Photos and video attachments Messages sent in vanish mode
Reactions and share links Unsent messages
Call entries with duration Audio of the call itself
Entire account message history Selective individual chat threads

The export leaves out anything removed from the platform before the download ran. When a customer unsends a message or deletes a text from the thread, Meta removes that item from your account copy too. Messages sent using vanish mode do not appear in the download. Phone and video calls show up as flat entries with a duration and no content.

Media is re-encoded to the quality you picked. High is the best the export offers, which is not a promise of the original file that was sent to you.

The scope problem

Meta does not let you pick single conversations. You can filter the export to include only messages, and you receive every thread that exists on that account.

This creates friction during customer data requests. Under data privacy law, a customer can ask to see the personal information your business holds about them. When you download the Meta export to answer that request, the resulting archive bundles that customer's messages with private conversations from hundreds of other clients. Forwarding the raw export would expose confidential records, so you have to unpack the archive, find that person's folder, and extract only their data before you send anything.

Instagram direct messages and Facebook Messenger threads live on separate sides of the platform. If your company talks to the same client on Instagram and Facebook, you run two independent exports through the Accounts Center. The two archives use different directory patterns and ID formats, leaving your team to reconcile the customer's timeline by hand.

Fixing mangled text encoding

Meta exports contain a long-standing encoding bug. The platform stores text internally as UTF-8, and its export pipeline escapes string bytes as if they were Latin-1.

Because of that, accented characters and international alphabets turn into garbled text, a problem known as mojibake. A customer message containing "café" appears in the JSON file as café. Names with non-Latin characters, currency symbols, and emoji expand into multi-character sequences of punctuation and symbols. Parse the raw JSON directly and every accented name in your customer list will be wrong.

To restore the original text, take the string, encode it back to raw bytes using the Latin-1 character set, and decode those bytes using UTF-8.

The Python script below loops through a thread directory, fixes the encoding on sender names and message text, and sorts the messages in time order:

import json
from pathlib import Path

def unmangle(text: str) -> str:
    try:
        return text.encode("latin-1").decode("utf-8")
    except (UnicodeEncodeError, UnicodeDecodeError):
        return text

def read_thread(folder: Path) -> list[dict]:
    messages = []
    for path in sorted(folder.glob("message_*.json")):
        data = json.loads(path.read_text(encoding="utf-8"))
        for message in data.get("messages", []):
            messages.append({
                "at": message["timestamp_ms"],
                "from": unmangle(message.get("sender_name", "")),
                "text": unmangle(message.get("content", "")),
            })
    messages.sort(key=lambda m: m["at"])
    return messages

The try block in unmangle stops the script from crashing. Some strings inside the export file are already valid UTF-8, and re-encoding those raises an exception. The handler catches it and returns the input unchanged.

The limits of business accounts and APIs

Many businesses handle customer messages through Meta Business Suite rather than the consumer mobile apps. Business Suite brings Instagram Direct and Facebook Page messages into one place, and it provides no bulk export button for team conversations. The Page inbox is the same story.

Developers building internal tools often turn to the official Messenger Platform API, which does not work as an archive retrieval tool either. Standard API access runs inside a 24-hour service window following the customer's latest message. The conversations endpoint returns recent threads rather than a multi-year communication history. You cannot reconstruct your historical record through it.

The self-service export stays tied to the personal Meta profile that administers the page. If three staff members answer direct messages for your store, the export reflects only what that individual profile could see. There is no team-wide export and no per-agent attribution.

Managing team inboxes and continuous archives

If your business takes orders and answers customers on Meta channels, run an export through the Accounts Center today. Store that archive somewhere the company controls, not on the laptop of whoever happens to hold the Instagram login, because the person who owns that login can walk out with it. This gives you a point-in-time snapshot of past orders and supplier discussions, and it is the only free copy you are going to get.

A manual zip download is an emergency snapshot rather than a record-keeping system. It cannot help you if a counterparty changes an agreement, because deleted and edited messages are already gone from the next export you run.

A continuous archive handles history differently. It captures messages at receipt, keeps the original version of every message, and records later edits and deletions as separate events with their own timestamps. CommunicationOS runs that capture across nineteen networks, holding Instagram Direct, Facebook Messenger, WhatsApp, and email in one searchable timeline, with voice notes transcribed on the way in. You can read how the store works in our conversation history architecture, and how retrieval works in the data export documentation. Plans start at USD 39 a month and are priced per connected account, with teammates free on every tier, which you can check on the pricing page.

Stop exporting, start keeping it

Connect an account and the history behind it gets indexed too. Voice notes transcribed, media read, every message searchable for as long as the account is connected.

No card required. Production deployment takes under an hour.

Talk to us