Build a links list by pasting JSON
Create or replace your Links list's profile, links, and social icons in one step by pasting a JSON document, including one written by an LLM.
Adding a profile, then every link, one at a time works, but it's slow for a long list. Importing skips that: paste a JSON document describing the profile, appearance, links, and social icons, and the whole page is built at once. Copy this article with the button above or below, paste it into an LLM along with a description of the page you want, and it can write that document for you.
Find it under Or paste JSON on Links list before you've created one, or under Import JSON in the editor once you have.
- If the team has no links list yet, importing creates one first — the same as Create your list — then applies the document to it.
blocks, when the document includes it, replaces every link, heading, text block, and divider currently on the page.socialLinks, when included, replaces the whole social icon row the same way. Leave either key out and that part of the page is left alone.
The document is checked in full before anything is saved. If any part of it doesn't fit the format below, nothing is created or changed, and the specific problem is reported. Publishing is untouched either way — import never publishes a draft list, and never unpublishes a live one.
The document
Every field is optional; only what's present is changed.
{
"displayName": "Jordan Rivera",
"bio": "Photographer and occasional podcaster.",
"theme": "midnight",
"backgroundStyle": "aurora",
"buttonStyle": "glass",
"accentColor": "#1d4ed8",
"blocks": [ "see below" ],
"socialLinks": [ "see below" ]
}
displayName (150 characters), bio (500), and metaDescription (300) are
the same fields Settings edits. slug sets the page's address
(/links/{slug}) — 3 to 60 letters, numbers, and hyphens, rejected if another
page already has it.
Appearance
Every choice Appearance offers can be set here too, and each one is one of a fixed list. Leave a field out and that part of the page is untouched.
| Field | Values |
|---|---|
theme |
The palette. Light: light, paper, mist, sand, blush, sage, soft, contrast. Dark: dark, midnight, noir, forest, plum, ocean, ember. Or accent, which builds the page out of your accent colour. |
backgroundStyle |
solid, gradient, glow, aurora, dots, grid, stripes, noise, vignette |
backgroundColor |
A hex color that replaces the palette's background, or "" to go back to the palette. Text switches to whichever of black or white reads on it. |
cardStyle |
none, panel, outline, shadow, glass, sheet |
layout |
stack, grid, compact, wide, narrow |
buttonStyle |
solid, outline, soft, glass, emboss, minimal |
buttonShape |
soft, pill, square |
fontStyle |
sans, serif, display, typewriter, rounded, system |
accentColor |
A hex color like "#1d4ed8". |
avatarShape |
circle, rounded, square, wide, none |
headerAlign |
center, left, inline |
socialStyle |
icon, filled, text |
cardStyle is none by default: the column of links sits straight on the
background with no container around it, so the background is what the page
looks like. panel, outline, shadow, glass, and sheet each put the
column in a container of some kind.
Background patterns are mixed from the palette and the accent rather than from fixed colours, so any combination of the three stays readable — you can't pick a pattern that makes the text disappear.
Blocks
Five kinds, in the order they should appear on the page:
{ "type": "link", "label": "My newsletter", "url": "https://example.com", "subtitle": "New issue every Friday" }
{ "type": "heading", "label": "Elsewhere" }
{ "type": "text", "label": "Thanks for stopping by." }
{ "type": "divider" }
{ "type": "magpie", "magpieTarget": "store", "label": "Shop" }
A link needs label and url; subtitle is optional. url accepts
http://, https://, mailto:, and tel: — a bare host like
example.com becomes https://example.com automatically. A heading needs
just label. A text block's label is the paragraph itself, up to 300
characters. A divider needs nothing.
A magpie block points at one of the team's other public Magpie pages via
magpieTarget: store, supporters, or website. It's a reference, not a
frozen link — it always points at whichever page of that kind is currently
public, and quietly disappears from the public list if that page stops being
public. Publish the target first; importing one that isn't public yet is
rejected. label defaults to the destination's name if you leave it out.
Any link or magpie block can set backgroundColor to a hex color,
overriding the page theme for just that button.
Social links
{ "platform": "instagram", "url": "https://instagram.com/example" }
platform is one of instagram, tiktok, youtube, x, bluesky,
facebook, linkedin, github, twitch, discord, spotify,
applemusic, website, or email — each can appear once. email accepts a
bare address and turns it into a mailto: link automatically.
A complete example
{
"displayName": "Jordan Rivera",
"bio": "Photographer and occasional podcaster.",
"theme": "noir",
"backgroundStyle": "noise",
"buttonStyle": "emboss",
"buttonShape": "square",
"fontStyle": "display",
"accentColor": "#e2b714",
"avatarShape": "wide",
"headerAlign": "left",
"blocks": [
{ "type": "link", "label": "Book a session", "url": "https://example.com/book" },
{ "type": "magpie", "magpieTarget": "store", "label": "Prints shop" },
{ "type": "divider" },
{ "type": "heading", "label": "Elsewhere" },
{ "type": "link", "label": "Latest podcast episode", "url": "https://example.com/podcast" }
],
"socialLinks": [
{ "platform": "instagram", "url": "https://instagram.com/example" },
{ "platform": "email", "url": "hello@example.com" }
]
}
If an import is rejected for a reason you can't work out, Contact support.