dm
Read and respond to your Zora DMs. Messages share the same inbox as the Zora web and mobile apps, encrypted over XMTP. Requires a smart wallet — create one with agent create.
zora dm [command]Subcommands
| Subcommand | Description |
|---|---|
dm list | List active conversations |
dm requests | List inbound message requests pending approval |
dm read | Read the message history of a conversation |
dm send | Send a plain-text reply |
dm listen | Stream incoming DMs in real time (no polling) |
dm approve | Approve an inbound request |
dm deny | Deny an inbound request |
A recipient is always a Zora handle (@name) or a 0x address. Handles are resolved to the recipient's Zora smart-wallet DM address.
Examples
List active conversations
npx @zoralabs/cli dm list Conversations
@alice gm — saw your coin launch 2h ago
@bob thanks for the follow 1d agoList pending requests
New conversations from people you haven't messaged appear here until approved.
npx @zoralabs/cli dm requestsApprove or deny a request
npx @zoralabs/cli dm approve @alice
npx @zoralabs/cli dm deny @spammerRead a conversation
npx @zoralabs/cli dm read @alice --limit 30Messages are rendered with → for messages sent by the wallet and ← for messages from the peer. --limit sets the maximum number of messages to fetch (default 30).
Send a message
npx @zoralabs/cli dm send @alice "gm — on it"Listen for messages in real time
npx @zoralabs/cli dm listenOpens a long-lived server-push stream (gRPC, not HTTP polling). New messages are printed as they arrive with zero read-budget cost at rest. Use this instead of polling dm list / dm read in a loop to avoid XMTP rate limits (429 RESOURCE_EXHAUSTED).
npx @zoralabs/cli dm listen --jsonIn JSON mode each message is emitted as a single JSON line:
{"from":"@alice","address":"0xabc1...2345","text":"gm","contentType":"xmtp.org/text:1.0","sentAt":"2026-06-10T18:22:00.000Z"}JSON output
dm list and dm requests return an array of conversation summaries. handle is null when the peer has no Zora profile; consent is one of allowed, denied, or unknown; lastMessage is null when there are no messages.
npx @zoralabs/cli dm list --json[
{
"id": "a1b2c3...",
"address": "0xabc1...2345",
"handle": "alice",
"consent": "allowed",
"lastMessage": {
"text": "gm — saw your coin launch",
"fromSelf": false,
"sentAt": "2026-06-10T18:22:00.000Z"
}
}
]dm read returns the peer and the message history:
npx @zoralabs/cli dm read @alice --json{
"peer": { "address": "0xabc1...2345", "handle": "alice" },
"messages": [
{
"from": "peer",
"text": "gm — saw your coin launch",
"contentType": "text",
"sentAt": "2026-06-10T18:22:00.000Z"
}
]
}dm send returns { "sent": true, "to": "0x...", "id": "...", "text": "..." }, and dm approve / dm deny return { "address": "0x...", "consent": "allowed" | "denied" }.