Cara Menggunakan Hootsuite API

Ashley Innocent

Ashley Innocent

25 March 2026

Cara Menggunakan Hootsuite API

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

Inti Pembahasan

API Hootsuite memungkinkan pengembang untuk berintegrasi dengan alur kerja manajemen media sosial secara terprogram. Ini menggunakan autentikasi OAuth 2.0, endpoint RESTful untuk profil, postingan, analitik, dan manajemen tim, dengan batas tingkat permintaan (rate limit) 50-200 permintaan per menit tergantung pada paket. Panduan ini mencakup pengaturan autentikasi, penjadwalan postingan, pengambilan analitik, manajemen tim, dan strategi integrasi produksi.

Catatan: Hootsuite telah menghentikan dukungan API publik mereka mulai tahun 2024. Panduan ini mencakup pendekatan alternatif termasuk integrasi mitra Hootsuite, webhook, dan API manajemen media sosial pihak ketiga yang menyediakan fungsionalitas serupa.

Pengantar

Hootsuite mengelola lebih dari 30 juta akun media sosial untuk 200.000+ bisnis di 175+ negara. Bagi pengembang yang membuat alat media sosial, platform pemasaran, atau dasbor analitik, integrasi API media sosial sangat penting untuk menjangkau audiens bisnis yang besar ini.

Inilah kenyataannya: manajer media sosial yang menangani 20+ akun kehilangan 25-35 jam setiap minggu untuk postingan manual, pelacakan keterlibatan, dan pembuatan laporan. Integrasi API media sosial yang solid mengotomatiskan distribusi konten, pemantauan keterlibatan, analisis sentimen, dan pelaporan kinerja.

tombol

Status API Hootsuite dan Alternatifnya

Situasi API Saat Ini

Mulai tahun 2024, Hootsuite telah menghentikan dukungan API publik mereka. Pilihan untuk integrasi:

Pendekatan Deskripsi Terbaik Untuk
API Platform Asli Integrasi langsung dengan Facebook, Twitter, LinkedIn, dll. Kontrol penuh, solusi kustom
Audiense Intelijen audiens milik Hootsuite Analisis audiens
HeyOrca API penjadwalan media sosial Kalender konten
Buffer API Manajemen media sosial Tim kecil
Sprout Social API Manajemen sosial perusahaan Organisasi besar
Agorapulse API CRM media sosial Manajemen komunitas

Pendekatan yang Direkomendasikan: API Platform Asli

Untuk sebagian besar kasus penggunaan, integrasi langsung dengan platform sosial memberikan fleksibilitas paling tinggi:

Platform Nama API Fitur Utama
Facebook/Instagram Graph API Posting, wawasan, komentar
Twitter/X API v2 Tweet, analitik, stream
LinkedIn Marketing API Posting, halaman perusahaan, iklan
Pinterest API v5 Pin, papan, analitik
TikTok Display API Video, info pengguna
YouTube Data API Video, daftar putar, analitik

Memulai: Autentikasi Multi-Platform

Langkah 1: Daftarkan Aplikasi Pengembang

Buat akun pengembang untuk setiap platform:

// Simpan kredensial dengan aman
const SOCIAL_CREDENTIALS = {
  facebook: {
    appId: process.env.FB_APP_ID,
    appSecret: process.env.FB_APP_SECRET,
    redirectUri: process.env.FB_REDIRECT_URI
  },
  twitter: {
    apiKey: process.env.TWITTER_API_KEY,
    apiSecret: process.env.TWITTER_API_SECRET,
    redirectUri: process.env.TWITTER_REDIRECT_URI
  },
  linkedin: {
    clientId: process.env.LINKEDIN_CLIENT_ID,
    clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
    redirectUri: process.env.LINKEDIN_REDIRECT_URI
  },
  instagram: {
    appId: process.env.FB_APP_ID, // Uses Facebook Login
    appSecret: process.env.FB_APP_SECRET
  }
};

Langkah 2: Implementasikan Alur OAuth 2.0

Penanganan OAuth terpadu untuk berbagai platform:

const getAuthUrl = (platform, state) => {
  const configs = {
    facebook: {
      url: 'https://www.facebook.com/v18.0/dialog/oauth',
      params: {
        client_id: SOCIAL_CREDENTIALS.facebook.appId,
        redirect_uri: SOCIAL_CREDENTIALS.facebook.redirectUri,
        scope: 'pages_manage_posts,pages_read_engagement,instagram_basic,instagram_content_publish',
        state
      }
    },
    twitter: {
      url: 'https://twitter.com/i/oauth2/authorize',
      params: {
        client_id: SOCIAL_CREDENTIALS.twitter.apiKey,
        redirect_uri: SOCIAL_CREDENTIALS.twitter.redirectUri,
        scope: 'tweet.read tweet.write users.read offline.access',
        state,
        response_type: 'code'
      }
    },
    linkedin: {
      url: 'https://www.linkedin.com/oauth/v2/authorization',
      params: {
        client_id: SOCIAL_CREDENTIALS.linkedin.clientId,
        redirect_uri: SOCIAL_CREDENTIALS.linkedin.redirectUri,
        scope: 'w_member_social r_basicprofile',
        state,
        response_type: 'code'
      }
    }
  };

  const config = configs[platform];
  const params = new URLSearchParams(config.params);
  return `${config.url}?${params.toString()}`;
};

