From hootsuite-pack
Applies typed clients, scheduling helpers, and patterns for Hootsuite REST API in TypeScript and Python. Use for integrations, refactoring, or standards.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hootsuite-packThis skill is limited to using the following tools:
Production patterns for Hootsuite REST API: typed client, token management, scheduling helpers, and Python integration.
Provides Hootsuite reference architecture and TypeScript project layout for API integrations with OAuth, token refresh, scheduling, and media handling. Use for new integrations or structure reviews.
Provides Late API reference for scheduling posts across 13 social media platforms like Twitter, Instagram, LinkedIn. Covers authentication, endpoints, webhooks, media, analytics.
Create, schedule, publish, and manage social media posts for Twitter/X, LinkedIn, Threads, Bluesky, Mastodon via Typefully API using Node.js scripts.
Share bugs, ideas, or general feedback.
Production patterns for Hootsuite REST API: typed client, token management, scheduling helpers, and Python integration.
// src/hootsuite/types.ts
interface SocialProfile {
id: string;
type: 'TWITTER' | 'FACEBOOK' | 'INSTAGRAM' | 'LINKEDIN' | 'PINTEREST' | 'YOUTUBE' | 'TIKTOK';
socialNetworkUsername: string;
socialNetworkId: string;
}
interface ScheduledMessage {
id: string;
text: string;
state: 'SCHEDULED' | 'SENT' | 'FAILED' | 'REJECTED';
socialProfileIds: string[];
scheduledSendTime: string;
sentAt?: string;
mediaUrls?: Array<{ id: string }>;
}
interface HootsuiteResponse<T> {
data: T;
}
function scheduleForTimezone(
hour: number,
minute: number,
timezone: string,
daysFromNow = 0
): Date {
const date = new Date();
date.setDate(date.getDate() + daysFromNow);
const dateStr = date.toISOString().split('T')[0];
const timeStr = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}:00`;
return new Date(`${dateStr}T${timeStr}`);
}
// Schedule posts at optimal times per platform
const OPTIMAL_TIMES = {
TWITTER: { hour: 9, minute: 0 },
INSTAGRAM: { hour: 11, minute: 0 },
LINKEDIN: { hour: 7, minute: 30 },
FACEBOOK: { hour: 13, minute: 0 },
};
# hootsuite/client.py
import os, requests, time
from dotenv import load_dotenv
load_dotenv()
class HootsuiteClient:
BASE = 'https://platform.hootsuite.com/v1'
def __init__(self):
self.token = os.environ['HOOTSUITE_ACCESS_TOKEN']
self.headers = {'Authorization': f'Bearer {self.token}', 'Content-Type': 'application/json'}
def get_profiles(self):
r = requests.get(f'{self.BASE}/socialProfiles', headers=self.headers)
r.raise_for_status()
return r.json()['data']
def schedule_message(self, profile_ids, text, scheduled_time):
r = requests.post(f'{self.BASE}/messages', headers=self.headers, json={
'text': text,
'socialProfileIds': profile_ids,
'scheduledSendTime': scheduled_time.isoformat(),
})
r.raise_for_status()
return r.json()['data']
function formatPost(text: string, platform: string): string {
const limits: Record<string, number> = {
TWITTER: 280, FACEBOOK: 63206, INSTAGRAM: 2200, LINKEDIN: 3000, TIKTOK: 2200,
};
const limit = limits[platform] || 2200;
return text.length > limit ? text.substring(0, limit - 3) + '...' : text;
}
Apply patterns in hootsuite-core-workflow-a for publishing.