The messages command gives you access to your Messages.app data right from the terminal. This page covers all the available commands and options.
Quick reference¶
# Show help
messages
messages --help
# List chats
messages chats
messages chats --search "john"
# List contacts
messages contacts
messages contacts --search "john"
# List messages from a chat
messages --chat 42
messages --chat "Mom"
messages --with "John Doe"
# List unread messages
messages --unread
# Search messages
messages --search "dinner"
messages --with "John Doe" --search "dinner"
messages --with "John Doe" --search "dinner" --since 2025-07-15
Global options¶
These options work with any command:
| Option | What it does |
|---|---|
--db PATH |
Use a different database file (defaults to ~/Library/Messages/chat.db) |
--no-contacts |
Don't resolve phone numbers to contact names |
--version |
Show the version number |
--help |
Show help |
Listing messages¶
When you provide message options directly to messages, it lists messages from a conversation. Use --chat or --with to specify the conversation, and --search to search within messages.
messages [OPTIONS]
| Option | What it does |
|---|---|
-c, --chat ID\|NAME |
Chat ID or display name |
-w, --with NAME |
Contact name (exact match) |
-s, --search TEXT |
Search messages for text |
--since DATETIME |
Only show messages after this date (YYYY-MM-DD) |
--before DATETIME |
Only show messages before this date (YYYY-MM-DD) |
-f, --first INTEGER |
Show first N messages (oldest) |
-l, --last INTEGER |
Show last N messages (newest, default: 50) |
--with-attachments |
Only show messages with attachments |
--unread |
Only show unread incoming messages |
--include-unknown-senders |
Include messages from unknown/filtered senders (excluded by default) |
--json |
Output as JSON |
--chat and --with are mutually exclusive
You can use --chat or --with, but not both. If you specify both, the command will exit with an error.
Unknown senders are excluded by default
Messages from the "Filter Unknown Senders" bucket are excluded unless you pass --include-unknown-senders.
Examples:
# Get the last 50 messages from chat ID 42
messages --chat 42
# Get messages by chat display name
messages --chat "Mom"
# Get messages with a contact (exact name match)
messages --with "John Doe"
# Search all messages
messages --search "dinner"
# Search within a conversation
messages --with "John Doe" --search "dinner"
# Search including unknown senders
messages --search "offer" --include-unknown-senders
# Messages from the last week
messages --chat 42 --since 2025-01-01
# Date range
messages --chat 42 --since 2025-01-01 --before 2025-01-15
# Only show messages with attachments
messages --chat 42 --with-attachments
# Show unread messages (excludes spam/unknown senders by default)
messages --unread
# Show all unread messages including spam
messages --unread --include-unknown-senders
# Unread messages from a specific chat
messages --unread --chat 42
# Get JSON for scripting
messages --chat 42 --json | jq '.[] | select(.is_from_me == false)'
What the output looks like:
[January 15, 2025]
Mom (10:30am): Hey, are you free for lunch?
me (10:31am): Sure! Where? [❤️ 1, 👍 1]
Mom (10:32am): How about Main St? (edited)
With --with-attachments:
[January 15, 2025]
Mom (10:33am): Check out this photo!
[image: ~/Library/Messages/Attachments/ab/cd/photo.jpg]
chats¶
Lists your conversations, ordered by most recent activity.
messages chats [OPTIONS]
| Option | What it does |
|---|---|
-s, --search TEXT |
Filter chats by display name |
--service [imessage\|sms\|rcs] |
Only show chats from a specific service |
-n, --limit INTEGER |
How many to show (default: 20) |
--json |
Output as JSON instead of plain text |
Examples:
# Show your 20 most recent conversations
messages chats
# Search for chats by name
messages chats --search "john"
# Show your 10 most recent conversations
messages chats --limit 10
# Only iMessage conversations
messages chats --service imessage
# Get JSON for scripting
messages chats --json | jq '.[0]'
What the output looks like:
42 Mom (iMessage) - 1,247 messages
15 Work Group (iMessage) - 892 messages
The number at the start is the chat ID, which you can use with --chat.
contacts¶
Lists contacts from your macOS Contacts.app.
messages contacts [OPTIONS]
| Option | What it does |
|---|---|
-s, --search TEXT |
Filter contacts by name |
-n, --limit INTEGER |
How many to show (default: 20) |
--json |
Output as JSON instead of plain text |
Examples:
# List contacts
messages contacts
# Search for contacts by name
messages contacts --search "john"
# Get JSON for scripting
messages contacts --json
What the output looks like:
John Doe
John Smith
Debbie Johnson
Output formats¶
By default, commands output plain text that's easy to read and pipe to other tools. If you need machine-readable output, use --json:
messages --chat 42 --json | jq '.[] | select(.is_from_me == false)'
Error messages¶
If something goes wrong, you'll get one of these errors:
| Error | What it means |
|---|---|
Messages database not found |
The chat.db file doesn't exist at the expected location |
Cannot read Messages database. Grant Full Disk Access... |
Your terminal needs Full Disk Access permission |
Chat 999 not found |
There's no chat with that ID |
Multiple chats match "Name" |
More than one chat matches the display name—use the chat ID instead |
Cannot specify both --chat and --with |
These options are mutually exclusive |
Contact "Name" not found |
No contact with that exact name was found |