// Tangani callback OAuth
const handleOAuthCallback = async (platform, code) => {
  const tokenEndpoints = {
    facebook: 'https://graph.facebook.com/v18.0/oauth/access_token',
    twitter: 'https://api.twitter.com/2/oauth2/token',
    linkedin: 'https://www.linkedin.com/oauth/v2/accessToken'
  };

  const response = await fetch(tokenEndpoints[platform], {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: new URLSearchParams({
      client_id: SOCIAL_CREDENTIALS[platform].apiKey || SOCIAL_CREDENTIALS[platform].appId || SOCIAL_CREDENTIALS[platform].clientId,
      client_secret: SOCIAL_CREDENTIALS[platform].appSecret || SOCIAL_CREDENTIALS[platform].apiSecret,
      redirect_uri: SOCIAL_CREDENTIALS[platform].redirectUri,
      code,
      grant_type: 'authorization_code'
    })
  });

  return response.json();
};

Langkah 3: Simpan Token dengan Aman

// Skema database untuk token sosial
const SocialToken = {
  userId: 'user_123',
  platform: 'facebook',
  accessToken: 'encrypted_token_here',
  refreshToken: 'encrypted_refresh_token',
  tokenExpiry: Date.now() + 5183999, // 60 days
  scopes: ['pages_manage_posts', 'pages_read_engagement'],
  pageId: 'page_456', // Untuk Facebook/Instagram
  pageName: 'My Business Page'
};

Penjadwalan dan Penerbitan Postingan

Membuat Postingan Multi-Platform

Publikasikan ke berbagai platform secara bersamaan:

const createSocialPost = async (postData) => {
  const results = {};

  // Postingan Halaman Facebook
  if (postData.platforms.includes('facebook')) {
    results.facebook = await postToFacebook({
      pageId: postData.facebookPageId,
      message: postData.message,
      link: postData.link,
      photo: postData.photo
    });
  }

  // Postingan Twitter
  if (postData.platforms.includes('twitter')) {
    results.twitter = await postToTwitter({
      text: postData.message,
      media: postData.photo
    });
  }

  // Postingan LinkedIn
  if (postData.platforms.includes('linkedin')) {
    results.linkedin = await postToLinkedIn({
      authorUrn: postData.linkedinAuthorUrn,
      text: postData.message,
      contentUrl: postData.link
    });
  }

  // Postingan Instagram
  if (postData.platforms.includes('instagram')) {
    results.instagram = await postToInstagram({
      igAccountId: postData.igAccountId,
      imageUrl: postData.photo,
      caption: postData.message
    });
  }

  return results;
};

// Posting ke Facebook
const postToFacebook = async (postData) => {
  const token = await getFacebookPageToken(postData.pageId);

  const params = new URLSearchParams({
    message: postData.message,
    access_token: token
  });

  if (postData.link) {
    params.append('link', postData.link);
  }

  if (postData.photo) {
    params.append('photo', postData.photo);
  }

  const response = await fetch(
    `https://graph.facebook.com/v18.0/${postData.pageId}/feed?${params.toString()}`,
    { method: 'POST' }
  );

  return response.json();
};

// Posting ke Twitter
const postToTwitter = async (postData) => {
  const token = await getTwitterToken();

  let mediaIds = [];
  if (postData.media) {
    // Unggah media terlebih dahulu
    const mediaUpload = await uploadTwitterMedia(postData.media, token);
    mediaIds = [mediaUpload.media_id_string];
  }

  const response = await fetch('https://api.twitter.com/2/tweets', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      text: postData.text,
      media: mediaIds.length > 0 ? { media_ids: mediaIds } : undefined
    })
  });

  return response.json();
};

