DID of the sender (did:plc:... or did:local:...).
Sender's per-account device id.
Decoded text body — UTF-8 lossily decoded from plaintext. The default field to read for normal bots. For text DMs this is exactly what the sender typed.
Raw decrypted bytes. Same content as body for text DMs, but may carry arbitrary binary payloads for group messages a future application encodes itself. Use this if you need byte-exact data.
OptionalsentSender's send-time (from envelope). Absent on legacy messages.
OptionalgroupURL-safe-no-pad base64 of the group id when the message arrived as a group message. Absent for plain DMs.
OptionalprofileThe sender's profile key carried on the envelope, if any. app-core does NOT fetch or cache the sender's display name automatically — pass this to AppCore.fetchAndCacheProfile if your bot wants the name. Absent when the envelope carried no key. Most bots ignore this.
True when this is an inbound DM that the message-request gate treats as a request (the sender is not curated and is not a known bot). app-core does NOT persist a pending-request flag itself; a bot that tracks requests calls AppCore.setPendingRequest. Always false for group messages. Most bots ignore this.
Attachments carried on the message (docs/35); empty for plain text.
Link-preview cards (docs/35), anti-spoof-filtered; empty for plain text.
Server-assigned monotonic id. Used for acking.