Build with XMTP
Identity, inboxes, and installations
Section titled “Identity, inboxes, and installations”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
Section titled “Consent preferences”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.
Add messaging to your app
Section titled “Add messaging to your app”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.

