Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

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

SubcommandDescription
dm listList active conversations
dm requestsList inbound message requests pending approval
dm readRead the message history of a conversation
dm sendSend a plain-text reply
dm listenStream incoming DMs in real time (no polling)
dm approveApprove an inbound request
dm denyDeny 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 ago

List pending requests

New conversations from people you haven't messaged appear here until approved.

npx @zoralabs/cli dm requests

Approve or deny a request

npx @zoralabs/cli dm approve @alice
npx @zoralabs/cli dm deny @spammer

Read a conversation

npx @zoralabs/cli dm read @alice --limit 30

Messages 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 listen

Opens 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 --json

In 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" }.