bundle.social SDK
Node.js SDK for bundle.social API.
Installation
npm install bundlesocial
yarn add bundlesocial
pnpm add bundlesocial
!!! Make sure you have created a team on bundle.social and have an generated API key. !!!
Setup
import { BundleSocial } from 'bundlesocial';
const bundleSocial = new BundleSocial('YOUR_API_KEY');
Usage
Get the organization information
const organization = await bundlesocial.organization.organizationGetOrganization();
Create a team
const createdTeam = await bundlesocial.team.teamCreateTeam({
requestBody: {
name: 'Test Team',
tier: 'FREE',
},
});
Get the team information
const team = await bundlesocial.team.teamGetTeam({
id: createdTeam?.id,
});
Manage social accounts (needed for product integration only)
If you can connect social accounts directly through our web app, you can skip this step.
For more info check out our docs: https://info.bundle.social/api-reference
Connect social account
const response = await bundlesocial.socialAccount.socialAccountConnect({
requestBody: {
type: 'TIKTOK',
teamId: team.id,
redirectUrl: 'https://your-redirect-url.com',
}
});
Select page, account or channel (required for FACEBOOK, INSTAGRAM, YOUTUBE, LINKEDIN, DISCORD AND SLACK)
After the user has connected the account and was redirected to your page, you can let the user select the page, account or channel. We unified the data for all platforms. Each social account has a channels
field, that is an array of their channels (pages, accounts, channels depending on the platform).
const team = await bundlesocial.team.teamGetTeam({
id: team.id,
});
const socialAccount = team?.socialAccounts?.find((account) => account.type === 'TIKTOK');
const socialAccountChannelId = socialAccount?.channels?.[0]?.id;
if (socialAccountChannelId) {
await bundlesocial.socialAccount.socialAccountSetChannel({
requestBody: {
type,
teamId: team.id,
channelId: socialAccountChannelId,
}
});
}
Upload a file
const video = await fs.readFile('./video.mp4');
const videoUpload = await bundlesocial.upload.uploadCreate({
formData: {
teamId: team.id,
file: new Blob([video], { type: 'video/mp4' }),
}
});
const jpgImage = await fs.readFile('./image.jpg');
const jpgUpload = await bundlesocial.upload.uploadCreate({
formData: {
teamId: team.id,
file: new Blob([jpgImage], { type: 'image/jpeg' }),
}
});
Create a post
const createdPost = await bundlesocial.post.postCreate({
requestBody: {
teamId: team.id,
data: {
INSTAGRAM: {
text: 'Test Post',
type: 'REEL',
uploadIds: [
videoUpload?.id
]
},
YOUTUBE: {
text: 'Test Post',
type: 'SHORT',
madeForKids: false,
uploadIds: [
videoUpload?.id
],
privacyStatus: 'PUBLIC',
},
TIKTOK: {
text: 'Test Post',
uploadIds: [
videoUpload?.id
],
privacy: 'PUBLIC_TO_EVERYONE',
},
REDDIT: {
sr: 'r/bundlesocial',
text: 'Test Post',
uploadIds: [
jpgUpload.id
],
},
},
postDate: new Date().toISOString(),
socialAccountTypes: ['INSTAGRAM', 'YOUTUBE', 'TIKTOK', 'REDDIT'],
status: 'SCHEDULED',
title: 'Test Post',
}
});
Get the post information
const post = await bundlesocial.post.postGet({
id: createdPost.id,
});
Handling errors
try {
const organization = await bundlesocial.organization.organizationGetOrganization();
} catch (error) {
if (error instanceof ApiError) {
console.log(error?.status, error?.statusText, error?.body);
} else {
throw error;
}
}
Handling webhook events
app.post('/webhook', express.json({ type: 'application/json' }), (req, res) => {
const bundlesocial = new Bundlesocial(apiKey);
const signature = req.headers['x-signature'];
let event: WebhookEvent;
try {
event = bundlesocial.webhooks.constructEvent(
req.body,
signature as string,
secret,
);
} catch (err) {
console.log(`Webhook signature verification failed.`, err);
return res.sendStatus(400);
}
return res.send();
});
License
MIT