// Posting ke LinkedIn
const postToLinkedIn = async (postData) => {
  const token = await getLinkedInToken();

  const post = {
    author: postData.authorUrn,
    lifecycleState: 'PUBLISHED',
    specificContent: {
      'com.linkedin.ugc.ShareContent': {
        shareCommentary: {
          text: postData.text
        },
        shareMediaCategory: postData.contentUrl ? 'ARTICLE' : 'NONE',
        media: postData.contentUrl ? [{
          status: 'READY',
          media: postData.contentUrn,
          description: { text: postData.text }
        }] : []
      }
    },
    visibility: {
      'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'
    }
  };

  const response = await fetch('https://api.linkedin.com/v2/ugcPosts', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json',
      'X-Restli-Protocol-Version': '2.0.0'
    },
    body: JSON.stringify(post)
  });

  return response.json();
};

// Posting ke Instagram
const postToInstagram = async (postData) => {
  const token = await getInstagramToken();

  // Langkah 1: Buat kontainer media
  const containerResponse = await fetch(
    `https://graph.facebook.com/v18.0/${postData.igAccountId}/media`,
    {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${token}` },
      body: JSON.stringify({
        image_url: postData.imageUrl,
        caption: postData.caption
      })
    }
  );

  const container = await containerResponse.json();

  // Langkah 2: Publikasikan
  const publishResponse = await fetch(
    `https://graph.facebook.com/v18.0/${postData.igAccountId}/media_publish`,
    {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${token}` },
      body: JSON.stringify({ creation_id: container.id })
    }
  );

  return publishResponse.json();
};

Menjadwalkan Postingan

Implementasikan penjadwalan postingan:

const schedulePost = async (postData, scheduledTime) => {
  // Simpan di database untuk eksekusi nanti
  const scheduledPost = await db.scheduledPosts.create({
    message: postData.message,
    platforms: postData.platforms,
    scheduledTime: scheduledTime,
    status: 'pending',
    media: postData.media,
    link: postData.link
  });

  // Siapkan antrean tugas
  await jobQueue.add('publish-social-post', {
    postId: scheduledPost.id
  }, {
    delay: scheduledTime - Date.now()
  });

  return scheduledPost;
};

// Pemroses tugas
jobQueue.process('publish-social-post', async (job) => {
  const post = await db.scheduledPosts.findById(job.data.postId);

  try {
    const result = await createSocialPost(post);

    await db.scheduledPosts.update(post.id, {
      status: 'published',
      publishedAt: new Date(),
      results: result
    });

    return result;
  } catch (error) {
    await db.scheduledPosts.update(post.id, {
      status: 'failed',
      error: error.message
    });

    throw error;
  }
});

Analitik dan Pelaporan

Mengambil Analitik Lintas-Platform

Agregasi metrik dari semua platform:

const getSocialAnalytics = async (accountId, dateRange) => {
  const analytics = {
    facebook: await getFacebookAnalytics(accountId.facebook, dateRange),
    twitter: await getTwitterAnalytics(accountId.twitter, dateRange),
    linkedin: await getLinkedInAnalytics(accountId.linkedin, dateRange),
    instagram: await getInstagramAnalytics(accountId.instagram, dateRange)
  };

  // Agregasi metrik
  const totals = {
    impressions: sum(analytics, 'impressions'),
    engagement: sum(analytics, 'engagement'),
    clicks: sum(analytics, 'clicks'),
    shares: sum(analytics, 'shares'),
    comments: sum(analytics, 'comments'),
    newFollowers: sum(analytics, 'newFollowers')
  };

  return { analytics, totals };
};

// Wawasan Facebook
const getFacebookAnalytics = async (pageId, dateRange) => {
  const token = await getFacebookPageToken(pageId);

  const metrics = [
    'page_impressions_unique',
    'page_engaged_users',
    'page_post_engagements',
    'page_clicks',
    'page_fan_adds'
  ];

  const params = new URLSearchParams({
    metric: metrics.join(','),
    since: dateRange.from,
    until: dateRange.until,
    access_token: token
  });

  const response = await fetch(
    `https://graph.facebook.com/v18.0/${pageId}/insights?${params.toString()}`
  );

  return response.json();
};

// Analitik Twitter
const getTwitterAnalytics = async (userId, dateRange) => {
  const token = await getTwitterToken();

  const response = await fetch(
    `https://api.twitter.com/2/users/${userId}/metrics/private`,
    {
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return response.json();
};

// Analitik LinkedIn
const getLinkedInAnalytics = async (organizationId, dateRange) => {
  const token = await getLinkedInToken();

  const response = await fetch(
    `https://api.linkedin.com/v2/organizationalEntityFollowerStatistics?q=organizationalEntity&organizationalEntity=${organizationId}`,
    {
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return response.json();
};

// Wawasan Instagram
const getInstagramAnalytics = async (igAccountId, dateRange) => {
  const token = await getInstagramToken();

  const metrics = [
    'impressions',
    'reach',
    'engagement',
    'profile_views',
    'follower_count'
  ];

  const params = new URLSearchParams({
    metric: metrics.join(','),
    period: 'day',
    since: dateRange.from,
    until: dateRange.until
  });

  const response = await fetch(
    `https://graph.facebook.com/v18.0/${igAccountId}/insights?${params.toString()}`,
    {
      headers: { 'Authorization': `Bearer ${token}` }
    }
  );

  return response.json();
};

function sum(analytics, metric) {
  return Object.values(analytics).reduce((total, platform) => {
    return total + (platform.data?.[metric] || 0);
  }, 0);
}

Manajemen Tim

Kontrol Akses Berbasis Peran

const TEAM_ROLES = {
  ADMIN: 'admin',
  MANAGER: 'manager',
  CONTRIBUTOR: 'contributor',
  VIEWER: 'viewer'
};

const ROLE_PERMISSIONS = {
  [TEAM_ROLES.ADMIN]: ['create', 'read', 'update', 'delete', 'manage_team', 'billing'],
  [TEAM_ROLES.MANAGER]: ['create', 'read', 'update', 'approve_posts'],
  [TEAM_ROLES.CONTRIBUTOR]: ['create', 'read'],
  [TEAM_ROLES.VIEWER]: ['read']
};

const checkPermission = (userRole, requiredPermission) => {
  const permissions = ROLE_PERMISSIONS[userRole] || [];
  return permissions.includes(requiredPermission);
};

Pembatasan Tingkat Permintaan (Rate Limiting)

Pembatasan Tingkat Permintaan Platform

Platform Batas Jendela Waktu
Facebook Graph 200 panggilan Per jam per pengguna
Twitter API v2 300 tweet Per 15 menit
LinkedIn 100-500 panggilan Per hari
Instagram 200 panggilan Per jam

Mengimplementasikan Penanganan Pembatasan Tingkat Permintaan

class SocialMediaRateLimiter {
  constructor() {
    this.limits = {
      facebook: { limit: 200, window: 3600000 },
      twitter: { limit: 300, window: 900000 },
      linkedin: { limit: 500, window: 86400000 },
      instagram: { limit: 200, window: 3600000 }
    };
    this.counters = {};
  }

  async request(platform, endpoint, options) {
    await this.waitForCapacity(platform);

    const response = await fetch(endpoint, options);
    this.incrementCounter(platform);

    return response;
  }

  async waitForCapacity(platform) {
    const limit = this.limits[platform];
    const counter = this.counters[platform] || { count: 0, resetTime: Date.now() };

    if (Date.now() > counter.resetTime + limit.window) {
      counter.count = 0;
      counter.resetTime = Date.now();
    }

    if (counter.count >= limit.limit) {
      const waitTime = counter.resetTime + limit.window - Date.now();
      await new Promise(resolve => setTimeout(resolve, waitTime));
    }

    this.counters[platform] = counter;
  }

  incrementCounter(platform) {
    if (!this.counters[platform]) {
      this.counters[platform] = { count: 0, resetTime: Date.now() };
    }
    this.counters[platform].count++;
  }
}

Daftar Periksa Penerapan Produksi

Sebelum tayang (go live):

Kasus Penggunaan Dunia Nyata

Dasbor Media Sosial

Sebuah agensi pemasaran membangun dasbor terpadu:

Distribusi Konten Otomatis

Seorang penerbit mengotomatiskan berbagi artikel:

Kesimpulan

Meskipun API publik Hootsuite telah dihentikan, API platform asli menyediakan kemampuan manajemen media sosial yang komprehensif. Poin-poin penting:

tombol

Bagian FAQ

Apakah Hootsuite masih memiliki API?

Hootsuite menghentikan dukungan API publik mereka pada tahun 2024. Gunakan API platform asli atau platform manajemen alternatif seperti Buffer, Sprout Social, atau Agorapulse.

Bagaimana cara saya memposting ke banyak platform sekaligus?

Implementasikan OAuth untuk setiap platform dan buat fungsi posting terpadu yang memanggil API setiap platform secara paralel.

Berapa batas tingkat permintaan untuk API media sosial?

Batas bervariasi: Facebook (200/jam), Twitter (300/15menit), LinkedIn (100-500/hari), Instagram (200/jam).

Bagaimana cara menjadwalkan postingan?

Simpan postingan di database dengan `scheduled_time`, lalu gunakan antrean tugas (job queue) (Bull, Agenda) untuk memublikasikannya pada waktu yang dijadwalkan.

Bisakah saya mendapatkan analitik dari semua platform?

Ya, setiap platform menyediakan API analitik. Agregasikan data untuk pelaporan lintas-platform.

Mengembangkan API dengan Apidog

Apidog adalah alat pengembangan API yang membantu Anda mengembangkan API dengan lebih mudah dan efisien.