Skip to main content
Send a link part to render a URL as a native preview card.

Send a preview

Add context before the card

Relay preserves part order, so a preview can follow text in the same send:
That is one message with two parts, in the order you sent them. A reply or a reaction targets the message, and can name one part of it. A link part keeps two things: the URL, and the page title.
Everything else a card draws — the description, the hero image, the site name — is live detail rather than stored content. Fetch it with GET /v1/links/unfurl when you render:
Relay fetches the page itself and caches the result, so no recipient opens a connection to a URL somebody else chose, and the hero image comes back as a Relay URL rather than the publisher’s own image host. The older sender-resolved preview fields (description, site_name, image_url, canonical_url, preview_kind, preview_version, attachment_id, mime_type, filename, size_bytes, width, height, blur_hash) are still accepted on a send, so existing integrations keep working, but they are not stored and not echoed back.

Let Relay resolve the title

Send preview_state: "pending" when you have not read the page yourself:
The message commits immediately with the part marked pending. Relay fetches the page and then emits a message.updated event carrying the settled title. This always settles — a page with no title clears the marker too — so a pending part is a preview that is coming, never one that silently failed. A settled part carries no preview_state key at all.

Fallback

The server never rewrites or shortens the destination.

Choosing the part type

Rich previews use normal message behavior: the same response, history, events, idempotency, replies, reactions, and delivery and read receipts.

Next steps