The problem ended up being that our Content-Type header was:
Content-Type
Content-Type: */*; charset=utf-8
Instead of:
Content-Type: text/HTML; charset=utf-8
Twitter/X, LinkedIn, and Apple Messages choked on */*.
*/*