Slack link unfurling for a page that shows a Sume render
A Slack app can unfurl your own link with a Sume render preview using link_shared and chat.unfurl. Learn the 5-domain limit and the reinstall rule first.

To show a preview of a Sume render when someone pastes your link into Slack, build a Slack app that subscribes to the link_shared event for your domain, looks up the render for the link, and calls chat.unfurl with the preview. An app can register up to 5 domains, and adding or removing one requires reinstalling the app.
The Slack facts are from Unfurling links in messages, read 2026-10-10. The Sume facts are from Runs and results and Jobs and results. The link points to your own page, not to Sume's.
What does Slack require?
The page lists the link_shared event, the links:read and links:write scopes, and the chat.unfurl method. You register the domains your app handles, up to 5, and a change to that list needs a reinstall of the app in each workspace. An unfurl may use blocks, so the preview can have an image and text.
Pick the domain before you build. A short, stable domain such as a share subdomain is easier to keep inside the limit of 5 than one domain per campaign, and it saves you the reinstall that Slack requires for every change to the list.
| Piece | Slack says | Use for a render link |
|---|---|---|
| link_shared | Event sent when a registered domain is posted | Trigger to look up the render |
| Domains | Up to 5; change needs a reinstall | Use one stable domain for share pages |
| links:read, links:write | Required scopes | Request both |
| chat.unfurl | Method that supplies the preview | Send the image and a one-line caption |
| Blocks | Supported in the unfurl | Image block plus a context line |
What is the link?
Do not point Slack at an API URL. Use a share page you control, such as https://share.example.com/r/ab12, where ab12 is a short id in your own database mapping to a Sume run id. The link_shared handler splits the path, finds the run id and reads the stored result.
This keeps the API key server-side. Nobody pastes a Sume key into a link, and the page you share can enforce your own access rules.
Keep the unfurl small. One image, a title that names what was rendered and a short caption are enough. The preview is a teaser, and the full file belongs on your page, where you can add download links and permissions.
How do I fetch the preview?
Read the run once, store what you need, and unfurl from your store. The result endpoint answers 409 run_not_completed until a run is terminal, so a link pasted while a render is still going should unfurl a plain "still rendering" card and leave the media out. When the run is terminal, the receipt holds the media in artifacts[] and a primary output URL.
Media URLs from a finished Format run are durable media.sume.com HTTPS URLs that do not expire, per the runs page, so a cached unfurl will not break later. Only successful, completed runs belong in a preview; a failed run should show a short message, not a half-made file.
A small caution on private content: an unfurl exposes the preview to everyone who can see the Slack message. If the render is not meant for the whole channel, unfurl only a generic card and let the share page check the viewer.
What can go wrong?
Reinstall is the surprise. If you add a second domain next month, every workspace has to reinstall the app before it sees links on the new domain. Plan the domain up front.
The other trap is repeated work. Slack may send the same link several times. Look up by run id, cache the unfurl payload and answer from the cache. You never need to call Sume again for a finished run, and a finished run costs nothing to re-read.
Sources
Related posts
More in Integrations
- Slack scheduleMessage: announce a finished Sume render
Slack lets a bot schedule a post up to 120 days ahead, with at most 30 per 5 minutes in a channel. Finish the Sume render first, then schedule the announcement.
- Slack trigger_id expires in 3 seconds: open the modal first
A Slack trigger_id works once and only for 3 seconds. Open the modal first, then call Sume, and reply later through response_url within 30 minutes and 5 uses.
- Smartsheet webhook verification challenge, then a Sume Format run
Smartsheet checks your endpoint with a challenge before a webhook is enabled. Answer it, then use change events to start Sume Format runs with a stable key.
- SQS fair queues: MessageGroupId stops one client starving Sume jobs
Amazon SQS fair queues use MessageGroupId on standard queues as a tenant tag. How to map it to clients that share one Sume account without ordering.
Written by Sume