Skip to main content
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"
}
{
  "message": "Website duplicated successfully",
  "id": "bouncy.link__johndoe",
  "url": "https://bouncy.link/johndoe",
  "sourceId": "johndoe"
}
{
  "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

Content-Type
string
required
Must be application/json

Path Parameters

websiteId
string
required
The identifier of the source website to duplicate. Can be a slug, custom domain, or document ID.Example: johndoe

Body

slug
string
URL slug for the new website. Required if no domain is provided, or when using a system domain.Example: johndoe-v2
domain
string
Domain for the new website. The API automatically detects the domain type:
  • Bouncy domain (bouncy.ai): Uses the slug as the path — bouncy.ai/{slug}
  • System domain (e.g. bouncy.link, spicyl.ink): Requires a slug{domain}/{slug}
  • Custom domain (any other domain): Deploys to your custom domain — {domain}
Example: bouncy.link
You must provide at least a slug or a domain. If only slug is provided, the website is created on bouncy.ai/{slug}.

Response

message
string
Success message
id
string
Unique ID of the newly created website
url
string
Full URL to the new websiteExample: https://bouncy.ai/johndoe-v2
sourceId
string
ID of the source website that was duplicated
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"
}
{
  "message": "Website duplicated successfully",
  "id": "bouncy.link__johndoe",
  "url": "https://bouncy.link/johndoe",
  "sourceId": "johndoe"
}
{
  "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"
}