Skip to content

Build with XMTP

Securing the world’s freedom to communicate

Every user has a cryptographic inbox identified by an InboxID. Wallet identities link to an inbox through signed cryptographic associations. Each client installation has its own keys and local database.

Each inbox designates a recovery authority that can revoke compromised associations or transfer control, preventing lockouts when credentials are lost. No email or phone number authentication is required.

XMTP supports two conversation formats:

  • 1:1 direct messages (DMs): Conversations between two participants
  • Group chats: Multi-party conversations with configurable permissions and metadata

Both humans and agents can participate in DMs and group chats. Clients must connect to the same backend deployment to exchange messages. Separate backend deployments do not share inbox or conversation state.

Consent preferences are stored on-device and shared through device sync. Your app uses them to filter conversations:

  • Allowed: Contacts whose messages appear in the main inbox
  • Unknown: New contacts requiring acceptance/rejection
  • Denied: Blocked contacts whose messages are filtered out

Only the user can see their consent list—blocked contacts are never notified of their status. See User consent.

Whether you’re building a standalone chat app or adding messaging to an existing app, the integration steps are the same.

  • Signer: Reuse your wallet signer, or generate a key pair for each user. See Create a signer.
  • Client lifecycle: For standalone chat apps, you typically create the XMTP client at app launch. For embedded chat, you can choose to create it only when the user opens the chat feature for the first time.
  • Identity mapping: Map each existing user to an XMTP inbox ID. Use canMessage to check whether a user can receive messages.