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.

{ "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.