Skip to main content
client.imessage_conversations() -> pd.DataFrame
client.imessage_messages() -> pd.DataFrame
Download iMessage data recovered from the Epstein archive, split into conversations (contacts) and individual messages.

Example

from jmail import JmailClient

client = JmailClient()
convos = client.imessage_conversations()
messages = client.imessage_messages()

# All messages from a specific conversation
ghislaine = messages[messages.conversation_slug == "ghislaine-maxwell"]

# Messages sent by Epstein
sent = messages[messages.sender == "me"]

# Join messages with conversation metadata
merged = messages.merge(
    convos[["slug", "name"]],
    left_on="conversation_slug",
    right_on="slug",
    how="left"
)

Conversation Columns

ColumnTypeDescription
idintUnique conversation ID
slugstringURL-safe conversation identifier
namestringContact name
biostringContact bio/description
photostringContact photo URL
last_messagestringPreview of the last message
last_message_timestringTimestamp of last message
pinnedboolWhether the conversation was pinned
confirmedboolWhether the contact identity is confirmed
source_filesjsonSource files this conversation was extracted from
message_countintTotal messages in this conversation

Message Columns

ColumnTypeDescription
idstringUnique message ID ({slug}#{index})
conversation_slugstringFK to conversations (slug)
message_indexintMessage position within conversation
textstringMessage text content
senderstringme (Epstein) or them (contact)
timestringOriginal timestamp string
timestamptimestampParsed timestamp
source_filestringSource file this message was extracted from
sender_namestringDisplay name of sender

Direct URLs

https://data.jmail.world/v1/imessage_conversations.parquet
https://data.jmail.world/v1/imessage_conversations.ndjson.gz
https://data.jmail.world/v1/imessage_messages.parquet
https://data.jmail.world/v1/imessage_messages.ndjson.gz