curl -X POST https://api.bouncy.ai/v1/websites \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"websiteId": "new",
"templateId": "simple-stack-v2",
"customSlug": "johndoe",
"data": {
"profile": { "name": "John Doe", "bio": "Digital creator" },
"links": [
{ "type": "simple", "title": "My Website", "url": "https://johndoe.com" }
],
"socials": [
{ "platform": "instagram", "url": "https://instagram.com/johndoe" }
],
"advanced": { "pageTitle": "John Doe" },
"settings": { "deepLinkBehavior": "conservative" }
}
}'
const response = await fetch('https://api.bouncy.ai/v1/websites', {
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
websiteId: 'new',
templateId: 'simple-stack-v2',
customSlug: 'johndoe',
data: {
profile: { name: 'John Doe', bio: 'Digital creator' },
links: [{ type: 'simple', title: 'My Website', url: 'https://johndoe.com' }],
socials: [{ platform: 'instagram', url: 'https://instagram.com/johndoe' }],
advanced: { pageTitle: 'John Doe' },
settings: { deepLinkBehavior: 'conservative' }
}
})
});
const website = await response.json();
console.log('Website created:', website.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'websiteId': 'new',
'templateId': 'simple-stack-v2',
'customSlug': 'johndoe',
'data': {
'profile': {'name': 'John Doe', 'bio': 'Digital creator'},
'links': [{'type': 'simple', 'title': 'My Website', 'url': 'https://johndoe.com'}],
'socials': [{'platform': 'instagram', 'url': 'https://instagram.com/johndoe'}],
'advanced': {'pageTitle': 'John Doe'},
'settings': {'deepLinkBehavior': 'conservative'}
}
}
)
website = response.json()
print(f"Website created: {website['url']}")
{
"message": "Website created successfully",
"id": "johndoe",
"url": "https://bouncy.ai/johndoe",
"isActive": true
}
{
"error": "Custom slug already taken"
}
{
"error": "Custom domain is not registered to this account",
"code": "DOMAIN_NOT_FOUND"
}
Websites
Create Website
Publish a link-in-bio page (website) from editor data
POST
/
v1
/
websites
curl -X POST https://api.bouncy.ai/v1/websites \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"websiteId": "new",
"templateId": "simple-stack-v2",
"customSlug": "johndoe",
"data": {
"profile": { "name": "John Doe", "bio": "Digital creator" },
"links": [
{ "type": "simple", "title": "My Website", "url": "https://johndoe.com" }
],
"socials": [
{ "platform": "instagram", "url": "https://instagram.com/johndoe" }
],
"advanced": { "pageTitle": "John Doe" },
"settings": { "deepLinkBehavior": "conservative" }
}
}'
const response = await fetch('https://api.bouncy.ai/v1/websites', {
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
websiteId: 'new',
templateId: 'simple-stack-v2',
customSlug: 'johndoe',
data: {
profile: { name: 'John Doe', bio: 'Digital creator' },
links: [{ type: 'simple', title: 'My Website', url: 'https://johndoe.com' }],
socials: [{ platform: 'instagram', url: 'https://instagram.com/johndoe' }],
advanced: { pageTitle: 'John Doe' },
settings: { deepLinkBehavior: 'conservative' }
}
})
});
const website = await response.json();
console.log('Website created:', website.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'websiteId': 'new',
'templateId': 'simple-stack-v2',
'customSlug': 'johndoe',
'data': {
'profile': {'name': 'John Doe', 'bio': 'Digital creator'},
'links': [{'type': 'simple', 'title': 'My Website', 'url': 'https://johndoe.com'}],
'socials': [{'platform': 'instagram', 'url': 'https://instagram.com/johndoe'}],
'advanced': {'pageTitle': 'John Doe'},
'settings': {'deepLinkBehavior': 'conservative'}
}
}
)
website = response.json()
print(f"Website created: {website['url']}")
{
"message": "Website created successfully",
"id": "johndoe",
"url": "https://bouncy.ai/johndoe",
"isActive": true
}
{
"error": "Custom slug already taken"
}
{
"error": "Custom domain is not registered to this account",
"code": "DOMAIN_NOT_FOUND"
}
Starting a new page? Create Website Draft takes a short, documented config (profile, links, socials, theme) and returns a link to the editor, where the page is reviewed and published. This endpoint publishes immediately and expects the full editor data model.
Request
Headers
string
required
Must be
application/jsonBody
string
required
Any non-empty string (kept for compatibility; the website’s id is its address)
string
required
The design, e.g.
y2k-card, cover-stack, simple-stack-v2, modern-card-v2, minimal-card-v2, spotlight-card-v2, professional-link-bio-v2, bento-grid, neo-brutalist, music-release, music-sleeve, music-onyx, noir-publisher, root-terminal, bonbon-card, portrait-card, scene-card, shelf-card, canvas-story, duotone-press, snap-print, daydream-fade, folio-card. Older designs (modern-card, simple-stack, personal-card, professional-link-bio, spotlight-card, minimal-card) keep working.object
required
The editor data for the page:
profile, links, socials, background, advanced (pageTitle, metaDescription, googleTag, facebookPixel, favicon), settings (deepLinkBehavior, geoRules, botProtection, …) and the design’s own fields. The easiest way to get a valid object is GET /v1/websites/ on a page built in the editor.On free accounts these are removed before publishing, as in the dashboard: hideBranding, profile.verified, contact collection blocks, socialsAppearance.showFollowers and the Smart 18+ mode.string
Slug on
bouncy.ai (or on the system domain below). Without a slug or domain the page gets https://bouncy.ai/site/{id}. Same rule as deeplink slugs: 3 to 50 characters of letters, numbers, hyphens and underscores, and not a reserved word used by Bouncy’s own pages (for example admin, api, login). Invalid slugs return 400 with code: "INVALID_SLUG".Example: johndoeboolean
true to publish on a system domain (with systemDomain and customSlug)string
A system domain from GET /v1/domains, e.g.
tapmy.social. Premium system domains need a paid plan; unknown domains return 400 with code: "UNKNOWN_SYSTEM_DOMAIN".string
One of your custom domains. It must be connected to your account and verified: otherwise
403 with code: "DOMAIN_NOT_FOUND" or 400 with code: "DOMAIN_NOT_VERIFIED".string
Path on the custom domain (e.g.
shop or shop/summer). Omit for the domain root. The dashboard’s rule applies: letters, numbers, hyphens and underscores, with / between segments (leading, trailing and repeated slashes are dropped), at most 200 characters. ., #, %, spaces and paths reserved by Bouncy (for example api, admin, login) return 400.string
Redirect behavior for the page’s links. Free plans are saved as
conservative.boolean
true to publish a custom-domain page immediately (recommended for custom domains).Plan limits
The website counts toward the total and active limits like a deeplink. At the total limit the request returns403. At the active limit a bouncy.ai or system-domain page is created inactive, while a custom-domain page (which must be active) returns 403.
Response
string
Success message
string
The website’s id (use it with the other website endpoints)
string
Full URL of the pageExample:
https://bouncy.ai/johndoeboolean
Whether the page was created active
string
Custom domains with
deployToVercel: true onlycurl -X POST https://api.bouncy.ai/v1/websites \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"websiteId": "new",
"templateId": "simple-stack-v2",
"customSlug": "johndoe",
"data": {
"profile": { "name": "John Doe", "bio": "Digital creator" },
"links": [
{ "type": "simple", "title": "My Website", "url": "https://johndoe.com" }
],
"socials": [
{ "platform": "instagram", "url": "https://instagram.com/johndoe" }
],
"advanced": { "pageTitle": "John Doe" },
"settings": { "deepLinkBehavior": "conservative" }
}
}'
const response = await fetch('https://api.bouncy.ai/v1/websites', {
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
websiteId: 'new',
templateId: 'simple-stack-v2',
customSlug: 'johndoe',
data: {
profile: { name: 'John Doe', bio: 'Digital creator' },
links: [{ type: 'simple', title: 'My Website', url: 'https://johndoe.com' }],
socials: [{ platform: 'instagram', url: 'https://instagram.com/johndoe' }],
advanced: { pageTitle: 'John Doe' },
settings: { deepLinkBehavior: 'conservative' }
}
})
});
const website = await response.json();
console.log('Website created:', website.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'websiteId': 'new',
'templateId': 'simple-stack-v2',
'customSlug': 'johndoe',
'data': {
'profile': {'name': 'John Doe', 'bio': 'Digital creator'},
'links': [{'type': 'simple', 'title': 'My Website', 'url': 'https://johndoe.com'}],
'socials': [{'platform': 'instagram', 'url': 'https://instagram.com/johndoe'}],
'advanced': {'pageTitle': 'John Doe'},
'settings': {'deepLinkBehavior': 'conservative'}
}
}
)
website = response.json()
print(f"Website created: {website['url']}")
{
"message": "Website created successfully",
"id": "johndoe",
"url": "https://bouncy.ai/johndoe",
"isActive": true
}
{
"error": "Custom slug already taken"
}
{
"error": "Custom domain is not registered to this account",
"code": "DOMAIN_NOT_FOUND"
}