curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe-v2"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe",
"domain": "bouncy.link"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "links.example.com"
}'
const response = await fetch(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
{
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
slug: 'johndoe-v2'
})
}
);
const result = await response.json();
console.log('Duplicated website:', result.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'slug': 'johndoe-v2'
}
)
result = response.json()
print(f"Duplicated website: {result['url']}")
{
"message": "Website duplicated successfully",
"id": "johndoe-v2",
"url": "https://bouncy.ai/johndoe-v2",
"sourceId": "johndoe",
"isActive": true
}
{
"message": "Website duplicated successfully",
"id": "bouncy.link__johndoe",
"url": "https://bouncy.link/johndoe",
"sourceId": "johndoe",
"isActive": true
}
{
"error": "Source website not found or you do not have permission to access it"
}
{
"error": "The slug 'johndoe-v2' is already taken"
}
{
"error": "You have reached the maximum number of websites and deeplinks (5) allowed for your free plan. Please upgrade to create more.",
"currentUsed": 5,
"totalLimit": 5,
"plan": "free"
}
Websites
Duplicate Website
Create a copy of an existing bio link page with a new slug or domain
POST
/
v1
/
websites
/
{websiteId}
/
duplicate
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe-v2"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe",
"domain": "bouncy.link"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "links.example.com"
}'
const response = await fetch(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
{
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
slug: 'johndoe-v2'
})
}
);
const result = await response.json();
console.log('Duplicated website:', result.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'slug': 'johndoe-v2'
}
)
result = response.json()
print(f"Duplicated website: {result['url']}")
{
"message": "Website duplicated successfully",
"id": "johndoe-v2",
"url": "https://bouncy.ai/johndoe-v2",
"sourceId": "johndoe",
"isActive": true
}
{
"message": "Website duplicated successfully",
"id": "bouncy.link__johndoe",
"url": "https://bouncy.link/johndoe",
"sourceId": "johndoe",
"isActive": true
}
{
"error": "Source website not found or you do not have permission to access it"
}
{
"error": "The slug 'johndoe-v2' is already taken"
}
{
"error": "You have reached the maximum number of websites and deeplinks (5) allowed for your free plan. Please upgrade to create more.",
"currentUsed": 5,
"totalLimit": 5,
"plan": "free"
}
Quick DuplicationThis endpoint copies all content, styling, links, and settings from an existing website. Perfect for creating variations, client sites, or campaign-specific pages without rebuilding from scratch.
Request
Headers
string
required
Must be
application/jsonPath Parameters
string
required
The identifier of the source website to duplicate. Can be a slug, custom domain, or document ID.Example:
johndoeBody
string
URL slug for the new website. Required if no
domain is provided, or when using a system domain. 3 to 50 characters of letters, numbers, hyphens and underscores, and not a reserved word (for example admin, api, login); otherwise 400 with code: "INVALID_SLUG".Example: johndoe-v2string
Domain for the new website. The API automatically detects the domain type:
- Bouncy domain (
bouncy.ai): Uses theslugas the path,bouncy.ai/{slug} - System domain (e.g.
bouncy.link,spicyl.ink): Requires aslug,{domain}/{slug} - Custom domain (any other domain): Deploys to your custom domain,
{domain}. The domain must be connected to your account and verified, otherwise the request returns403(code: "DOMAIN_NOT_FOUND") or400(code: "DOMAIN_NOT_VERIFIED")
bouncy.linkYou must provide at least a
slug or a domain. If only slug is provided, the website is created on bouncy.ai/{slug}.Response
string
Success message
string
Unique ID of the newly created website
string
Full URL to the new websiteExample:
https://bouncy.ai/johndoe-v2string
ID of the source website that was duplicated
boolean
Whether the copy was created active. A copy on
bouncy.ai or a system domain is created inactive when the account is at its active limitThe copy is rendered with the same page generator as the dashboard, so every template (including the newest designs) looks the same as the source. If the account is on the free plan, paid-only features (hidden branding, verified badge, contact collection blocks, follower counter, Smart 18+ mode, behaviors other than Conservative) are removed from the copy, as the dashboard does.
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe-v2"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "johndoe",
"domain": "bouncy.link"
}'
curl -X POST https://api.bouncy.ai/v1/websites/johndoe/duplicate \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "links.example.com"
}'
const response = await fetch(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
{
method: 'POST',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
slug: 'johndoe-v2'
})
}
);
const result = await response.json();
console.log('Duplicated website:', result.url);
import requests
response = requests.post(
'https://api.bouncy.ai/v1/websites/johndoe/duplicate',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'slug': 'johndoe-v2'
}
)
result = response.json()
print(f"Duplicated website: {result['url']}")
{
"message": "Website duplicated successfully",
"id": "johndoe-v2",
"url": "https://bouncy.ai/johndoe-v2",
"sourceId": "johndoe",
"isActive": true
}
{
"message": "Website duplicated successfully",
"id": "bouncy.link__johndoe",
"url": "https://bouncy.link/johndoe",
"sourceId": "johndoe",
"isActive": true
}
{
"error": "Source website not found or you do not have permission to access it"
}
{
"error": "The slug 'johndoe-v2' is already taken"
}
{
"error": "You have reached the maximum number of websites and deeplinks (5) allowed for your free plan. Please upgrade to create more.",
"currentUsed": 5,
"totalLimit": 5,
"plan": "free"
}