curl -X PUT https://api.bouncy.ai/v1/links/my-slug \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"destination": "https://example.com/updated-page",
"title": "Updated Title",
"tags": ["updated", "marketing"]
}'
const response = await fetch(
'https://api.bouncy.ai/v1/links/my-slug',
{
method: 'PUT',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destination: 'https://example.com/updated-page',
title: 'Updated Title',
tags: ['updated', 'marketing']
})
}
);
const result = await response.json();
console.log(result.message);
import requests
response = requests.put(
'https://api.bouncy.ai/v1/links/my-slug',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'destination': 'https://example.com/updated-page',
'title': 'Updated Title',
'tags': ['updated', 'marketing']
}
)
result = response.json()
print(result['message'])
{
"success": true,
"id": "my-slug",
"message": "Link updated successfully",
"updatedFields": ["destination", "title", "tags"]
}
{
"error": "Not Found",
"message": "Deeplink not found"
}
{
"error": "Bad Request",
"message": "The destination URL must be a valid HTTP or HTTPS URL",
"field": "destination"
}
{
"error": "Forbidden",
"message": "You do not have permission to modify this deeplink"
}
{
"error": "Links on bouncy.ai cannot redirect to this destination. Please use a system domain or custom domain for this destination.",
"code": "BLOCKED_BOUNCY_DESTINATION"
}
{
"error": "Conflict",
"code": "AMBIGUOUS_IDENTIFIER",
"message": "More than one of your links uses this slug (for example on different domains). Send the link id or its full short URL instead."
}
Links
Update Link
Update an existing short link’s destination, title, or metadata
PUT
/
v1
/
links
/
{identifier}
curl -X PUT https://api.bouncy.ai/v1/links/my-slug \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"destination": "https://example.com/updated-page",
"title": "Updated Title",
"tags": ["updated", "marketing"]
}'
const response = await fetch(
'https://api.bouncy.ai/v1/links/my-slug',
{
method: 'PUT',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destination: 'https://example.com/updated-page',
title: 'Updated Title',
tags: ['updated', 'marketing']
})
}
);
const result = await response.json();
console.log(result.message);
import requests
response = requests.put(
'https://api.bouncy.ai/v1/links/my-slug',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'destination': 'https://example.com/updated-page',
'title': 'Updated Title',
'tags': ['updated', 'marketing']
}
)
result = response.json()
print(result['message'])
{
"success": true,
"id": "my-slug",
"message": "Link updated successfully",
"updatedFields": ["destination", "title", "tags"]
}
{
"error": "Not Found",
"message": "Deeplink not found"
}
{
"error": "Bad Request",
"message": "The destination URL must be a valid HTTP or HTTPS URL",
"field": "destination"
}
{
"error": "Forbidden",
"message": "You do not have permission to modify this deeplink"
}
{
"error": "Links on bouncy.ai cannot redirect to this destination. Please use a system domain or custom domain for this destination.",
"code": "BLOCKED_BOUNCY_DESTINATION"
}
{
"error": "Conflict",
"code": "AMBIGUOUS_IDENTIFIER",
"message": "More than one of your links uses this slug (for example on different domains). Send the link id or its full short URL instead."
}
Request
Headers
string
required
Must be
application/jsonPath Parameters
string
required
Any of:
- the link
idreturned by GET /v1/links (e.g.,my-linkortapmy.social__my-link) - the slug (e.g.,
my-link), matched against your own links first and then, for an active team member, the team owner’s links - the short URL, URL-encoded (e.g.,
https%3A%2F%2Ftapmy.social%2Fmy-link)
id or short URL always wins over a slug match. If a bare slug matches more than one of your links (for example tapmy.social/my-link and viewmy.link/my-link), the request is refused with 409 AMBIGUOUS_IDENTIFIER: send the link id or the short URL instead.Body
string
New destination URL where the short link should redirect. Must be a valid HTTP or HTTPS URL. Links on
bouncy.ai itself cannot point at a small set of blocked destinations (the same rule as the dashboard, also applied to geoRules and languageRules redirect URLs); use a system domain or your own domain for those.Example: https://example.com/new-pagestring
Updated title for SEO and social media sharingExample:
Updated Summer Sale 2026string
Updated description for SEO and social media cardsExample:
Now 60% off everything!array
Updated array of tagsExample:
["marketing", "summer", "60-percent-off"]object
Google Analytics tracking configuration
object
Meta Pixel tracking configuration
object
Full SEO metadata object override (ignored if
title or description are also provided)string
Redirect behavior. One of:
conservative, aggressive, basic, non-meta, experimental, experimental2, reddit. Free plans are saved as conservative whatever is sent. GET /v1/account/limits lists the behaviors your plan can use.array
Array of geographic filtering rules. Rules are evaluated in order and the first matching rule wins. Visitors who match no rule are redirected to the main destination.Each rule is an object with:
countries(array) - ISO 3166-1 alpha-2 codes (e.g.,US,GB) or full country namespresetId(string) - ID of a saved geo preset, as returned by GET /v1/geo-presets. Use this in place ofcountries: the server fills the rule’s countries from the preset’s saved country list when the link is saved. An unknownpresetIdreturns a400errorcities(array) - City names, matched as case-insensitive substrings. Can be combined with eithercountriesorpresetIdredirectUrl(string) - Destination URL for visitors matching this rule. Always required, including when the rule usespresetId
[
{
"countries": ["US", "GB"],
"cities": ["Manchester"],
"redirectUrl": "https://example.com/uk-us-landing"
},
{
"presetId": "a1B2c3D4e5F6g7H8",
"redirectUrl": "https://example.com/preset-landing"
}
]
array
Array of language-based filtering rules
string
Traffic recovery URL for when the primary destination is unavailable
string
Move the link into one of the link owner’s groups (GET /v1/groups).
null or an empty string removes it from its group. An unknown group returns 400 with code: "GROUP_NOT_FOUND".Example: grp_abc123You cannot update the
slug or domain after creation. Create a new link if you need a different slug.Response
boolean
Whether the operation succeeded
string
Unique identifier for the link
string
Success message
array
List of fields that were updated
curl -X PUT https://api.bouncy.ai/v1/links/my-slug \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"destination": "https://example.com/updated-page",
"title": "Updated Title",
"tags": ["updated", "marketing"]
}'
const response = await fetch(
'https://api.bouncy.ai/v1/links/my-slug',
{
method: 'PUT',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
destination: 'https://example.com/updated-page',
title: 'Updated Title',
tags: ['updated', 'marketing']
})
}
);
const result = await response.json();
console.log(result.message);
import requests
response = requests.put(
'https://api.bouncy.ai/v1/links/my-slug',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'destination': 'https://example.com/updated-page',
'title': 'Updated Title',
'tags': ['updated', 'marketing']
}
)
result = response.json()
print(result['message'])
{
"success": true,
"id": "my-slug",
"message": "Link updated successfully",
"updatedFields": ["destination", "title", "tags"]
}
{
"error": "Not Found",
"message": "Deeplink not found"
}
{
"error": "Bad Request",
"message": "The destination URL must be a valid HTTP or HTTPS URL",
"field": "destination"
}
{
"error": "Forbidden",
"message": "You do not have permission to modify this deeplink"
}
{
"error": "Links on bouncy.ai cannot redirect to this destination. Please use a system domain or custom domain for this destination.",
"code": "BLOCKED_BOUNCY_DESTINATION"
}
{
"error": "Conflict",
"code": "AMBIGUOUS_IDENTIFIER",
"message": "More than one of your links uses this slug (for example on different domains). Send the link id or its full short URL instead."
}