From hootsuite-pack
Retrieves Hootsuite social media analytics for messages, profiles, and organizations; shortens URLs via Ow.ly API. Tracks engagement, clicks, and post performance.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hootsuite-packThis skill is limited to using the following tools:
Retrieve social media analytics and use Ow.ly URL shortening via the Hootsuite API. Track post performance, engagement metrics, and click-through rates.
Uploads media files and schedules social media posts via Hootsuite REST API. Covers media upload to temporary S3 URLs, status checks, and message scheduling on profiles.
Create, schedule, publish, and manage social media posts for Twitter/X, LinkedIn, Threads, Bluesky, Mastodon via Typefully API using Node.js scripts.
Provides Late API reference for scheduling posts across 13 social media platforms like Twitter, Instagram, LinkedIn. Covers authentication, endpoints, webhooks, media, analytics.
Share bugs, ideas, or general feedback.
Retrieve social media analytics and use Ow.ly URL shortening via the Hootsuite API. Track post performance, engagement metrics, and click-through rates.
hootsuite-install-auth setupimport 'dotenv/config';
const TOKEN = process.env.HOOTSUITE_ACCESS_TOKEN!;
const BASE = 'https://platform.hootsuite.com/v1';
async function getOrganization() {
const response = await fetch(`${BASE}/me/organizations`, {
headers: { 'Authorization': `Bearer ${TOKEN}` },
});
const { data } = await response.json();
return data[0]; // Primary organization
}
async function shortenUrl(fullUrl: string) {
const response = await fetch(`${BASE}/shorteners/owly`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: fullUrl }),
});
const { data } = await response.json();
console.log(`${fullUrl} → ${data.shortUrl}`);
return data;
}
// Shorten multiple URLs
async function shortenBatch(urls: string[]) {
return Promise.all(urls.map(url => shortenUrl(url)));
}
async function getMessageAnalytics(messageId: string) {
const response = await fetch(`${BASE}/messages/${messageId}`, {
headers: { 'Authorization': `Bearer ${TOKEN}` },
});
const { data } = await response.json();
console.log(`Message: ${data.text?.substring(0, 50)}...`);
console.log(`State: ${data.state}`);
console.log(`Sent: ${data.sentAt}`);
return data;
}
// List sent messages and their performance
async function getSentMessages(profileId: string) {
const response = await fetch(
`${BASE}/messages?socialProfileIds=${profileId}&state=SENT&limit=20`,
{ headers: { 'Authorization': `Bearer ${TOKEN}` } },
);
const { data } = await response.json();
for (const msg of data) {
console.log(`[${msg.sentAt}] ${msg.text?.substring(0, 60)}`);
}
return data;
}
async function getProfileDetails(profileId: string) {
const response = await fetch(`${BASE}/socialProfiles/${profileId}`, {
headers: { 'Authorization': `Bearer ${TOKEN}` },
});
const { data } = await response.json();
console.log(`Profile: @${data.socialNetworkUsername}`);
console.log(`Network: ${data.type}`);
console.log(`ID: ${data.id}`);
return data;
}
| Error | Cause | Solution |
|---|---|---|
404 on message | Message deleted or wrong ID | Verify message ID |
| No analytics data | Post too recent | Wait for engagement data (24-48h) |
| Ow.ly rate limited | Too many shortening requests | Batch and throttle |
For common errors, see hootsuite-common-errors.