Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a minimal working Hootsuite example. Use when starting a new Hootsuite integration, testing your setup, or learning basic Hootsuite API patterns. Trigger with phrases like "hootsuite hello world", "hootsuite example", "hootsuite quick start", "simple hootsuite code".
.claude/skills/jeremylongshore-hootsuite-hello-world/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-21 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-24 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-09 | ✓→✗ | ▼ Worse | 14% | 0% |
List your social media profiles and schedule a post using the Hootsuite REST API. The API base URL is https://platform.hootsuite.com/v1/.
hootsuite-install-auth setuptypescript// hello-hootsuite.ts import 'dotenv/config'; const TOKEN = process.env.HOOTSUITE_ACCESS_TOKEN!; const BASE = 'https://platform.hootsuite.com/v1'; async function listProfiles() { const response = await fetch(`${BASE}/socialProfiles`, { headers: { 'Authorization': `Bearer ${TOKEN}` }, }); const { data } = await response.json(); for (const profile of data) { console.log(`${profile.type}: @${profile.socialNetworkUsername} (ID: ${profile.id})`); } return data; } listProfiles().catch(console.error);
typescriptasync function schedulePost(socialProfileId: string, text: string, scheduledAt: Date) { const response = await fetch(`${BASE}/messages`, { method: 'POST', headers: { 'Authorization': `Bearer ${TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ text, socialProfileIds: [socialProfileId], scheduledSendTime: scheduledAt.toISOString(), emailNotification: false, }), }); const result = await response.json(); console.log('Scheduled message ID:', result.data[0]?.id); console.log('State:', result.data[0]?.state); console.log('Scheduled for:', result.data[0]?.scheduledSendTime); return result; } // Schedule a post 1 hour from now const profiles = await listProfiles(); if (profiles.length > 0) { const oneHourLater = new Date(Date.now() + 3600000); await schedulePost(profiles[0].id, 'Hello from the Hootsuite API!', oneHourLater); }
typescriptasync function listMessages() { const response = await fetch(`${BASE}/messages?state=SCHEDULED&limit=10`, { headers: { 'Authorization': `Bearer ${TOKEN}` }, }); const { data } = await response.json(); for (const msg of data) { console.log(`[${msg.state}] ${msg.text?.substring(0, 60)}... → ${msg.scheduledSendTime}`); } }
bash# List profiles curl -s -H "Authorization: Bearer $HOOTSUITE_ACCESS_TOKEN" \ https://platform.hootsuite.com/v1/socialProfiles | python3 -m json.tool # Get current user curl -s -H "Authorization: Bearer $HOOTSUITE_ACCESS_TOKEN" \ https://platform.hootsuite.com/v1/me | python3 -m json.tool
| Error | Cause | Solution | |-------|-------|----------| | 401 Unauthorized | Expired token | Refresh token via OAuth flow | | 403 Forbidden | Insufficient permissions | Check app scopes | | 422 Unprocessable | Invalid profile ID or past date | Verify profile ID and future date | | No profiles returned | No social accounts connected | Connect accounts in Hootsuite dashboard |
Proceed to hootsuite-local-dev-loop for development workflow.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 18,967 | 23,811 | +26% | 1 | 1 | 0% | 3,000 | 4,243 | +41% | 0 | 0 | — |
case-02 | fail→fail | 15,146 | 12,088 | -20% | 1 | 1 | 0% | 2,125 | 2,986 | +41% | 0 | 0 | — |
case-03 | fail→fail | 19,386 | 10,507 | -46% | 1 | 1 | 0% | 2,946 | 3,123 | +6% | 0 | 0 | — |
case-04 | fail→pass | 11,318 | 4,335 | -62% | 1 | 1 | 0% | 1,193 | 1,835 | +54% | 0 | 0 | — |
case-05 | fail→pass | 6,664 | 8,758 | +31% | 1 | 1 | 0% | 1,217 | 1,765 | +45% | 0 | 0 | — |
case-06 | pass→pass | 11,277 | 8,532 | -24% | 1 | 1 | 0% | 1,212 | 1,690 | +39% | 0 | 0 | — |
case-07 | pass→pass | 7,640 | 10,257 | +34% | 1 | 1 | 0% | 1,546 | 1,769 | +14% | 0 | 0 | — |
case-08 | fail→fail | 12,070 | 5,817 | -52% | 1 | 1 | 0% | 1,191 | 1,954 | +64% | 0 | 0 | — |
case-09 | pass→fail | 7,326 | 3,872 | -47% | 1 | 1 | 0% | 1,418 | 1,617 | +14% | 0 | 0 | — |
case-10 | pass→fail | 15,925 | 7,420 | -53% | 1 | 1 | 0% | 1,980 | 2,518 | +27% | 0 | 0 | — |
case-11 | pass→pass | 13,519 | 9,371 | -31% | 1 | 1 | 0% | 1,607 | 1,492 | -7% | 0 | 0 | — |
case-12 | pass→pass | 11,973 | 15,927 | +33% | 1 | 1 | 0% | 2,047 | 2,906 | +42% | 0 | 0 | — |
case-13 | pass→pass | 18,392 | 22,447 | +22% | 1 | 1 | 0% | 2,416 | 3,341 | +38% | 0 | 0 | — |
case-14 | pass→pass | 16,834 | 15,249 | -9% | 1 | 1 | 0% | 2,049 | 2,874 | +40% | 0 | 0 | — |
case-15 | pass→pass | 8,361 | 1,439 | -83% | 1 | 1 | 0% | 517 | 1,237 | +139% | 0 | 0 | — |
case-16 | pass→pass | 6,462 | 3,120 | -52% | 1 | 1 | 0% | 1,095 | 1,475 | +35% | 0 | 0 | — |
case-17 | pass→pass | 15,700 | 4,838 | -69% | 1 | 1 | 0% | 2,046 | 2,018 | -1% | 0 | 0 | — |
case-18 | pass→pass | 11,747 | 3,546 | -70% | 1 | 1 | 0% | 1,324 | 1,668 | +26% | 0 | 0 | — |
case-19 | pass→pass | 14,485 | 9,915 | -32% | 1 | 1 | 0% | 1,501 | 1,632 | +9% | 0 | 0 | — |
case-20 | pass→pass | 12,595 | 2,317 | -82% | 1 | 1 | 0% | 1,163 | 1,315 | +13% | 0 | 0 | — |
case-21 | fail→pass | 19,622 | 8,772 | -55% | 1 | 1 | 0% | 2,385 | 1,582 | -34% | 0 | 0 | — |
case-22 | pass→pass | 16,057 | 10,849 | -32% | 1 | 1 | 0% | 2,480 | 3,331 | +34% | 0 | 0 | — |
case-23 | pass→pass | 8,421 | 9,821 | +17% | 1 | 1 | 0% | 553 | 2,005 | +263% | 0 | 0 | — |
case-24 | fail→pass | 19,635 | 19,934 | +2% | 1 | 1 | 0% | 2,965 | 4,110 | +39% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +8 percentage points is the difference between those two pass rates over the 24 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.