curl -X PATCH https://api.bouncy.ai/v1/links/group/bulk \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "identifier": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "groupId": "grp_abc123xyz" },
{ "identifier": "old-link", "groupId": null }
]
}'
const response = await fetch('https://api.bouncy.ai/v1/links/group/bulk', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
links: [
{ identifier: 'my-link', groupId: 'grp_abc123xyz' },
{ identifier: 'tapmy.social__promo', groupId: 'grp_abc123xyz' },
{ identifier: 'old-link', groupId: null }
]
})
});
const result = await response.json();
console.log(result.message);
import requests
response = requests.patch(
'https://api.bouncy.ai/v1/links/group/bulk',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'links': [
{'identifier': 'my-link', 'groupId': 'grp_abc123xyz'},
{'identifier': 'tapmy.social__promo', 'groupId': 'grp_abc123xyz'},
{'identifier': 'old-link', 'groupId': None}
]
}
)
result = response.json()
print(result['message'])
{
"success": true,
"message": "Bulk update completed: 2 successful, 0 failed, 1 skipped",
"results": {
"success": [
{ "identifier": "my-link", "id": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "id": "tapmy.social__promo", "groupId": "grp_abc123xyz" }
],
"failed": [],
"skipped": [
{ "identifier": "old-link", "id": "old-link", "reason": "Already in target group" }
]
}
}
{
"error": "Group grp_missing not found"
}
{
"error": "Bad Request",
"message": "links can hold at most 100 identifiers per request (got 150)"
}
{
"error": "Links array is required and cannot be empty"
}
Groups
Assign Links to Groups
Move up to 100 links into groups, or out of their group, in one request
PATCH
/
v1
/
links
/
group
/
bulk
curl -X PATCH https://api.bouncy.ai/v1/links/group/bulk \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "identifier": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "groupId": "grp_abc123xyz" },
{ "identifier": "old-link", "groupId": null }
]
}'
const response = await fetch('https://api.bouncy.ai/v1/links/group/bulk', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
links: [
{ identifier: 'my-link', groupId: 'grp_abc123xyz' },
{ identifier: 'tapmy.social__promo', groupId: 'grp_abc123xyz' },
{ identifier: 'old-link', groupId: null }
]
})
});
const result = await response.json();
console.log(result.message);
import requests
response = requests.patch(
'https://api.bouncy.ai/v1/links/group/bulk',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'links': [
{'identifier': 'my-link', 'groupId': 'grp_abc123xyz'},
{'identifier': 'tapmy.social__promo', 'groupId': 'grp_abc123xyz'},
{'identifier': 'old-link', 'groupId': None}
]
}
)
result = response.json()
print(result['message'])
{
"success": true,
"message": "Bulk update completed: 2 successful, 0 failed, 1 skipped",
"results": {
"success": [
{ "identifier": "my-link", "id": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "id": "tapmy.social__promo", "groupId": "grp_abc123xyz" }
],
"failed": [],
"skipped": [
{ "identifier": "old-link", "id": "old-link", "reason": "Already in target group" }
]
}
}
{
"error": "Group grp_missing not found"
}
{
"error": "Bad Request",
"message": "links can hold at most 100 identifiers per request (got 150)"
}
{
"error": "Links array is required and cannot be empty"
}
Request
Headers
string
required
Must be
application/jsonBody
array
required
One entry per link (max: 100 entries; more is refused with 400). Each entry is
{ identifier, groupId }:identifier: the linkidreturned by GET /v1/links (e.g.,my-linkortapmy.social__my-link), its slug, or its short URL. Resolved like Toggle Link Status: your own links first, then, for an active, non-viewer team member, the team owner’s links. A bare slug that matches more than one of your links fails with theAMBIGUOUS_IDENTIFIERmessage: send the linkidor short URL instead.groupId: the group to move the link into (see List Groups), ornullto take the link out of its group. The group must belong to the link’s owner (the team owner’s groups for a team link).
id and by its short URL) is moved once, by its first entry; the extra entries are listed under skipped.Example: [{ "identifier": "my-link", "groupId": "grp_abc123xyz" }, { "identifier": "https://tapmy.social/promo", "groupId": null }]To move a single link,
PATCH /v1/links/{identifier}/group takes { "groupId": "grp_abc123xyz" } (or null) and answers { success, message, id, groupId }.Response
boolean
true when the request was processed (individual entries can still fail)string
Summary of the counts
object
Show properties
Show properties
array
{ identifier, id, groupId } for each link that was movedarray
{ identifier, error } for each entry that was not applied (not found, no permission, an ambiguous slug, or a group the link’s owner does not have)array
{ identifier, id, reason } for each link already in the target group, and for each entry that named a link already listed earlier in the requestcurl -X PATCH https://api.bouncy.ai/v1/links/group/bulk \
-H "Authorization: Bearer bcy_live_pk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "identifier": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "groupId": "grp_abc123xyz" },
{ "identifier": "old-link", "groupId": null }
]
}'
const response = await fetch('https://api.bouncy.ai/v1/links/group/bulk', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
links: [
{ identifier: 'my-link', groupId: 'grp_abc123xyz' },
{ identifier: 'tapmy.social__promo', groupId: 'grp_abc123xyz' },
{ identifier: 'old-link', groupId: null }
]
})
});
const result = await response.json();
console.log(result.message);
import requests
response = requests.patch(
'https://api.bouncy.ai/v1/links/group/bulk',
headers={
'Authorization': 'Bearer bcy_live_pk_YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'links': [
{'identifier': 'my-link', 'groupId': 'grp_abc123xyz'},
{'identifier': 'tapmy.social__promo', 'groupId': 'grp_abc123xyz'},
{'identifier': 'old-link', 'groupId': None}
]
}
)
result = response.json()
print(result['message'])
{
"success": true,
"message": "Bulk update completed: 2 successful, 0 failed, 1 skipped",
"results": {
"success": [
{ "identifier": "my-link", "id": "my-link", "groupId": "grp_abc123xyz" },
{ "identifier": "tapmy.social__promo", "id": "tapmy.social__promo", "groupId": "grp_abc123xyz" }
],
"failed": [],
"skipped": [
{ "identifier": "old-link", "id": "old-link", "reason": "Already in target group" }
]
}
}
{
"error": "Group grp_missing not found"
}
{
"error": "Bad Request",
"message": "links can hold at most 100 identifiers per request (got 150)"
}
{
"error": "Links array is required and cannot be empty"
}