[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"\u002Fblog\u002Fyour-bio-page-now-has-an-api":3,"\u002Fblog\u002Fyour-bio-page-now-has-an-api-surround":422},{"id":4,"title":5,"author":6,"body":10,"date":410,"description":411,"extension":412,"image":413,"meta":414,"minRead":415,"navigation":416,"path":417,"seo":418,"stem":419,"updatedAt":420,"__hash__":421},"blog\u002Fblog\u002Fyour-bio-page-now-has-an-api.md","Your Bio Page Now Has an API",{"name":7,"avatar":8},"Egon Sale",{"src":9,"alt":7},"\u002Fimg\u002Fblog\u002Fegon_sale.jpeg",{"type":11,"value":12,"toc":402},"minimark",[13,17,20,23,26,31,34,37,40,43,59,62,66,69,71,92,95,104,108,115,118,161,164,225,228,281,284,288,291,294,320,323,327,330,356,359,363,371,374,380,383,398],[14,15,16],"p",{},"There is a small but significant moment in any tool's life when it stops being a destination and starts being a building block.",[14,18,19],{},"For Selfbase, that moment is now.",[14,21,22],{},"We just shipped API keys, which means your pages no longer live exclusively inside our dashboard. You can list them from a script, create them from a CI job, update them from a Raycast extension, or push changes from whatever weird internal tool your team has running on a Friday afternoon.",[14,24,25],{},"The page is yours. Now the workflow is yours too.",[27,28,30],"h2",{"id":29},"why-we-added-an-api","Why we added an API",[14,32,33],{},"If you only ever build one page, you probably don't need an API. The dashboard is faster.",[14,35,36],{},"But the moment you start managing several pages — for clients, for campaigns, for product launches that all need a slightly different \"smart link\" — clicking through the UI for every small change starts to feel a lot like data entry.",[14,38,39],{},"API keys turn that boring repetition into a function call.",[14,41,42],{},"You can:",[44,45,46,50,53,56],"ul",{},[47,48,49],"li",{},"Spin up a new page when a customer signs up",[47,51,52],{},"Sync your latest content into a \"Latest\" block automatically",[47,54,55],{},"Toggle pages between published and unpublished from a script",[47,57,58],{},"Generate dozens of campaign pages from a CSV instead of by hand",[14,60,61],{},"We had a lot of users asking for this politely. And a few asking for it less politely. Both groups should now be happier.",[27,63,65],{"id":64},"what-you-actually-get","What you actually get",[14,67,68],{},"The API is REST, the format is JSON, and authentication is a bearer token. Nothing surprising, which is the highest compliment you can give an API.",[14,70,42],{},[44,72,73,80,86],{},[47,74,75,79],{},[76,77,78],"strong",{},"Manage pages"," — list, create, fetch, rename, publish, unpublish",[47,81,82,85],{},[76,83,84],{},"Manage blocks"," — add, update, reorder, hide, or delete the content units inside a page (links, headers, forms, products, embeds, the lot)",[47,87,88,91],{},[76,89,90],{},"Update settings"," — page-level config like avatars, slugs, SEO metadata",[14,93,94],{},"If it exists in the dashboard, the goal is for it to exist in the API. We are not fully there yet, but we are close.",[14,96,97,98,103],{},"The full reference lives at ",[99,100,102],"a",{"href":101},"\u002Fdevelopers","selfbase.co\u002Fdevelopers",".",[27,105,107],{"id":106},"a-60-second-tour","A 60-second tour",[14,109,110,111,114],{},"Create a key in ",[76,112,113],{},"Profile → API Keys",". Copy it once — we only show it once, on purpose.",[14,116,117],{},"Then call the API like you would any other:",[119,120,125],"pre",{"className":121,"code":122,"language":123,"meta":124,"style":124},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl https:\u002F\u002Fselfba.se\u002Fapi\u002Fpages \\\n  -H \"Authorization: Bearer YOUR_API_KEY\"\n","bash","",[126,127,128,145],"code",{"__ignoreMap":124},[129,130,133,137,141],"span",{"class":131,"line":132},"line",1,[129,134,136],{"class":135},"sBMFI","curl",[129,138,140],{"class":139},"sfazB"," https:\u002F\u002Fselfba.se\u002Fapi\u002Fpages",[129,142,144],{"class":143},"sTEyZ"," \\\n",[129,146,148,151,155,158],{"class":131,"line":147},2,[129,149,150],{"class":139},"  -H",[129,152,154],{"class":153},"sMK4o"," \"",[129,156,157],{"class":139},"Authorization: Bearer YOUR_API_KEY",[129,159,160],{"class":153},"\"\n",[14,162,163],{},"That returns your pages. Add a new one:",[119,165,167],{"className":121,"code":166,"language":123,"meta":124,"style":124},"curl -X POST https:\u002F\u002Fselfba.se\u002Fapi\u002Fpages \\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"slug\": \"spring-campaign\", \"title\": \"Spring Campaign\"}'\n",[126,168,169,183,196,210],{"__ignoreMap":124},[129,170,171,173,176,179,181],{"class":131,"line":132},[129,172,136],{"class":135},[129,174,175],{"class":139}," -X",[129,177,178],{"class":139}," POST",[129,180,140],{"class":139},[129,182,144],{"class":143},[129,184,185,187,189,191,194],{"class":131,"line":147},[129,186,150],{"class":139},[129,188,154],{"class":153},[129,190,157],{"class":139},[129,192,193],{"class":153},"\"",[129,195,144],{"class":143},[129,197,199,201,203,206,208],{"class":131,"line":198},3,[129,200,150],{"class":139},[129,202,154],{"class":153},[129,204,205],{"class":139},"Content-Type: application\u002Fjson",[129,207,193],{"class":153},[129,209,144],{"class":143},[129,211,213,216,219,222],{"class":131,"line":212},4,[129,214,215],{"class":139},"  -d",[129,217,218],{"class":153}," '",[129,220,221],{"class":139},"{\"slug\": \"spring-campaign\", \"title\": \"Spring Campaign\"}",[129,223,224],{"class":153},"'\n",[14,226,227],{},"Then drop a header onto it:",[119,229,231],{"className":121,"code":230,"language":123,"meta":124,"style":124},"curl -X POST https:\u002F\u002Fselfba.se\u002Fapi\u002Fpages\u002Fspring-campaign\u002Fblocks \\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"block\": {\"name\": \"header\", \"label\": \"Header\"}, \"content\": {\"text\": \"Welcome\"}}'\n",[126,232,233,246,258,270],{"__ignoreMap":124},[129,234,235,237,239,241,244],{"class":131,"line":132},[129,236,136],{"class":135},[129,238,175],{"class":139},[129,240,178],{"class":139},[129,242,243],{"class":139}," https:\u002F\u002Fselfba.se\u002Fapi\u002Fpages\u002Fspring-campaign\u002Fblocks",[129,245,144],{"class":143},[129,247,248,250,252,254,256],{"class":131,"line":147},[129,249,150],{"class":139},[129,251,154],{"class":153},[129,253,157],{"class":139},[129,255,193],{"class":153},[129,257,144],{"class":143},[129,259,260,262,264,266,268],{"class":131,"line":198},[129,261,150],{"class":139},[129,263,154],{"class":153},[129,265,205],{"class":139},[129,267,193],{"class":153},[129,269,144],{"class":143},[129,271,272,274,276,279],{"class":131,"line":212},[129,273,215],{"class":139},[129,275,218],{"class":153},[129,277,278],{"class":139},"{\"block\": {\"name\": \"header\", \"label\": \"Header\"}, \"content\": {\"text\": \"Welcome\"}}",[129,280,224],{"class":153},[14,282,283],{},"That is the whole shape of it. Pages contain blocks. Blocks contain content. You manipulate either.",[27,285,287],{"id":286},"where-this-gets-interesting","Where this gets interesting",[14,289,290],{},"The simplest use case is automation: stop doing in the UI what a script can do for you. That alone justifies the API for most heavy users.",[14,292,293],{},"But the more interesting use cases come from treating Selfbase as infrastructure:",[44,295,296,302,308,314],{},[47,297,298,301],{},[76,299,300],{},"Agencies"," running 50 client pages can keep them all consistent without 50 manual updates.",[47,303,304,307],{},[76,305,306],{},"Newsletter operators"," can sync their latest issue to a \"Featured\" block automatically.",[47,309,310,313],{},[76,311,312],{},"Product teams"," can generate per-customer landing pages programmatically.",[47,315,316,319],{},[76,317,318],{},"Creators with multiple offers"," can spin up campaign-specific pages in seconds and tear them down when the campaign ends.",[14,321,322],{},"The dashboard is great for one page that you tend like a houseplant. The API is for everything else.",[27,324,326],{"id":325},"the-fine-print-briefly","The fine print, briefly",[14,328,329],{},"A few things worth knowing:",[44,331,332,339,342,349],{},[47,333,334,335,338],{},"Up to ",[76,336,337],{},"5 API keys per account",". Rotate freely.",[47,340,341],{},"Keys do not expire by default — but you can revoke them whenever you want.",[47,343,344,345,348],{},"Rate limit is ",[76,346,347],{},"150 requests per minute",", which is plenty for nearly everything except a misbehaving script. (If your script is misbehaving, the rate limit is doing you a favor.)",[47,350,351,352,355],{},"Every error returns a clear status code and a ",[126,353,354],{},"statusMessage"," field, so you don't have to guess what went wrong.",[14,357,358],{},"Standard stuff, intentionally.",[27,360,362],{"id":361},"where-we-go-from-here","Where we go from here",[14,364,365,366,370],{},"The direction is clear: anything you can do in Selfbase, you should also be able to do ",[367,368,369],"em",{},"to"," Selfbase from anywhere else.",[14,372,373],{},"Webhooks, richer block content endpoints, and bulk operations are all on the way. If there's a specific workflow you're trying to automate, tell us — those tend to jump the queue.",[14,375,376,377,379],{},"Full reference at ",[99,378,102],{"href":101},". If you build something interesting with it, we'd love to see it.",[14,381,382],{},"If you build something cursed with it, we'd also love to see that.",[14,384,385,386,392,393],{},"Photo by ",[99,387,391],{"href":388,"rel":389},"https:\u002F\u002Funsplash.com\u002F@jakubzerdzicki?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[390],"nofollow","Jakub Żerdzicki"," on ",[99,394,397],{"href":395,"rel":396},"https:\u002F\u002Funsplash.com\u002Fphotos\u002Fa-person-holding-a-bunch-of-keys-in-their-hand-Ebj87ehFNNU?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[390],"Unsplash",[399,400,401],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":124,"searchDepth":147,"depth":147,"links":403},[404,405,406,407,408,409],{"id":29,"depth":147,"text":30},{"id":64,"depth":147,"text":65},{"id":106,"depth":147,"text":107},{"id":286,"depth":147,"text":287},{"id":325,"depth":147,"text":326},{"id":361,"depth":147,"text":362},"2026-05-05T00:00:00.000Z","API keys are live. Manage your Selfbase pages from your own scripts, dashboards, or AI tools — no dashboard clicking required.","md","\u002Fimg\u002Fblog\u002Fjakub-zerdzicki-Ebj87ehFNNU-unsplash.jpg",{},6,true,"\u002Fblog\u002Fyour-bio-page-now-has-an-api",{"title":5,"description":411},"blog\u002Fyour-bio-page-now-has-an-api","2026-05-20T00:00:00.000Z","EicOwOETRgfX1FH_90UbB8AJABAmiNABUvPFzETgr2I",[423,428],{"title":424,"path":425,"stem":426,"description":427,"children":-1},"Your Bio Page Is Now a Real Storefront","\u002Fblog\u002Fyour-bio-page-is-now-a-real-storefront","blog\u002Fyour-bio-page-is-now-a-real-storefront","Products on Selfbase now support images, external links, and multiple items per block. Sell digital files, physical goods, or link out to any shop — all from one place.",{"title":429,"path":430,"stem":431,"description":432,"children":-1},"Your Link in Bio Is Not a Storage Closet","\u002Fblog\u002Fyour-link-in-bio-is-not-a-storage-closet","blog\u002Fyour-link-in-bio-is-not-a-storage-closet","A better bio page does not hoard links. It guides people toward one clear next step with a little more taste and a lot less chaos.",1779345148782]